Merge staging-next into staging
This commit is contained in:
commit
73b88e17dd
@ -95,7 +95,7 @@ $ nix-build
|
|||||||
|
|
||||||
The Android SDK gets deployed with all desired plugin versions.
|
The Android SDK gets deployed with all desired plugin versions.
|
||||||
|
|
||||||
We can also deploy subsets of the Android SDK. For example, to only the the
|
We can also deploy subsets of the Android SDK. For example, to only the
|
||||||
`platform-tools` package, you can evaluate the following expression:
|
`platform-tools` package, you can evaluate the following expression:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: iOS
|
title: iOS
|
||||||
author: Sander van der Burg
|
author: Sander van der Burg
|
||||||
date: 2018-11-18
|
date: 2019-11-10
|
||||||
---
|
---
|
||||||
# iOS
|
# iOS
|
||||||
|
|
||||||
@ -217,3 +217,13 @@ xcode.simulateApp {
|
|||||||
|
|
||||||
By providing the result of an `xcode.buildApp {}` function and configuring the
|
By providing the result of an `xcode.buildApp {}` function and configuring the
|
||||||
app bundle id, the app gets deployed automatically and started.
|
app bundle id, the app gets deployed automatically and started.
|
||||||
|
|
||||||
|
Troubleshooting
|
||||||
|
---------------
|
||||||
|
In some rare cases, it may happen that after a failure, changes are not picked
|
||||||
|
up. Most likely, this is caused by a derived data cache that Xcode maintains.
|
||||||
|
To wipe it you can run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rm -rf ~/Library/Developer/Xcode/DerivedData
|
||||||
|
```
|
||||||
|
@ -203,7 +203,7 @@ argument and returns a set that contains all attribute that should be
|
|||||||
overwritten.
|
overwritten.
|
||||||
|
|
||||||
For more complicated cases, such as when parts of the crate's
|
For more complicated cases, such as when parts of the crate's
|
||||||
derivation depend on the the crate's version, the `attrs` argument of
|
derivation depend on the crate's version, the `attrs` argument of
|
||||||
the override above can be read, as in the following example, which
|
the override above can be read, as in the following example, which
|
||||||
patches the derivation:
|
patches the derivation:
|
||||||
|
|
||||||
|
@ -348,12 +348,12 @@ nix-build '<nixpkgs>' --arg crossSystem '{ config = "<arch>-<os&g
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</orderedlist>
|
</orderedlist>
|
||||||
In each stage, <varname>pkgsBuildHost</varname> refers the the previous stage, <varname>pkgsBuildBuild</varname> refers to the one before that, and <varname>pkgsHostTarget</varname> refers to the current one, and <varname>pkgsTargetTarget</varname> refers to the next one. When there is no previous or next stage, they instead refer to the current stage. Note how all the invariants regarding the mapping between dependency and depending packages' build host and target platforms are preserved. <varname>pkgsBuildTarget</varname> and <varname>pkgsHostHost</varname> are more complex in that the stage fitting the requirements isn't always a fixed chain of "prevs" and "nexts" away (modulo the "saturating" self-references at the ends). We just special case each instead. All the primary edges are implemented is in <filename>pkgs/stdenv/booter.nix</filename>, and secondarily aliases in <filename>pkgs/top-level/stage.nix</filename>.
|
In each stage, <varname>pkgsBuildHost</varname> refers to the previous stage, <varname>pkgsBuildBuild</varname> refers to the one before that, and <varname>pkgsHostTarget</varname> refers to the current one, and <varname>pkgsTargetTarget</varname> refers to the next one. When there is no previous or next stage, they instead refer to the current stage. Note how all the invariants regarding the mapping between dependency and depending packages' build host and target platforms are preserved. <varname>pkgsBuildTarget</varname> and <varname>pkgsHostHost</varname> are more complex in that the stage fitting the requirements isn't always a fixed chain of "prevs" and "nexts" away (modulo the "saturating" self-references at the ends). We just special case each instead. All the primary edges are implemented is in <filename>pkgs/stdenv/booter.nix</filename>, and secondarily aliases in <filename>pkgs/top-level/stage.nix</filename>.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<para>
|
<para>
|
||||||
Note the native stages are bootstrapped in legacy ways that predate the current cross implementation. This is why the the bootstrapping stages leading up to the final stages are ignored inthe previous paragraph.
|
Note the native stages are bootstrapped in legacy ways that predate the current cross implementation. This is why the bootstrapping stages leading up to the final stages are ignored inthe previous paragraph.
|
||||||
</para>
|
</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@
|
|||||||
<programlisting>
|
<programlisting>
|
||||||
{
|
{
|
||||||
allowUnfreePredicate = (pkg: builtins.elem
|
allowUnfreePredicate = (pkg: builtins.elem
|
||||||
(builtins.parseDrvName pkg.name).name [
|
(pkg.pname or (builtins.parseDrvName pkg.name).name) [
|
||||||
"flashplayer"
|
"flashplayer"
|
||||||
"vscode"
|
"vscode"
|
||||||
]);
|
]);
|
||||||
|
@ -189,6 +189,12 @@
|
|||||||
githubId = 1250775;
|
githubId = 1250775;
|
||||||
name = "Adolfo E. García Castro";
|
name = "Adolfo E. García Castro";
|
||||||
};
|
};
|
||||||
|
adsr = {
|
||||||
|
email = "as@php.net";
|
||||||
|
github = "adsr";
|
||||||
|
githubId = 315003;
|
||||||
|
name = "Adam Saponara";
|
||||||
|
};
|
||||||
aepsil0n = {
|
aepsil0n = {
|
||||||
email = "eduard.bopp@aepsil0n.de";
|
email = "eduard.bopp@aepsil0n.de";
|
||||||
github = "aepsil0n";
|
github = "aepsil0n";
|
||||||
@ -563,6 +569,12 @@
|
|||||||
githubId = 718812;
|
githubId = 718812;
|
||||||
name = "Antoine R. Dumont";
|
name = "Antoine R. Dumont";
|
||||||
};
|
};
|
||||||
|
arianvp = {
|
||||||
|
email = "arian.vanputten@gmail.com";
|
||||||
|
github = "arianvp";
|
||||||
|
githubId = 628387;
|
||||||
|
name = "Arian van Putten";
|
||||||
|
};
|
||||||
aristid = {
|
aristid = {
|
||||||
email = "aristidb@gmail.com";
|
email = "aristidb@gmail.com";
|
||||||
github = "aristidb";
|
github = "aristidb";
|
||||||
@ -1389,6 +1401,12 @@
|
|||||||
githubId = 411324;
|
githubId = 411324;
|
||||||
name = "Carles Pagès";
|
name = "Carles Pagès";
|
||||||
};
|
};
|
||||||
|
craigem = {
|
||||||
|
email = "craige@mcwhirter.io";
|
||||||
|
github = "craigem";
|
||||||
|
githubId = "6470493";
|
||||||
|
name = "Craige McWhirter";
|
||||||
|
};
|
||||||
cransom = {
|
cransom = {
|
||||||
email = "cransom@hubns.net";
|
email = "cransom@hubns.net";
|
||||||
github = "cransom";
|
github = "cransom";
|
||||||
@ -2245,6 +2263,16 @@
|
|||||||
githubId = 8182846;
|
githubId = 8182846;
|
||||||
name = "Francesco Gazzetta";
|
name = "Francesco Gazzetta";
|
||||||
};
|
};
|
||||||
|
filalex77 = {
|
||||||
|
email = "brightone@protonmail.com";
|
||||||
|
github = "filalex77";
|
||||||
|
githubId = 12615679;
|
||||||
|
name = "Oleksii Filonenko";
|
||||||
|
keys = [{
|
||||||
|
longkeyid = "rsa3072/0xA1BC8428323ECFE8";
|
||||||
|
fingerprint = "F549 3B7F 9372 5578 FDD3 D0B8 A1BC 8428 323E CFE8";
|
||||||
|
}];
|
||||||
|
};
|
||||||
FireyFly = {
|
FireyFly = {
|
||||||
email = "nix@firefly.nu";
|
email = "nix@firefly.nu";
|
||||||
github = "FireyFly";
|
github = "FireyFly";
|
||||||
@ -3110,6 +3138,11 @@
|
|||||||
githubId = 184898;
|
githubId = 184898;
|
||||||
name = "Jirka Marsik";
|
name = "Jirka Marsik";
|
||||||
};
|
};
|
||||||
|
jitwit = {
|
||||||
|
email = "jrn@bluefarm.ca";
|
||||||
|
github = "jitwit";
|
||||||
|
name = "jitwit";
|
||||||
|
};
|
||||||
jlesquembre = {
|
jlesquembre = {
|
||||||
email = "jl@lafuente.me";
|
email = "jl@lafuente.me";
|
||||||
github = "jlesquembre";
|
github = "jlesquembre";
|
||||||
@ -6491,6 +6524,12 @@
|
|||||||
githubId = 506181;
|
githubId = 506181;
|
||||||
name = "Peter Marheine";
|
name = "Peter Marheine";
|
||||||
};
|
};
|
||||||
|
tasmo = {
|
||||||
|
email = "tasmo@tasmo.de";
|
||||||
|
github = "tasmo";
|
||||||
|
githubId = 102685;
|
||||||
|
name = "Thomas Friese";
|
||||||
|
};
|
||||||
tavyc = {
|
tavyc = {
|
||||||
email = "octavian.cerna@gmail.com";
|
email = "octavian.cerna@gmail.com";
|
||||||
github = "tavyc";
|
github = "tavyc";
|
||||||
@ -6677,6 +6716,16 @@
|
|||||||
githubId = 13026;
|
githubId = 13026;
|
||||||
name = "Jonathan Rudenberg";
|
name = "Jonathan Rudenberg";
|
||||||
};
|
};
|
||||||
|
tkerber = {
|
||||||
|
email = "tk@drwx.org";
|
||||||
|
github = "tkerber";
|
||||||
|
githubId = 5722198;
|
||||||
|
name = "Thomas Kerber";
|
||||||
|
keys = [ {
|
||||||
|
longkeyid = "rsa4096/0x8489B911F9ED617B";
|
||||||
|
fingerprint = "556A 403F B0A2 D423 F656 3424 8489 B911 F9ED 617B";
|
||||||
|
} ];
|
||||||
|
};
|
||||||
tmplt = {
|
tmplt = {
|
||||||
email = "tmplt@dragons.rocks";
|
email = "tmplt@dragons.rocks";
|
||||||
github = "tmplt";
|
github = "tmplt";
|
||||||
@ -6760,6 +6809,12 @@
|
|||||||
githubId = 1312290;
|
githubId = 1312290;
|
||||||
name = "Trevor Joynson";
|
name = "Trevor Joynson";
|
||||||
};
|
};
|
||||||
|
tricktron = {
|
||||||
|
email = "tgagnaux@gmail.com";
|
||||||
|
github = "tricktron";
|
||||||
|
githubId = 16036882;
|
||||||
|
name = "Thibault Gagnaux";
|
||||||
|
};
|
||||||
trino = {
|
trino = {
|
||||||
email = "muehlhans.hubert@ekodia.de";
|
email = "muehlhans.hubert@ekodia.de";
|
||||||
github = "hmuehlhans";
|
github = "hmuehlhans";
|
||||||
@ -7314,14 +7369,24 @@
|
|||||||
githubId = 1866448;
|
githubId = 1866448;
|
||||||
name = "Eric Bailey";
|
name = "Eric Bailey";
|
||||||
};
|
};
|
||||||
|
Yumasi = {
|
||||||
|
email = "gpagnoux@gmail.com";
|
||||||
|
github = "Yumasi";
|
||||||
|
githubId = 24368641;
|
||||||
|
name = "Guillaume Pagnoux";
|
||||||
|
keys = [{
|
||||||
|
longkeyid = "rsa4096/0xEC5065899AEAAF4C";
|
||||||
|
fingerprint = "85F8 E850 F8F2 F823 F934 535B EC50 6589 9AEA AF4C";
|
||||||
|
}];
|
||||||
|
};
|
||||||
yvt = {
|
yvt = {
|
||||||
email = "i@yvt.jp";
|
email = "i@yvt.jp";
|
||||||
github = "yvt";
|
github = "yvt";
|
||||||
githubId = 5253988;
|
githubId = 5253988;
|
||||||
name = "yvt";
|
name = "yvt";
|
||||||
};
|
};
|
||||||
z77z = {
|
maggesi = {
|
||||||
email = "maggesi@math.unifi.it";
|
email = "marco.maggesi@gmail.com";
|
||||||
github = "maggesi";
|
github = "maggesi";
|
||||||
githubId = 1809783;
|
githubId = 1809783;
|
||||||
name = "Marco Maggesi";
|
name = "Marco Maggesi";
|
||||||
@ -7365,6 +7430,12 @@
|
|||||||
email = "zef@zef.me";
|
email = "zef@zef.me";
|
||||||
name = "Zef Hemel";
|
name = "Zef Hemel";
|
||||||
};
|
};
|
||||||
|
zfnmxt = {
|
||||||
|
name = "zfnmxt";
|
||||||
|
email = "zfnmxt@zfnmxt.com";
|
||||||
|
github = "zfnmxt";
|
||||||
|
githubId = 37446532;
|
||||||
|
};
|
||||||
zgrannan = {
|
zgrannan = {
|
||||||
email = "zgrannan@gmail.com";
|
email = "zgrannan@gmail.com";
|
||||||
github = "zgrannan";
|
github = "zgrannan";
|
||||||
|
@ -47,6 +47,11 @@
|
|||||||
acceleration
|
acceleration
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Click on Settings / Display / Screen and select VBoxVGA as Graphics Controller
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Save the settings, start the virtual machine, and continue installation
|
Save the settings, start the virtual machine, and continue installation
|
||||||
|
@ -494,6 +494,20 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<option>--use-remote-sudo</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
When set, nixos-rebuild prefixes remote commands that run on
|
||||||
|
the <option>--build-host</option> and <option>--target-host</option>
|
||||||
|
systems with <command>sudo</command>. Setting this option allows
|
||||||
|
deploying as a non-root user.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -4,7 +4,9 @@ from contextlib import contextmanager
|
|||||||
from xml.sax.saxutils import XMLGenerator
|
from xml.sax.saxutils import XMLGenerator
|
||||||
import _thread
|
import _thread
|
||||||
import atexit
|
import atexit
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
|
import ptpython.repl
|
||||||
import pty
|
import pty
|
||||||
import queue
|
import queue
|
||||||
import re
|
import re
|
||||||
@ -15,7 +17,6 @@ import sys
|
|||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
import unicodedata
|
import unicodedata
|
||||||
import ptpython.repl
|
|
||||||
|
|
||||||
CHAR_TO_KEY = {
|
CHAR_TO_KEY = {
|
||||||
"A": "shift-a",
|
"A": "shift-a",
|
||||||
@ -305,7 +306,7 @@ class Machine:
|
|||||||
if state == "inactive":
|
if state == "inactive":
|
||||||
status, jobs = self.systemctl("list-jobs --full 2>&1", user)
|
status, jobs = self.systemctl("list-jobs --full 2>&1", user)
|
||||||
if "No jobs" in jobs:
|
if "No jobs" in jobs:
|
||||||
info = self.get_unit_info(unit)
|
info = self.get_unit_info(unit, user)
|
||||||
if info["ActiveState"] == state:
|
if info["ActiveState"] == state:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
(
|
(
|
||||||
@ -318,7 +319,11 @@ class Machine:
|
|||||||
def get_unit_info(self, unit, user=None):
|
def get_unit_info(self, unit, user=None):
|
||||||
status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user)
|
status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user)
|
||||||
if status != 0:
|
if status != 0:
|
||||||
return None
|
raise Exception(
|
||||||
|
'retrieving systemctl info for unit "{}" {} failed with exit code {}'.format(
|
||||||
|
unit, "" if user is None else 'under user "{}"'.format(user), status
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
line_pattern = re.compile(r"^([^=]+)=(.*)$")
|
line_pattern = re.compile(r"^([^=]+)=(.*)$")
|
||||||
|
|
||||||
@ -344,6 +349,18 @@ class Machine:
|
|||||||
)
|
)
|
||||||
return self.execute("systemctl {}".format(q))
|
return self.execute("systemctl {}".format(q))
|
||||||
|
|
||||||
|
def require_unit_state(self, unit, require_state="active"):
|
||||||
|
with self.nested(
|
||||||
|
"checking if unit ‘{}’ has reached state '{}'".format(unit, require_state)
|
||||||
|
):
|
||||||
|
info = self.get_unit_info(unit)
|
||||||
|
state = info["ActiveState"]
|
||||||
|
if state != require_state:
|
||||||
|
raise Exception(
|
||||||
|
"Expected unit ‘{}’ to to be in state ".format(unit)
|
||||||
|
+ "'active' but it is in state ‘{}’".format(state)
|
||||||
|
)
|
||||||
|
|
||||||
def execute(self, command):
|
def execute(self, command):
|
||||||
self.connect()
|
self.connect()
|
||||||
|
|
||||||
@ -494,6 +511,11 @@ class Machine:
|
|||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
raise Exception("Cannot convert screenshot")
|
raise Exception("Cannot convert screenshot")
|
||||||
|
|
||||||
|
def dump_tty_contents(self, tty):
|
||||||
|
"""Debugging: Dump the contents of the TTY<n>
|
||||||
|
"""
|
||||||
|
self.execute("fold -w 80 /dev/vcs{} | systemd-cat".format(tty))
|
||||||
|
|
||||||
def get_screen_text(self):
|
def get_screen_text(self):
|
||||||
if shutil.which("tesseract") is None:
|
if shutil.which("tesseract") is None:
|
||||||
raise Exception("get_screen_text used but enableOCR is false")
|
raise Exception("get_screen_text used but enableOCR is false")
|
||||||
@ -588,7 +610,7 @@ class Machine:
|
|||||||
stdin=subprocess.DEVNULL,
|
stdin=subprocess.DEVNULL,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
shell=False,
|
shell=True,
|
||||||
cwd=self.state_dir,
|
cwd=self.state_dir,
|
||||||
env=environment,
|
env=environment,
|
||||||
)
|
)
|
||||||
@ -597,7 +619,7 @@ class Machine:
|
|||||||
|
|
||||||
def process_serial_output():
|
def process_serial_output():
|
||||||
for line in self.process.stdout:
|
for line in self.process.stdout:
|
||||||
line = line.decode().replace("\r", "").rstrip()
|
line = line.decode("unicode_escape").replace("\r", "").rstrip()
|
||||||
eprint("{} # {}".format(self.name, line))
|
eprint("{} # {}".format(self.name, line))
|
||||||
self.logger.enqueue({"msg": line, "machine": self.name})
|
self.logger.enqueue({"msg": line, "machine": self.name})
|
||||||
|
|
||||||
@ -611,14 +633,14 @@ class Machine:
|
|||||||
self.log("QEMU running (pid {})".format(self.pid))
|
self.log("QEMU running (pid {})".format(self.pid))
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
if self.booted:
|
if not self.booted:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.shell.send("poweroff\n".encode())
|
self.shell.send("poweroff\n".encode())
|
||||||
self.wait_for_shutdown()
|
self.wait_for_shutdown()
|
||||||
|
|
||||||
def crash(self):
|
def crash(self):
|
||||||
if self.booted:
|
if not self.booted:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.log("forced crash")
|
self.log("forced crash")
|
||||||
@ -642,9 +664,38 @@ class Machine:
|
|||||||
if status == 0:
|
if status == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def get_window_names(self):
|
||||||
|
return self.succeed(
|
||||||
|
r"xwininfo -root -tree | sed 's/.*0x[0-9a-f]* \"\([^\"]*\)\".*/\1/; t; d'"
|
||||||
|
).splitlines()
|
||||||
|
|
||||||
|
def wait_for_window(self, regexp):
|
||||||
|
pattern = re.compile(regexp)
|
||||||
|
|
||||||
|
def window_is_visible(last_try):
|
||||||
|
names = self.get_window_names()
|
||||||
|
if last_try:
|
||||||
|
self.log(
|
||||||
|
"Last chance to match {} on the window list,".format(regexp)
|
||||||
|
+ " which currently contains: "
|
||||||
|
+ ", ".join(names)
|
||||||
|
)
|
||||||
|
return any(pattern.search(name) for name in names)
|
||||||
|
|
||||||
|
with self.nested("Waiting for a window to appear"):
|
||||||
|
retry(window_is_visible)
|
||||||
|
|
||||||
def sleep(self, secs):
|
def sleep(self, secs):
|
||||||
time.sleep(secs)
|
time.sleep(secs)
|
||||||
|
|
||||||
|
def forward_port(self, host_port=8080, guest_port=80):
|
||||||
|
"""Forward a TCP port on the host to a TCP port on the guest.
|
||||||
|
Useful during interactive testing.
|
||||||
|
"""
|
||||||
|
self.send_monitor_command(
|
||||||
|
"hostfwd_add tcp::{}-:{}".format(host_port, guest_port)
|
||||||
|
)
|
||||||
|
|
||||||
def block(self):
|
def block(self):
|
||||||
"""Make the machine unreachable by shutting down eth1 (the multicast
|
"""Make the machine unreachable by shutting down eth1 (the multicast
|
||||||
interface used to talk to the other VMs). We keep eth0 up so that
|
interface used to talk to the other VMs). We keep eth0 up so that
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
# This module is deprecated, since you can just say ‘fonts.fonts = [
|
|
||||||
# pkgs.corefonts ];’ instead.
|
|
||||||
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
|
|
||||||
fonts = {
|
|
||||||
|
|
||||||
enableCoreFonts = mkOption {
|
|
||||||
visible = false;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Whether to include Microsoft's proprietary Core Fonts. These fonts
|
|
||||||
are redistributable, but only verbatim, among other restrictions.
|
|
||||||
See <link xlink:href="http://corefonts.sourceforge.net/eula.htm"/>
|
|
||||||
for details.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
config = mkIf config.fonts.enableCoreFonts {
|
|
||||||
|
|
||||||
fonts.fonts = [ pkgs.corefonts ];
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
let cfg = config.fonts.fontconfig.ultimate;
|
|
||||||
|
|
||||||
latestVersion = pkgs.fontconfig.configVersion;
|
|
||||||
|
|
||||||
# The configuration to be included in /etc/font/
|
|
||||||
confPkg = pkgs.runCommand "font-ultimate-conf" { preferLocalBuild = true; } ''
|
|
||||||
support_folder=$out/etc/fonts/conf.d
|
|
||||||
latest_folder=$out/etc/fonts/${latestVersion}/conf.d
|
|
||||||
|
|
||||||
mkdir -p $support_folder
|
|
||||||
mkdir -p $latest_folder
|
|
||||||
|
|
||||||
# fontconfig ultimate substitutions
|
|
||||||
${optionalString (cfg.substitutions != "none") ''
|
|
||||||
ln -s ${pkgs.fontconfig-ultimate}/etc/fonts/presets/${cfg.substitutions}/*.conf \
|
|
||||||
$support_folder
|
|
||||||
ln -s ${pkgs.fontconfig-ultimate}/etc/fonts/presets/${cfg.substitutions}/*.conf \
|
|
||||||
$latest_folder
|
|
||||||
''}
|
|
||||||
|
|
||||||
# fontconfig ultimate various configuration files
|
|
||||||
ln -s ${pkgs.fontconfig-ultimate}/etc/fonts/conf.d/*.conf \
|
|
||||||
$support_folder
|
|
||||||
ln -s ${pkgs.fontconfig-ultimate}/etc/fonts/conf.d/*.conf \
|
|
||||||
$latest_folder
|
|
||||||
'';
|
|
||||||
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
options = {
|
|
||||||
|
|
||||||
fonts = {
|
|
||||||
|
|
||||||
fontconfig = {
|
|
||||||
|
|
||||||
ultimate = {
|
|
||||||
enable = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Enable fontconfig-ultimate settings (formerly known as
|
|
||||||
Infinality). Besides the customizable settings in this NixOS
|
|
||||||
module, fontconfig-ultimate also provides many font-specific
|
|
||||||
rendering tweaks.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
substitutions = mkOption {
|
|
||||||
type = types.enum ["free" "combi" "ms" "none"];
|
|
||||||
default = "free";
|
|
||||||
description = ''
|
|
||||||
Font substitutions to replace common Type 1 fonts with nicer
|
|
||||||
TrueType fonts. <literal>free</literal> uses free fonts,
|
|
||||||
<literal>ms</literal> uses Microsoft fonts,
|
|
||||||
<literal>combi</literal> uses a combination, and
|
|
||||||
<literal>none</literal> disables the substitutions.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
preset = mkOption {
|
|
||||||
type = types.enum ["ultimate1" "ultimate2" "ultimate3" "ultimate4" "ultimate5" "osx" "windowsxp"];
|
|
||||||
default = "ultimate3";
|
|
||||||
description = ''
|
|
||||||
FreeType rendering settings preset. Any of the presets may be
|
|
||||||
customized by setting environment variables.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf (config.fonts.fontconfig.enable && cfg.enable) {
|
|
||||||
|
|
||||||
fonts.fontconfig.confPackages = [ confPkg ];
|
|
||||||
environment.variables.INFINALITY_FT = cfg.preset;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
@ -14,6 +14,10 @@ with lib;
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf config.xdg.sounds.enable {
|
config = mkIf config.xdg.sounds.enable {
|
||||||
|
environment.systemPackages = [
|
||||||
|
pkgs.sound-theme-freedesktop
|
||||||
|
];
|
||||||
|
|
||||||
environment.pathsToLink = [
|
environment.pathsToLink = [
|
||||||
"/share/sounds"
|
"/share/sounds"
|
||||||
];
|
];
|
||||||
|
@ -140,7 +140,11 @@ in
|
|||||||
export img=$out/sd-image/${config.sdImage.imageName}
|
export img=$out/sd-image/${config.sdImage.imageName}
|
||||||
|
|
||||||
echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system
|
echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system
|
||||||
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
|
if test -n "$compressImage"; then
|
||||||
|
echo "file sd-image $img.bz2" >> $out/nix-support/hydra-build-products
|
||||||
|
else
|
||||||
|
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
|
||||||
|
fi
|
||||||
|
|
||||||
# Gap in front of the first partition, in MiB
|
# Gap in front of the first partition, in MiB
|
||||||
gap=8
|
gap=8
|
||||||
|
@ -90,6 +90,11 @@ while [ "$#" -gt 0 ]; do
|
|||||||
targetHost="$1"
|
targetHost="$1"
|
||||||
shift 1
|
shift 1
|
||||||
;;
|
;;
|
||||||
|
--use-remote-sudo)
|
||||||
|
# note the trailing space
|
||||||
|
maybeSudo="sudo "
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "$0: unknown option \`$i'"
|
echo "$0: unknown option \`$i'"
|
||||||
exit 1
|
exit 1
|
||||||
@ -97,10 +102,6 @@ while [ "$#" -gt 0 ]; do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -n "$SUDO_USER" ]; then
|
|
||||||
maybeSudo="sudo "
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$buildHost" -a -n "$targetHost" ]; then
|
if [ -z "$buildHost" -a -n "$targetHost" ]; then
|
||||||
buildHost="$targetHost"
|
buildHost="$targetHost"
|
||||||
fi
|
fi
|
||||||
|
@ -128,7 +128,7 @@
|
|||||||
tcpcryptd = 93; # tcpcryptd uses a hard-coded uid. We patch it in Nixpkgs to match this choice.
|
tcpcryptd = 93; # tcpcryptd uses a hard-coded uid. We patch it in Nixpkgs to match this choice.
|
||||||
firebird = 95;
|
firebird = 95;
|
||||||
#keys = 96; # unused
|
#keys = 96; # unused
|
||||||
haproxy = 97;
|
#haproxy = 97; # DynamicUser as of 2019-11-08
|
||||||
mongodb = 98;
|
mongodb = 98;
|
||||||
openldap = 99;
|
openldap = 99;
|
||||||
#users = 100; # unused
|
#users = 100; # unused
|
||||||
@ -443,7 +443,7 @@
|
|||||||
#tcpcryptd = 93; # unused
|
#tcpcryptd = 93; # unused
|
||||||
firebird = 95;
|
firebird = 95;
|
||||||
keys = 96;
|
keys = 96;
|
||||||
haproxy = 97;
|
#haproxy = 97; # DynamicUser as of 2019-11-08
|
||||||
#mongodb = 98; # unused
|
#mongodb = 98; # unused
|
||||||
openldap = 99;
|
openldap = 99;
|
||||||
munin = 102;
|
munin = 102;
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
[
|
[
|
||||||
./config/debug-info.nix
|
./config/debug-info.nix
|
||||||
./config/fonts/corefonts.nix
|
|
||||||
./config/fonts/fontconfig.nix
|
./config/fonts/fontconfig.nix
|
||||||
./config/fonts/fontconfig-penultimate.nix
|
./config/fonts/fontconfig-penultimate.nix
|
||||||
./config/fonts/fontconfig-ultimate.nix
|
|
||||||
./config/fonts/fontdir.nix
|
./config/fonts/fontdir.nix
|
||||||
./config/fonts/fonts.nix
|
./config/fonts/fonts.nix
|
||||||
./config/fonts/ghostscript.nix
|
./config/fonts/ghostscript.nix
|
||||||
|
@ -251,7 +251,7 @@ in
|
|||||||
ExecStart =
|
ExecStart =
|
||||||
"${cfg.package}/bin/ssh-agent " +
|
"${cfg.package}/bin/ssh-agent " +
|
||||||
optionalString (cfg.agentTimeout != null) ("-t ${cfg.agentTimeout} ") +
|
optionalString (cfg.agentTimeout != null) ("-t ${cfg.agentTimeout} ") +
|
||||||
optionalString (cfg.agentPKCS11Whitelist != null) ("-P ${cfg.agentPKCS11Whitelist} ")
|
optionalString (cfg.agentPKCS11Whitelist != null) ("-P ${cfg.agentPKCS11Whitelist} ") +
|
||||||
"-a %t/ssh-agent";
|
"-a %t/ssh-agent";
|
||||||
StandardOutput = "null";
|
StandardOutput = "null";
|
||||||
Type = "forking";
|
Type = "forking";
|
||||||
|
@ -81,7 +81,7 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
programs.zsh.interactiveShellInit = with pkgs;
|
programs.zsh.interactiveShellInit = with pkgs;
|
||||||
lib.concatStringsSep "\n" ([
|
lib.mkAfter (lib.concatStringsSep "\n" ([
|
||||||
"source ${zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
|
"source ${zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
|
||||||
] ++ optional (length(cfg.highlighters) > 0)
|
] ++ optional (length(cfg.highlighters) > 0)
|
||||||
"ZSH_HIGHLIGHT_HIGHLIGHTERS=(${concatStringsSep " " cfg.highlighters})"
|
"ZSH_HIGHLIGHT_HIGHLIGHTERS=(${concatStringsSep " " cfg.highlighters})"
|
||||||
@ -95,6 +95,6 @@ in
|
|||||||
styles: design:
|
styles: design:
|
||||||
"ZSH_HIGHLIGHT_STYLES[${styles}]='${design}'"
|
"ZSH_HIGHLIGHT_STYLES[${styles}]='${design}'"
|
||||||
) cfg.styles)
|
) cfg.styles)
|
||||||
);
|
));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -234,6 +234,7 @@ with lib;
|
|||||||
(mkRemovedOptionModule [ "services" "mysql" "rootPassword" ] "Use socket authentication or set the password outside of the nix store.")
|
(mkRemovedOptionModule [ "services" "mysql" "rootPassword" ] "Use socket authentication or set the password outside of the nix store.")
|
||||||
(mkRemovedOptionModule [ "services" "zabbixServer" "dbPassword" ] "Use services.zabbixServer.database.passwordFile instead.")
|
(mkRemovedOptionModule [ "services" "zabbixServer" "dbPassword" ] "Use services.zabbixServer.database.passwordFile instead.")
|
||||||
(mkRemovedOptionModule [ "systemd" "generator-packages" ] "Use systemd.packages instead.")
|
(mkRemovedOptionModule [ "systemd" "generator-packages" ] "Use systemd.packages instead.")
|
||||||
|
(mkRemovedOptionModule [ "fonts" "enableCoreFonts" ] "Use fonts.fonts = [ pkgs.corefonts ]; instead.")
|
||||||
|
|
||||||
# ZSH
|
# ZSH
|
||||||
(mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ])
|
(mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ])
|
||||||
@ -291,5 +292,14 @@ with lib;
|
|||||||
(opt: mkRemovedOptionModule [ "services" "prometheus" "${opt}" ] ''
|
(opt: mkRemovedOptionModule [ "services" "prometheus" "${opt}" ] ''
|
||||||
The prometheus exporters are now configured using `services.prometheus.exporters'.
|
The prometheus exporters are now configured using `services.prometheus.exporters'.
|
||||||
See the 18.03 release notes for more information.
|
See the 18.03 release notes for more information.
|
||||||
|
'' ))
|
||||||
|
|
||||||
|
++ (forEach [ "enable" "substitutions" "preset" ]
|
||||||
|
(opt: mkRemovedOptionModule [ "fonts" "fontconfig" "ultimate" "${opt}" ] ''
|
||||||
|
The fonts.fontconfig.ultimate module and configuration is obsolete.
|
||||||
|
The repository has since been archived and activity has ceased.
|
||||||
|
https://github.com/bohoomil/fontconfig-ultimate/issues/171.
|
||||||
|
No action should be needed for font configuration, as the fonts.fontconfig
|
||||||
|
module is already used by default.
|
||||||
'' ));
|
'' ));
|
||||||
}
|
}
|
||||||
|
@ -185,10 +185,10 @@ in
|
|||||||
###### implementation
|
###### implementation
|
||||||
|
|
||||||
config = mkIf config.services.redis.enable {
|
config = mkIf config.services.redis.enable {
|
||||||
|
boot.kernel.sysctl = (mkMerge [
|
||||||
boot.kernel.sysctl = {
|
{ "vm.nr_hugepages" = "0"; }
|
||||||
"vm.nr_hugepages" = "0";
|
( mkIf cfg.vmOverCommit { "vm.overcommit_memory" = "1"; } )
|
||||||
} // mkIf cfg.vmOverCommit { "vm.overcommit_memory" = "1"; };
|
]);
|
||||||
|
|
||||||
networking.firewall = mkIf cfg.openFirewall {
|
networking.firewall = mkIf cfg.openFirewall {
|
||||||
allowedTCPPorts = [ cfg.port ];
|
allowedTCPPorts = [ cfg.port ];
|
||||||
|
@ -101,6 +101,12 @@ in {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d /var/spool/smtpd 711 root - - -"
|
||||||
|
"d /var/spool/smtpd/offline 770 root smtpq - -"
|
||||||
|
"d /var/spool/smtpd/purge 700 smtpq root - -"
|
||||||
|
];
|
||||||
|
|
||||||
systemd.services.opensmtpd = let
|
systemd.services.opensmtpd = let
|
||||||
procEnv = pkgs.buildEnv {
|
procEnv = pkgs.buildEnv {
|
||||||
name = "opensmtpd-procs";
|
name = "opensmtpd-procs";
|
||||||
@ -110,18 +116,6 @@ in {
|
|||||||
in {
|
in {
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
preStart = ''
|
|
||||||
mkdir -p /var/spool/smtpd
|
|
||||||
chmod 711 /var/spool/smtpd
|
|
||||||
|
|
||||||
mkdir -p /var/spool/smtpd/offline
|
|
||||||
chown root.smtpq /var/spool/smtpd/offline
|
|
||||||
chmod 770 /var/spool/smtpd/offline
|
|
||||||
|
|
||||||
mkdir -p /var/spool/smtpd/purge
|
|
||||||
chown smtpq.root /var/spool/smtpd/purge
|
|
||||||
chmod 700 /var/spool/smtpd/purge
|
|
||||||
'';
|
|
||||||
serviceConfig.ExecStart = "${cfg.package}/sbin/smtpd -d -f ${conf} ${args}";
|
serviceConfig.ExecStart = "${cfg.package}/sbin/smtpd -d -f ${conf} ${args}";
|
||||||
environment.OPENSMTPD_PROC_PATH = "${procEnv}/libexec/opensmtpd";
|
environment.OPENSMTPD_PROC_PATH = "${procEnv}/libexec/opensmtpd";
|
||||||
};
|
};
|
||||||
|
@ -62,20 +62,11 @@ in
|
|||||||
services.redmine = {
|
services.redmine = {
|
||||||
enable = mkEnableOption "Redmine";
|
enable = mkEnableOption "Redmine";
|
||||||
|
|
||||||
# default to the 4.x series not forcing major version upgrade of those on the 3.x series
|
|
||||||
package = mkOption {
|
package = mkOption {
|
||||||
type = types.package;
|
type = types.package;
|
||||||
default = if versionAtLeast config.system.stateVersion "19.03"
|
default = pkgs.redmine;
|
||||||
then pkgs.redmine_4
|
description = "Which Redmine package to use.";
|
||||||
else pkgs.redmine
|
example = "pkgs.redmine.override { ruby = pkgs.ruby_2_4; }";
|
||||||
;
|
|
||||||
defaultText = "pkgs.redmine";
|
|
||||||
description = ''
|
|
||||||
Which Redmine package to use. This defaults to version 3.x if
|
|
||||||
<literal>system.stateVersion < 19.03</literal> and version 4.x
|
|
||||||
otherwise.
|
|
||||||
'';
|
|
||||||
example = "pkgs.redmine_4.override { ruby = pkgs.ruby_2_4; }";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
user = mkOption {
|
user = mkOption {
|
||||||
|
@ -265,7 +265,7 @@ in {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location /cache/ {
|
location /cache/ {
|
||||||
alias /var/cache/${dirName};
|
alias /var/cache/${dirName}/;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.php$ {
|
location ~ \.php$ {
|
||||||
|
@ -12,11 +12,6 @@ let
|
|||||||
|
|
||||||
samba = cfg.package;
|
samba = cfg.package;
|
||||||
|
|
||||||
setupScript =
|
|
||||||
''
|
|
||||||
mkdir -p /var/lock/samba /var/log/samba /var/cache/samba /var/lib/samba/private
|
|
||||||
'';
|
|
||||||
|
|
||||||
shareConfig = name:
|
shareConfig = name:
|
||||||
let share = getAttr name cfg.shares; in
|
let share = getAttr name cfg.shares; in
|
||||||
"[${name}]\n " + (smbToString (
|
"[${name}]\n " + (smbToString (
|
||||||
@ -62,6 +57,7 @@ let
|
|||||||
Type = "notify";
|
Type = "notify";
|
||||||
NotifyAccess = "all"; #may not do anything...
|
NotifyAccess = "all"; #may not do anything...
|
||||||
};
|
};
|
||||||
|
unitConfig.RequiresMountsFor = "/var/lib/samba";
|
||||||
|
|
||||||
restartTriggers = [ configFile ];
|
restartTriggers = [ configFile ];
|
||||||
};
|
};
|
||||||
@ -228,8 +224,7 @@ in
|
|||||||
systemd = {
|
systemd = {
|
||||||
targets.samba = {
|
targets.samba = {
|
||||||
description = "Samba Server";
|
description = "Samba Server";
|
||||||
requires = [ "samba-setup.service" ];
|
after = [ "network.target" ];
|
||||||
after = [ "samba-setup.service" "network.target" ];
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
};
|
};
|
||||||
# Refer to https://github.com/samba-team/samba/tree/master/packaging/systemd
|
# Refer to https://github.com/samba-team/samba/tree/master/packaging/systemd
|
||||||
@ -238,12 +233,13 @@ in
|
|||||||
samba-smbd = daemonService "smbd" "";
|
samba-smbd = daemonService "smbd" "";
|
||||||
samba-nmbd = mkIf cfg.enableNmbd (daemonService "nmbd" "");
|
samba-nmbd = mkIf cfg.enableNmbd (daemonService "nmbd" "");
|
||||||
samba-winbindd = mkIf cfg.enableWinbindd (daemonService "winbindd" "");
|
samba-winbindd = mkIf cfg.enableWinbindd (daemonService "winbindd" "");
|
||||||
samba-setup = {
|
|
||||||
description = "Samba Setup Task";
|
|
||||||
script = setupScript;
|
|
||||||
unitConfig.RequiresMountsFor = "/var/lib/samba";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
tmpfiles.rules = [
|
||||||
|
"d /var/lock/samba - - - - -"
|
||||||
|
"d /var/log/samba - - - - -"
|
||||||
|
"d /var/cache/samba - - - - -"
|
||||||
|
"d /var/lib/samba/private - - - - -"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
security.pam.services.samba = {};
|
security.pam.services.samba = {};
|
||||||
|
@ -46,11 +46,10 @@ in {
|
|||||||
RestartSec="1";
|
RestartSec="1";
|
||||||
DynamicUser = true;
|
DynamicUser = true;
|
||||||
StartLimitInterval="0";
|
StartLimitInterval="0";
|
||||||
PrivateTmp=true;
|
|
||||||
PrivateDevices=true;
|
PrivateDevices=true;
|
||||||
CapabilityBoundingSet="CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID";
|
AmbientCapabilities="CAP_NET_BIND_SERVICE";
|
||||||
|
CapabilityBoundingSet="CAP_NET_BIND_SERVICE";
|
||||||
ExecStart = "${pkgs.dnsdist}/bin/dnsdist --supervised --disable-syslog --config ${configFile}";
|
ExecStart = "${pkgs.dnsdist}/bin/dnsdist --supervised --disable-syslog --config ${configFile}";
|
||||||
ProtectSystem="full";
|
|
||||||
ProtectHome=true;
|
ProtectHome=true;
|
||||||
RestrictAddressFamilies="AF_UNIX AF_INET AF_INET6";
|
RestrictAddressFamilies="AF_UNIX AF_INET AF_INET6";
|
||||||
LimitNOFILE="16384";
|
LimitNOFILE="16384";
|
||||||
|
@ -1,7 +1,16 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.services.haproxy;
|
cfg = config.services.haproxy;
|
||||||
haproxyCfg = pkgs.writeText "haproxy.conf" cfg.config;
|
|
||||||
|
haproxyCfg = pkgs.writeText "haproxy.conf" ''
|
||||||
|
global
|
||||||
|
# needed for hot-reload to work without dropping packets in multi-worker mode
|
||||||
|
stats socket /run/haproxy/haproxy.sock mode 600 expose-fd listeners level user
|
||||||
|
|
||||||
|
${cfg.config}
|
||||||
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
@ -25,9 +34,7 @@ with lib;
|
|||||||
<filename>haproxy.conf</filename>.
|
<filename>haproxy.conf</filename>.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
@ -42,21 +49,16 @@ with lib;
|
|||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "forking";
|
DynamicUser = true;
|
||||||
PIDFile = "/run/haproxy.pid";
|
Type = "notify";
|
||||||
ExecStartPre = "${pkgs.haproxy}/sbin/haproxy -c -q -f ${haproxyCfg}";
|
# when running the config test, don't be quiet so we can see what goes wrong
|
||||||
ExecStart = "${pkgs.haproxy}/sbin/haproxy -D -f ${haproxyCfg} -p /run/haproxy.pid";
|
ExecStartPre = "${pkgs.haproxy}/sbin/haproxy -c -f ${haproxyCfg}";
|
||||||
ExecReload = "-${pkgs.bash}/bin/bash -c \"exec ${pkgs.haproxy}/sbin/haproxy -D -f ${haproxyCfg} -p /run/haproxy.pid -sf $MAINPID\"";
|
ExecStart = "${pkgs.haproxy}/sbin/haproxy -Ws -f ${haproxyCfg}";
|
||||||
|
Restart = "on-failure";
|
||||||
|
RuntimeDirectory = "haproxy";
|
||||||
|
# needed in case we bind to port < 1024
|
||||||
|
AmbientCapabilities = "CAP_NET_BIND_SERVICE";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.haproxy ];
|
|
||||||
|
|
||||||
users.users.haproxy = {
|
|
||||||
group = "haproxy";
|
|
||||||
uid = config.ids.uids.haproxy;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.groups.haproxy.gid = config.ids.uids.haproxy;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -456,15 +456,19 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
# Turn off NixOS' network management when networking is managed entirely by NetworkManager
|
# Turn off NixOS' network management when networking is managed entirely by NetworkManager
|
||||||
networking = (mkIf (!delegateWireless) {
|
networking = mkMerge [
|
||||||
useDHCP = false;
|
(mkIf (!delegateWireless) {
|
||||||
# Use mkDefault to trigger the assertion about the conflict above
|
useDHCP = false;
|
||||||
wireless.enable = mkDefault false;
|
})
|
||||||
}) // (mkIf cfg.enableStrongSwan {
|
|
||||||
networkmanager.packages = [ pkgs.networkmanager_strongswan ];
|
(mkIf cfg.enableStrongSwan {
|
||||||
}) // (mkIf enableIwd {
|
networkmanager.packages = [ pkgs.networkmanager_strongswan ];
|
||||||
wireless.iwd.enable = true;
|
})
|
||||||
});
|
|
||||||
|
(mkIf enableIwd {
|
||||||
|
wireless.iwd.enable = true;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
security.polkit.extraConfig = polkitConf;
|
security.polkit.extraConfig = polkitConf;
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ with lib;
|
|||||||
systemd.services.tinydns = {
|
systemd.services.tinydns = {
|
||||||
description = "djbdns tinydns server";
|
description = "djbdns tinydns server";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
after = [ "network.target" ];
|
||||||
path = with pkgs; [ daemontools djbdns ];
|
path = with pkgs; [ daemontools djbdns ];
|
||||||
preStart = ''
|
preStart = ''
|
||||||
rm -rf /var/lib/tinydns
|
rm -rf /var/lib/tinydns
|
||||||
|
@ -6,6 +6,8 @@ let
|
|||||||
|
|
||||||
mainCfg = config.services.httpd;
|
mainCfg = config.services.httpd;
|
||||||
|
|
||||||
|
runtimeDir = "/run/httpd";
|
||||||
|
|
||||||
httpd = mainCfg.package.out;
|
httpd = mainCfg.package.out;
|
||||||
|
|
||||||
httpdConf = mainCfg.configFile;
|
httpdConf = mainCfg.configFile;
|
||||||
@ -27,41 +29,29 @@ let
|
|||||||
|
|
||||||
listenToString = l: "${l.ip}:${toString l.port}";
|
listenToString = l: "${l.ip}:${toString l.port}";
|
||||||
|
|
||||||
extraModules = attrByPath ["extraModules"] [] mainCfg;
|
|
||||||
extraForeignModules = filter isAttrs extraModules;
|
|
||||||
extraApacheModules = filter isString extraModules;
|
|
||||||
|
|
||||||
allHosts = [mainCfg] ++ mainCfg.virtualHosts;
|
allHosts = [mainCfg] ++ mainCfg.virtualHosts;
|
||||||
|
|
||||||
enableSSL = any (vhost: vhost.enableSSL) allHosts;
|
enableSSL = any (vhost: vhost.enableSSL) allHosts;
|
||||||
|
|
||||||
|
enableUserDir = any (vhost: vhost.enableUserDir) allHosts;
|
||||||
|
|
||||||
# Names of modules from ${httpd}/modules that we want to load.
|
# NOTE: generally speaking order of modules is very important
|
||||||
apacheModules =
|
modules =
|
||||||
[ # HTTP authentication mechanisms: basic and digest.
|
[ # required apache modules our httpd service cannot run without
|
||||||
"auth_basic" "auth_digest"
|
"authn_core" "authz_core"
|
||||||
|
"log_config"
|
||||||
# Authentication: is the user who he claims to be?
|
"mime" "autoindex" "negotiation" "dir"
|
||||||
"authn_file" "authn_dbm" "authn_anon" "authn_core"
|
"alias" "rewrite"
|
||||||
|
"unixd" "slotmem_shm" "socache_shmcb"
|
||||||
# Authorization: is the user allowed access?
|
|
||||||
"authz_user" "authz_groupfile" "authz_host" "authz_core"
|
|
||||||
|
|
||||||
# Other modules.
|
|
||||||
"ext_filter" "include" "log_config" "env" "mime_magic"
|
|
||||||
"cern_meta" "expires" "headers" "usertrack" /* "unique_id" */ "setenvif"
|
|
||||||
"mime" "dav" "status" "autoindex" "asis" "info" "dav_fs"
|
|
||||||
"vhost_alias" "negotiation" "dir" "imagemap" "actions" "speling"
|
|
||||||
"userdir" "alias" "rewrite" "proxy" "proxy_http"
|
|
||||||
"unixd" "cache" "cache_disk" "slotmem_shm" "socache_shmcb"
|
|
||||||
"mpm_${mainCfg.multiProcessingModule}"
|
"mpm_${mainCfg.multiProcessingModule}"
|
||||||
|
|
||||||
# For compatibility with old configurations, the new module mod_access_compat is provided.
|
|
||||||
"access_compat"
|
|
||||||
]
|
]
|
||||||
++ (if mainCfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
|
++ (if mainCfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
|
||||||
++ optional enableSSL "ssl"
|
++ optional enableSSL "ssl"
|
||||||
++ extraApacheModules;
|
++ optional enableUserDir "userdir"
|
||||||
|
++ optional mainCfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
|
||||||
|
++ optional mainCfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
|
||||||
|
++ optional mainCfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
|
||||||
|
++ mainCfg.extraModules;
|
||||||
|
|
||||||
|
|
||||||
allDenied = "Require all denied";
|
allDenied = "Require all denied";
|
||||||
@ -85,20 +75,22 @@ let
|
|||||||
|
|
||||||
|
|
||||||
browserHacks = ''
|
browserHacks = ''
|
||||||
BrowserMatch "Mozilla/2" nokeepalive
|
<IfModule mod_setenvif.c>
|
||||||
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
|
BrowserMatch "Mozilla/2" nokeepalive
|
||||||
BrowserMatch "RealPlayer 4\.0" force-response-1.0
|
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
|
||||||
BrowserMatch "Java/1\.0" force-response-1.0
|
BrowserMatch "RealPlayer 4\.0" force-response-1.0
|
||||||
BrowserMatch "JDK/1\.0" force-response-1.0
|
BrowserMatch "Java/1\.0" force-response-1.0
|
||||||
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
|
BrowserMatch "JDK/1\.0" force-response-1.0
|
||||||
BrowserMatch "^WebDrive" redirect-carefully
|
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
|
||||||
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
|
BrowserMatch "^WebDrive" redirect-carefully
|
||||||
BrowserMatch "^gnome-vfs" redirect-carefully
|
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
|
||||||
|
BrowserMatch "^gnome-vfs" redirect-carefully
|
||||||
|
</IfModule>
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
||||||
sslConf = ''
|
sslConf = ''
|
||||||
SSLSessionCache shmcb:${mainCfg.stateDir}/ssl_scache(512000)
|
SSLSessionCache shmcb:${runtimeDir}/ssl_scache(512000)
|
||||||
|
|
||||||
Mutex posixsem
|
Mutex posixsem
|
||||||
|
|
||||||
@ -239,13 +231,13 @@ let
|
|||||||
|
|
||||||
ServerRoot ${httpd}
|
ServerRoot ${httpd}
|
||||||
|
|
||||||
DefaultRuntimeDir ${mainCfg.stateDir}/runtime
|
DefaultRuntimeDir ${runtimeDir}/runtime
|
||||||
|
|
||||||
PidFile ${mainCfg.stateDir}/httpd.pid
|
PidFile ${runtimeDir}/httpd.pid
|
||||||
|
|
||||||
${optionalString (mainCfg.multiProcessingModule != "prefork") ''
|
${optionalString (mainCfg.multiProcessingModule != "prefork") ''
|
||||||
# mod_cgid requires this.
|
# mod_cgid requires this.
|
||||||
ScriptSock ${mainCfg.stateDir}/cgisock
|
ScriptSock ${runtimeDir}/cgisock
|
||||||
''}
|
''}
|
||||||
|
|
||||||
<IfModule prefork.c>
|
<IfModule prefork.c>
|
||||||
@ -264,13 +256,12 @@ let
|
|||||||
Group ${mainCfg.group}
|
Group ${mainCfg.group}
|
||||||
|
|
||||||
${let
|
${let
|
||||||
load = {name, path}: "LoadModule ${name}_module ${path}\n";
|
mkModule = module:
|
||||||
allModules = map (name: {inherit name; path = "${httpd}/modules/mod_${name}.so";}) apacheModules
|
if isString module then { name = module; path = "${httpd}/modules/mod_${module}.so"; }
|
||||||
++ optional mainCfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
|
else if isAttrs module then { inherit (module) name path; }
|
||||||
++ optional mainCfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
|
else throw "Expecting either a string or attribute set including a name and path.";
|
||||||
++ optional mainCfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
|
in
|
||||||
++ extraForeignModules;
|
concatMapStringsSep "\n" (module: "LoadModule ${module.name}_module ${module.path}") (unique (map mkModule modules))
|
||||||
in concatMapStrings load (unique allModules)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AddHandler type-map var
|
AddHandler type-map var
|
||||||
@ -337,6 +328,7 @@ in
|
|||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
(mkRemovedOptionModule [ "services" "httpd" "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.")
|
(mkRemovedOptionModule [ "services" "httpd" "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.")
|
||||||
|
(mkRemovedOptionModule [ "services" "httpd" "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.")
|
||||||
];
|
];
|
||||||
|
|
||||||
###### interface
|
###### interface
|
||||||
@ -384,7 +376,12 @@ in
|
|||||||
extraModules = mkOption {
|
extraModules = mkOption {
|
||||||
type = types.listOf types.unspecified;
|
type = types.listOf types.unspecified;
|
||||||
default = [];
|
default = [];
|
||||||
example = literalExample ''[ "proxy_connect" { name = "php5"; path = "''${pkgs.php}/modules/libphp5.so"; } ]'';
|
example = literalExample ''
|
||||||
|
[
|
||||||
|
"proxy_connect"
|
||||||
|
{ name = "jk"; path = "''${pkgs.tomcat_connectors}/modules/mod_jk.so"; }
|
||||||
|
]
|
||||||
|
'';
|
||||||
description = ''
|
description = ''
|
||||||
Additional Apache modules to be used. These can be
|
Additional Apache modules to be used. These can be
|
||||||
specified as a string in the case of modules distributed
|
specified as a string in the case of modules distributed
|
||||||
@ -431,16 +428,6 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
stateDir = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = "/run/httpd";
|
|
||||||
description = ''
|
|
||||||
Directory for Apache's transient runtime state (such as PID
|
|
||||||
files). It is created automatically. Note that the default,
|
|
||||||
<filename>/run/httpd</filename>, is deleted at boot time.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
virtualHosts = mkOption {
|
virtualHosts = mkOption {
|
||||||
type = types.listOf (types.submodule (
|
type = types.listOf (types.submodule (
|
||||||
{ options = import ./per-server-options.nix {
|
{ options = import ./per-server-options.nix {
|
||||||
@ -595,6 +582,28 @@ in
|
|||||||
date.timezone = "${config.time.timeZone}"
|
date.timezone = "${config.time.timeZone}"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
services.httpd.extraModules = mkBefore [
|
||||||
|
# HTTP authentication mechanisms: basic and digest.
|
||||||
|
"auth_basic" "auth_digest"
|
||||||
|
|
||||||
|
# Authentication: is the user who he claims to be?
|
||||||
|
"authn_file" "authn_dbm" "authn_anon"
|
||||||
|
|
||||||
|
# Authorization: is the user allowed access?
|
||||||
|
"authz_user" "authz_groupfile" "authz_host"
|
||||||
|
|
||||||
|
# Other modules.
|
||||||
|
"ext_filter" "include" "env" "mime_magic"
|
||||||
|
"cern_meta" "expires" "headers" "usertrack" "setenvif"
|
||||||
|
"dav" "status" "asis" "info" "dav_fs"
|
||||||
|
"vhost_alias" "imagemap" "actions" "speling"
|
||||||
|
"proxy" "proxy_http"
|
||||||
|
"cache" "cache_disk"
|
||||||
|
|
||||||
|
# For compatibility with old configurations, the new module mod_access_compat is provided.
|
||||||
|
"access_compat"
|
||||||
|
];
|
||||||
|
|
||||||
systemd.services.httpd =
|
systemd.services.httpd =
|
||||||
{ description = "Apache HTTPD";
|
{ description = "Apache HTTPD";
|
||||||
|
|
||||||
@ -611,12 +620,6 @@ in
|
|||||||
|
|
||||||
preStart =
|
preStart =
|
||||||
''
|
''
|
||||||
mkdir -m 0750 -p ${mainCfg.stateDir}
|
|
||||||
[ $(id -u) != 0 ] || chown root.${mainCfg.group} ${mainCfg.stateDir}
|
|
||||||
|
|
||||||
mkdir -m 0750 -p "${mainCfg.stateDir}/runtime"
|
|
||||||
[ $(id -u) != 0 ] || chown root.${mainCfg.group} "${mainCfg.stateDir}/runtime"
|
|
||||||
|
|
||||||
mkdir -m 0700 -p ${mainCfg.logDir}
|
mkdir -m 0700 -p ${mainCfg.logDir}
|
||||||
|
|
||||||
# Get rid of old semaphores. These tend to accumulate across
|
# Get rid of old semaphores. These tend to accumulate across
|
||||||
@ -630,10 +633,13 @@ in
|
|||||||
serviceConfig.ExecStart = "@${httpd}/bin/httpd httpd -f ${httpdConf}";
|
serviceConfig.ExecStart = "@${httpd}/bin/httpd httpd -f ${httpdConf}";
|
||||||
serviceConfig.ExecStop = "${httpd}/bin/httpd -f ${httpdConf} -k graceful-stop";
|
serviceConfig.ExecStop = "${httpd}/bin/httpd -f ${httpdConf} -k graceful-stop";
|
||||||
serviceConfig.ExecReload = "${httpd}/bin/httpd -f ${httpdConf} -k graceful";
|
serviceConfig.ExecReload = "${httpd}/bin/httpd -f ${httpdConf} -k graceful";
|
||||||
|
serviceConfig.Group = mainCfg.group;
|
||||||
serviceConfig.Type = "forking";
|
serviceConfig.Type = "forking";
|
||||||
serviceConfig.PIDFile = "${mainCfg.stateDir}/httpd.pid";
|
serviceConfig.PIDFile = "${runtimeDir}/httpd.pid";
|
||||||
serviceConfig.Restart = "always";
|
serviceConfig.Restart = "always";
|
||||||
serviceConfig.RestartSec = "5s";
|
serviceConfig.RestartSec = "5s";
|
||||||
|
serviceConfig.RuntimeDirectory = "httpd httpd/runtime";
|
||||||
|
serviceConfig.RuntimeDirectoryMode = "0750";
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -217,6 +217,12 @@ in
|
|||||||
|
|
||||||
services.xserver.updateDbusEnvironment = true;
|
services.xserver.updateDbusEnvironment = true;
|
||||||
|
|
||||||
|
# gnome has a custom alert theme but it still
|
||||||
|
# inherits from the freedesktop theme.
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
sound-theme-freedesktop
|
||||||
|
];
|
||||||
|
|
||||||
# Needed for themes and backgrounds
|
# Needed for themes and backgrounds
|
||||||
environment.pathsToLink = [
|
environment.pathsToLink = [
|
||||||
"/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173
|
"/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173
|
||||||
|
@ -14,7 +14,7 @@ let
|
|||||||
xserverWrapper = pkgs.writeScript "xserver-wrapper" ''
|
xserverWrapper = pkgs.writeScript "xserver-wrapper" ''
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
${concatMapStrings (n: "export ${n}=\"${getAttr n xEnv}\"\n") (attrNames xEnv)}
|
${concatMapStrings (n: "export ${n}=\"${getAttr n xEnv}\"\n") (attrNames xEnv)}
|
||||||
exec systemd-cat ${dmcfg.xserverBin} ${toString dmcfg.xserverArgs} "$@"
|
exec systemd-cat -t xserver-wrapper ${dmcfg.xserverBin} ${toString dmcfg.xserverArgs} "$@"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
Xsetup = pkgs.writeScript "Xsetup" ''
|
Xsetup = pkgs.writeScript "Xsetup" ''
|
||||||
|
@ -86,7 +86,7 @@ in
|
|||||||
${xmonadBin}
|
${xmonadBin}
|
||||||
waitPID=$!
|
waitPID=$!
|
||||||
'' else ''
|
'' else ''
|
||||||
${xmonad}/bin/xmonad &
|
systemd-cat -t xmonad ${xmonad}/bin/xmonad &
|
||||||
waitPID=$!
|
waitPID=$!
|
||||||
'';
|
'';
|
||||||
}];
|
}];
|
||||||
|
@ -25,6 +25,7 @@ let
|
|||||||
[Daemon]
|
[Daemon]
|
||||||
ShowDelay=0
|
ShowDelay=0
|
||||||
Theme=${cfg.theme}
|
Theme=${cfg.theme}
|
||||||
|
${cfg.extraConfig}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
@ -65,6 +66,15 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraConfig = mkOption {
|
||||||
|
type = types.lines;
|
||||||
|
default = "";
|
||||||
|
description = ''
|
||||||
|
Literal string to append to <literal>configFile</literal>
|
||||||
|
and the config file generated by the plymouth module.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ in rec {
|
|||||||
in
|
in
|
||||||
if isList (head defs'')
|
if isList (head defs'')
|
||||||
then concatLists defs''
|
then concatLists defs''
|
||||||
else mergeOneOption loc defs';
|
else mergeEqualOption loc defs';
|
||||||
};
|
};
|
||||||
|
|
||||||
sharedOptions = {
|
sharedOptions = {
|
||||||
|
@ -48,7 +48,6 @@ in
|
|||||||
clickhouse = handleTest ./clickhouse.nix {};
|
clickhouse = handleTest ./clickhouse.nix {};
|
||||||
cloud-init = handleTest ./cloud-init.nix {};
|
cloud-init = handleTest ./cloud-init.nix {};
|
||||||
codimd = handleTest ./codimd.nix {};
|
codimd = handleTest ./codimd.nix {};
|
||||||
colord = handleTest ./colord.nix {};
|
|
||||||
containers-bridge = handleTest ./containers-bridge.nix {};
|
containers-bridge = handleTest ./containers-bridge.nix {};
|
||||||
containers-ephemeral = handleTest ./containers-ephemeral.nix {};
|
containers-ephemeral = handleTest ./containers-ephemeral.nix {};
|
||||||
containers-extra_veth = handleTest ./containers-extra_veth.nix {};
|
containers-extra_veth = handleTest ./containers-extra_veth.nix {};
|
||||||
@ -88,27 +87,20 @@ in
|
|||||||
firewall = handleTest ./firewall.nix {};
|
firewall = handleTest ./firewall.nix {};
|
||||||
fish = handleTest ./fish.nix {};
|
fish = handleTest ./fish.nix {};
|
||||||
flannel = handleTestOn ["x86_64-linux"] ./flannel.nix {};
|
flannel = handleTestOn ["x86_64-linux"] ./flannel.nix {};
|
||||||
flatpak = handleTest ./flatpak.nix {};
|
|
||||||
flatpak-builder = handleTest ./flatpak-builder.nix {};
|
|
||||||
fluentd = handleTest ./fluentd.nix {};
|
fluentd = handleTest ./fluentd.nix {};
|
||||||
fontconfig-default-fonts = handleTest ./fontconfig-default-fonts.nix {};
|
fontconfig-default-fonts = handleTest ./fontconfig-default-fonts.nix {};
|
||||||
fsck = handleTest ./fsck.nix {};
|
fsck = handleTest ./fsck.nix {};
|
||||||
fwupd = handleTestOn ["x86_64-linux"] ./fwupd.nix {}; # libsmbios is unsupported on aarch64
|
|
||||||
gdk-pixbuf = handleTest ./gdk-pixbuf.nix {};
|
|
||||||
gotify-server = handleTest ./gotify-server.nix {};
|
gotify-server = handleTest ./gotify-server.nix {};
|
||||||
gitea = handleTest ./gitea.nix {};
|
gitea = handleTest ./gitea.nix {};
|
||||||
gitlab = handleTest ./gitlab.nix {};
|
gitlab = handleTest ./gitlab.nix {};
|
||||||
gitolite = handleTest ./gitolite.nix {};
|
gitolite = handleTest ./gitolite.nix {};
|
||||||
gjs = handleTest ./gjs.nix {};
|
|
||||||
glib-networking = handleTest ./glib-networking.nix {};
|
|
||||||
glusterfs = handleTest ./glusterfs.nix {};
|
glusterfs = handleTest ./glusterfs.nix {};
|
||||||
gnome3-xorg = handleTest ./gnome3-xorg.nix {};
|
gnome3-xorg = handleTest ./gnome3-xorg.nix {};
|
||||||
gnome3 = handleTest ./gnome3.nix {};
|
gnome3 = handleTest ./gnome3.nix {};
|
||||||
gnome-photos = handleTest ./gnome-photos.nix {};
|
installed-tests = pkgs.recurseIntoAttrs (handleTest ./installed-tests {});
|
||||||
gocd-agent = handleTest ./gocd-agent.nix {};
|
gocd-agent = handleTest ./gocd-agent.nix {};
|
||||||
gocd-server = handleTest ./gocd-server.nix {};
|
gocd-server = handleTest ./gocd-server.nix {};
|
||||||
google-oslogin = handleTest ./google-oslogin {};
|
google-oslogin = handleTest ./google-oslogin {};
|
||||||
graphene = handleTest ./graphene.nix {};
|
|
||||||
grafana = handleTest ./grafana.nix {};
|
grafana = handleTest ./grafana.nix {};
|
||||||
graphite = handleTest ./graphite.nix {};
|
graphite = handleTest ./graphite.nix {};
|
||||||
graylog = handleTest ./graylog.nix {};
|
graylog = handleTest ./graylog.nix {};
|
||||||
@ -149,8 +141,6 @@ in
|
|||||||
latestKernel.login = handleTest ./login.nix { latestKernel = true; };
|
latestKernel.login = handleTest ./login.nix { latestKernel = true; };
|
||||||
ldap = handleTest ./ldap.nix {};
|
ldap = handleTest ./ldap.nix {};
|
||||||
leaps = handleTest ./leaps.nix {};
|
leaps = handleTest ./leaps.nix {};
|
||||||
libgdata = handleTest ./libgdata.nix {};
|
|
||||||
libxmlb = handleTest ./libxmlb.nix {};
|
|
||||||
lidarr = handleTest ./lidarr.nix {};
|
lidarr = handleTest ./lidarr.nix {};
|
||||||
lightdm = handleTest ./lightdm.nix {};
|
lightdm = handleTest ./lightdm.nix {};
|
||||||
limesurvey = handleTest ./limesurvey.nix {};
|
limesurvey = handleTest ./limesurvey.nix {};
|
||||||
@ -216,7 +206,6 @@ in
|
|||||||
os-prober = handleTestOn ["x86_64-linux"] ./os-prober.nix {};
|
os-prober = handleTestOn ["x86_64-linux"] ./os-prober.nix {};
|
||||||
osquery = handleTest ./osquery.nix {};
|
osquery = handleTest ./osquery.nix {};
|
||||||
osrm-backend = handleTest ./osrm-backend.nix {};
|
osrm-backend = handleTest ./osrm-backend.nix {};
|
||||||
ostree = handleTest ./ostree.nix {};
|
|
||||||
overlayfs = handleTest ./overlayfs.nix {};
|
overlayfs = handleTest ./overlayfs.nix {};
|
||||||
packagekit = handleTest ./packagekit.nix {};
|
packagekit = handleTest ./packagekit.nix {};
|
||||||
pam-oath-login = handleTest ./pam-oath-login.nix {};
|
pam-oath-login = handleTest ./pam-oath-login.nix {};
|
||||||
@ -255,6 +244,7 @@ in
|
|||||||
rxe = handleTest ./rxe.nix {};
|
rxe = handleTest ./rxe.nix {};
|
||||||
samba = handleTest ./samba.nix {};
|
samba = handleTest ./samba.nix {};
|
||||||
sddm = handleTest ./sddm.nix {};
|
sddm = handleTest ./sddm.nix {};
|
||||||
|
shiori = handleTest ./shiori.nix {};
|
||||||
signal-desktop = handleTest ./signal-desktop.nix {};
|
signal-desktop = handleTest ./signal-desktop.nix {};
|
||||||
simple = handleTest ./simple.nix {};
|
simple = handleTest ./simple.nix {};
|
||||||
slim = handleTest ./slim.nix {};
|
slim = handleTest ./slim.nix {};
|
||||||
@ -292,7 +282,6 @@ in
|
|||||||
wireguard-generated = handleTest ./wireguard/generated.nix {};
|
wireguard-generated = handleTest ./wireguard/generated.nix {};
|
||||||
wordpress = handleTest ./wordpress.nix {};
|
wordpress = handleTest ./wordpress.nix {};
|
||||||
xautolock = handleTest ./xautolock.nix {};
|
xautolock = handleTest ./xautolock.nix {};
|
||||||
xdg-desktop-portal = handleTest ./xdg-desktop-portal.nix {};
|
|
||||||
xfce = handleTest ./xfce.nix {};
|
xfce = handleTest ./xfce.nix {};
|
||||||
xfce4-14 = handleTest ./xfce4-14.nix {};
|
xfce4-14 = handleTest ./xfce4-14.nix {};
|
||||||
xmonad = handleTest ./xmonad.nix {};
|
xmonad = handleTest ./xmonad.nix {};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }: {
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||||
name = "caddy";
|
name = "caddy";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ xfix ];
|
maintainers = [ xfix ];
|
||||||
@ -50,33 +50,38 @@ import ./make-test.nix ({ pkgs, ... }: {
|
|||||||
etagSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-1";
|
etagSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-1";
|
||||||
justReloadSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-2";
|
justReloadSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-2";
|
||||||
in ''
|
in ''
|
||||||
my $url = 'http://localhost/example.html';
|
url = "http://localhost/example.html"
|
||||||
$webserver->waitForUnit("caddy");
|
webserver.wait_for_unit("caddy")
|
||||||
$webserver->waitForOpenPort("80");
|
webserver.wait_for_open_port("80")
|
||||||
|
|
||||||
sub checkEtag {
|
|
||||||
my $etag = $webserver->succeed(
|
|
||||||
'curl -v '.$url.' 2>&1 | sed -n -e "s/^< [Ee][Tt][Aa][Gg]: *//p"'
|
|
||||||
);
|
|
||||||
$etag =~ s/\r?\n$//;
|
|
||||||
my $httpCode = $webserver->succeed(
|
|
||||||
'curl -w "%{http_code}" -X HEAD -H \'If-None-Match: '.$etag.'\' '.$url
|
|
||||||
);
|
|
||||||
die "HTTP code is not 304" unless $httpCode == 304;
|
|
||||||
return $etag;
|
|
||||||
}
|
|
||||||
|
|
||||||
subtest "check ETag if serving Nix store paths", sub {
|
def check_etag(url):
|
||||||
my $oldEtag = checkEtag;
|
etag = webserver.succeed(
|
||||||
$webserver->succeed("${etagSystem}/bin/switch-to-configuration test >&2");
|
"curl -v '{}' 2>&1 | sed -n -e \"s/^< [Ee][Tt][Aa][Gg]: *//p\"".format(url)
|
||||||
$webserver->sleep(1); # race condition
|
)
|
||||||
my $newEtag = checkEtag;
|
etag = etag.replace("\r\n", " ")
|
||||||
die "Old ETag $oldEtag is the same as $newEtag" if $oldEtag eq $newEtag;
|
http_code = webserver.succeed(
|
||||||
};
|
"curl -w \"%{{http_code}}\" -X HEAD -H 'If-None-Match: {}' {}".format(etag, url)
|
||||||
|
)
|
||||||
|
assert int(http_code) == 304, "HTTP code is not 304"
|
||||||
|
return etag
|
||||||
|
|
||||||
subtest "config is reloaded on nixos-rebuild switch", sub {
|
|
||||||
$webserver->succeed("${justReloadSystem}/bin/switch-to-configuration test >&2");
|
with subtest("check ETag if serving Nix store paths"):
|
||||||
$webserver->waitForOpenPort("8080");
|
old_etag = check_etag(url)
|
||||||
};
|
webserver.succeed(
|
||||||
|
"${etagSystem}/bin/switch-to-configuration test >&2"
|
||||||
|
)
|
||||||
|
webserver.sleep(1)
|
||||||
|
new_etag = check_etag(url)
|
||||||
|
assert old_etag != new_etag, "Old ETag {} is the same as {}".format(
|
||||||
|
old_etag, new_etag
|
||||||
|
)
|
||||||
|
|
||||||
|
with subtest("config is reloaded on nixos-rebuild switch"):
|
||||||
|
webserver.succeed(
|
||||||
|
"${justReloadSystem}/bin/switch-to-configuration test >&2"
|
||||||
|
)
|
||||||
|
webserver.wait_for_open_port("8080")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... } : {
|
import ./make-test-python.nix ({ pkgs, ... } : {
|
||||||
name = "cadvisor";
|
name = "cadvisor";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ offline ];
|
maintainers = [ offline ];
|
||||||
@ -16,20 +16,19 @@ import ./make-test.nix ({ pkgs, ... } : {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript =
|
testScript = ''
|
||||||
''
|
start_all()
|
||||||
startAll;
|
machine.wait_for_unit("cadvisor.service")
|
||||||
$machine->waitForUnit("cadvisor.service");
|
machine.succeed("curl http://localhost:8080/containers/")
|
||||||
$machine->succeed("curl http://localhost:8080/containers/");
|
|
||||||
|
|
||||||
$influxdb->waitForUnit("influxdb.service");
|
influxdb.wait_for_unit("influxdb.service")
|
||||||
|
|
||||||
# create influxdb database
|
# create influxdb database
|
||||||
$influxdb->succeed(q~
|
influxdb.succeed(
|
||||||
curl -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE root"
|
'curl -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE root"'
|
||||||
~);
|
)
|
||||||
|
|
||||||
$influxdb->waitForUnit("cadvisor.service");
|
influxdb.wait_for_unit("cadvisor.service")
|
||||||
$influxdb->succeed("curl http://localhost:8080/containers/");
|
influxdb.succeed("curl http://localhost:8080/containers/")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, lib, ... }:
|
import ./make-test-python.nix ({ pkgs, lib, ... }:
|
||||||
let
|
let
|
||||||
# Change this to test a different version of Cassandra:
|
# Change this to test a different version of Cassandra:
|
||||||
testPackage = pkgs.cassandra;
|
testPackage = pkgs.cassandra;
|
||||||
@ -9,13 +9,16 @@ let
|
|||||||
jmxRolesFile = ./cassandra-jmx-roles;
|
jmxRolesFile = ./cassandra-jmx-roles;
|
||||||
jmxAuthArgs = "-u ${(builtins.elemAt jmxRoles 0).username} -pw ${(builtins.elemAt jmxRoles 0).password}";
|
jmxAuthArgs = "-u ${(builtins.elemAt jmxRoles 0).username} -pw ${(builtins.elemAt jmxRoles 0).password}";
|
||||||
jmxPort = 7200; # Non-standard port so it doesn't accidentally work
|
jmxPort = 7200; # Non-standard port so it doesn't accidentally work
|
||||||
|
jmxPortStr = toString jmxPort;
|
||||||
|
|
||||||
# Would usually be assigned to 512M
|
# Would usually be assigned to 512M.
|
||||||
|
# Set it to a different value, so that we can check whether our config
|
||||||
|
# actually changes it.
|
||||||
numMaxHeapSize = "400";
|
numMaxHeapSize = "400";
|
||||||
getHeapLimitCommand = ''
|
getHeapLimitCommand = ''
|
||||||
nodetool info -p ${toString jmxPort} | grep "^Heap Memory" | awk \'{print $NF}\'
|
nodetool info -p ${jmxPortStr} | grep "^Heap Memory" | awk '{print $NF}'
|
||||||
'';
|
'';
|
||||||
checkHeapLimitCommand = ''
|
checkHeapLimitCommand = pkgs.writeShellScript "check-heap-limit.sh" ''
|
||||||
[ 1 -eq "$(echo "$(${getHeapLimitCommand}) < ${numMaxHeapSize}" | ${pkgs.bc}/bin/bc)" ]
|
[ 1 -eq "$(echo "$(${getHeapLimitCommand}) < ${numMaxHeapSize}" | ${pkgs.bc}/bin/bc)" ]
|
||||||
'';
|
'';
|
||||||
|
|
||||||
@ -44,7 +47,10 @@ let
|
|||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
name = "cassandra-ci";
|
name = "cassandra";
|
||||||
|
meta = {
|
||||||
|
maintainers = with lib.maintainers; [ johnazoidberg ];
|
||||||
|
};
|
||||||
|
|
||||||
nodes = {
|
nodes = {
|
||||||
cass0 = nodeCfg "192.168.1.1" {};
|
cass0 = nodeCfg "192.168.1.1" {};
|
||||||
@ -52,66 +58,74 @@ in
|
|||||||
cass2 = nodeCfg "192.168.1.3" { jvmOpts = [ "-Dcassandra.replace_address=cass1" ]; };
|
cass2 = nodeCfg "192.168.1.3" { jvmOpts = [ "-Dcassandra.replace_address=cass1" ]; };
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = let
|
testScript = ''
|
||||||
jmxPortS = toString jmxPort;
|
|
||||||
in ''
|
|
||||||
# Check configuration
|
# Check configuration
|
||||||
subtest "Timers exist", sub {
|
with subtest("Timers exist"):
|
||||||
$cass0->succeed("systemctl list-timers | grep cassandra-full-repair.timer");
|
cass0.succeed("systemctl list-timers | grep cassandra-full-repair.timer")
|
||||||
$cass0->succeed("systemctl list-timers | grep cassandra-incremental-repair.timer");
|
cass0.succeed("systemctl list-timers | grep cassandra-incremental-repair.timer")
|
||||||
};
|
|
||||||
subtest "Can connect via cqlsh", sub {
|
with subtest("Can connect via cqlsh"):
|
||||||
$cass0->waitForUnit("cassandra.service");
|
cass0.wait_for_unit("cassandra.service")
|
||||||
$cass0->waitUntilSucceeds("nc -z cass0 9042");
|
cass0.wait_until_succeeds("nc -z cass0 9042")
|
||||||
$cass0->succeed("echo 'show version;' | cqlsh cass0");
|
cass0.succeed("echo 'show version;' | cqlsh cass0")
|
||||||
};
|
|
||||||
subtest "Nodetool is operational", sub {
|
with subtest("Nodetool is operational"):
|
||||||
$cass0->waitForUnit("cassandra.service");
|
cass0.wait_for_unit("cassandra.service")
|
||||||
$cass0->waitUntilSucceeds("nc -z localhost ${jmxPortS}");
|
cass0.wait_until_succeeds("nc -z localhost ${jmxPortStr}")
|
||||||
$cass0->succeed("nodetool status -p ${jmxPortS} --resolve-ip | egrep '^UN[[:space:]]+cass0'");
|
cass0.succeed("nodetool status -p ${jmxPortStr} --resolve-ip | egrep '^UN[[:space:]]+cass0'")
|
||||||
};
|
|
||||||
subtest "Cluster name was set", sub {
|
with subtest("Cluster name was set"):
|
||||||
$cass0->waitForUnit("cassandra.service");
|
cass0.wait_for_unit("cassandra.service")
|
||||||
$cass0->waitUntilSucceeds("nc -z localhost ${jmxPortS}");
|
cass0.wait_until_succeeds("nc -z localhost ${jmxPortStr}")
|
||||||
$cass0->waitUntilSucceeds("nodetool describecluster -p ${jmxPortS} | grep 'Name: ${clusterName}'");
|
cass0.wait_until_succeeds(
|
||||||
};
|
"nodetool describecluster -p ${jmxPortStr} | grep 'Name: ${clusterName}'"
|
||||||
subtest "Heap limit set correctly", sub {
|
)
|
||||||
# Nodetool takes a while until it can display info
|
|
||||||
$cass0->waitUntilSucceeds('nodetool info -p ${jmxPortS}');
|
with subtest("Heap limit set correctly"):
|
||||||
$cass0->succeed('${checkHeapLimitCommand}');
|
# Nodetool takes a while until it can display info
|
||||||
};
|
cass0.wait_until_succeeds("nodetool info -p ${jmxPortStr}")
|
||||||
|
cass0.succeed("${checkHeapLimitCommand}")
|
||||||
|
|
||||||
# Check cluster interaction
|
# Check cluster interaction
|
||||||
subtest "Bring up cluster", sub {
|
with subtest("Bring up cluster"):
|
||||||
$cass1->waitForUnit("cassandra.service");
|
cass1.wait_for_unit("cassandra.service")
|
||||||
$cass1->waitUntilSucceeds("nodetool -p ${jmxPortS} ${jmxAuthArgs} status | egrep -c '^UN' | grep 2");
|
cass1.wait_until_succeeds(
|
||||||
$cass0->succeed("nodetool status -p ${jmxPortS} --resolve-ip | egrep '^UN[[:space:]]+cass1'");
|
"nodetool -p ${jmxPortStr} ${jmxAuthArgs} status | egrep -c '^UN' | grep 2"
|
||||||
};
|
)
|
||||||
|
cass0.succeed("nodetool status -p ${jmxPortStr} --resolve-ip | egrep '^UN[[:space:]]+cass1'")
|
||||||
'' + lib.optionalString testRemoteAuth ''
|
'' + lib.optionalString testRemoteAuth ''
|
||||||
subtest "Remote authenticated jmx", sub {
|
with subtest("Remote authenticated jmx"):
|
||||||
# Doesn't work if not enabled
|
# Doesn't work if not enabled
|
||||||
$cass0->waitUntilSucceeds("nc -z localhost ${jmxPortS}");
|
cass0.wait_until_succeeds("nc -z localhost ${jmxPortStr}")
|
||||||
$cass1->fail("nc -z 192.168.1.1 ${toString jmxPort}");
|
cass1.fail("nc -z 192.168.1.1 ${jmxPortStr}")
|
||||||
$cass1->fail("nodetool -p ${jmxPortS} -h 192.168.1.1 status");
|
cass1.fail("nodetool -p ${jmxPortStr} -h 192.168.1.1 status")
|
||||||
|
|
||||||
# Works if enabled
|
# Works if enabled
|
||||||
$cass1->waitUntilSucceeds("nc -z localhost ${toString jmxPort}");
|
cass1.wait_until_succeeds("nc -z localhost ${jmxPortStr}")
|
||||||
$cass0->succeed("nodetool -p ${jmxPortS} -h 192.168.1.2 ${jmxAuthArgs} status");
|
cass0.succeed("nodetool -p ${jmxPortStr} -h 192.168.1.2 ${jmxAuthArgs} status")
|
||||||
};
|
|
||||||
'' + ''
|
'' + ''
|
||||||
subtest "Break and fix node", sub {
|
with subtest("Break and fix node"):
|
||||||
$cass1->block;
|
cass1.block()
|
||||||
$cass0->waitUntilSucceeds("nodetool status -p ${jmxPortS} --resolve-ip | egrep -c '^DN[[:space:]]+cass1'");
|
cass0.wait_until_succeeds(
|
||||||
$cass0->succeed("nodetool status -p ${jmxPortS} | egrep -c '^UN' | grep 1");
|
"nodetool status -p ${jmxPortStr} --resolve-ip | egrep -c '^DN[[:space:]]+cass1'"
|
||||||
$cass1->unblock;
|
)
|
||||||
$cass1->waitUntilSucceeds("nodetool -p ${jmxPortS} ${jmxAuthArgs} status | egrep -c '^UN' | grep 2");
|
cass0.succeed("nodetool status -p ${jmxPortStr} | egrep -c '^UN' | grep 1")
|
||||||
$cass0->succeed("nodetool status -p ${jmxPortS} | egrep -c '^UN' | grep 2");
|
cass1.unblock()
|
||||||
};
|
cass1.wait_until_succeeds(
|
||||||
subtest "Replace crashed node", sub {
|
"nodetool -p ${jmxPortStr} ${jmxAuthArgs} status | egrep -c '^UN' | grep 2"
|
||||||
$cass1->crash;
|
)
|
||||||
$cass2->waitForUnit("cassandra.service");
|
cass0.succeed("nodetool status -p ${jmxPortStr} | egrep -c '^UN' | grep 2")
|
||||||
$cass0->waitUntilFails("nodetool status -p ${jmxPortS} --resolve-ip | egrep '^UN[[:space:]]+cass1'");
|
|
||||||
$cass0->waitUntilSucceeds("nodetool status -p ${jmxPortS} --resolve-ip | egrep '^UN[[:space:]]+cass2'");
|
with subtest("Replace crashed node"):
|
||||||
};
|
cass1.block() # .crash() waits until it's fully shutdown
|
||||||
|
cass2.start()
|
||||||
|
cass0.wait_until_fails(
|
||||||
|
"nodetool status -p ${jmxPortStr} --resolve-ip | egrep '^UN[[:space:]]+cass1'"
|
||||||
|
)
|
||||||
|
|
||||||
|
cass2.wait_for_unit("cassandra.service")
|
||||||
|
cass0.wait_until_succeeds(
|
||||||
|
"nodetool status -p ${jmxPortStr} --resolve-ip | egrep '^UN[[:space:]]+cass2'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
pkgs ? import ../.. { inherit system config; }
|
pkgs ? import ../.. { inherit system config; }
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with import ../lib/testing.nix { inherit system pkgs; };
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
||||||
let
|
let
|
||||||
mkSpec = { host, service ? null, action }: {
|
mkSpec = { host, service ? null, action }: {
|
||||||
inherit action;
|
inherit action;
|
||||||
@ -123,17 +123,17 @@ in
|
|||||||
)));
|
)));
|
||||||
};
|
};
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->waitForUnit('cfssl.service');
|
machine.wait_for_unit("cfssl.service")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/decl.example.org-ca.pem');
|
machine.wait_until_succeeds("ls /tmp/decl.example.org-ca.pem")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/decl.example.org-key.pem');
|
machine.wait_until_succeeds("ls /tmp/decl.example.org-key.pem")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/decl.example.org-cert.pem');
|
machine.wait_until_succeeds("ls /tmp/decl.example.org-cert.pem")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/imp.example.org-ca.pem');
|
machine.wait_until_succeeds("ls /tmp/imp.example.org-ca.pem")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/imp.example.org-key.pem');
|
machine.wait_until_succeeds("ls /tmp/imp.example.org-key.pem")
|
||||||
$machine->waitUntilSucceeds('ls /tmp/imp.example.org-cert.pem');
|
machine.wait_until_succeeds("ls /tmp/imp.example.org-cert.pem")
|
||||||
$machine->waitForUnit('nginx.service');
|
machine.wait_for_unit("nginx.service")
|
||||||
$machine->succeed('[ "1" -lt "$(journalctl -u nginx | grep "Starting Nginx" | wc -l)" ]');
|
assert 1 < int(machine.succeed('journalctl -u nginx | grep "Starting Nginx" | wc -l'))
|
||||||
$machine->succeed('curl --cacert /tmp/imp.example.org-ca.pem https://imp.example.org');
|
machine.succeed("curl --cacert /tmp/imp.example.org-ca.pem https://imp.example.org")
|
||||||
$machine->succeed('curl --cacert /tmp/decl.example.org-ca.pem https://decl.example.org');
|
machine.succeed("curl --cacert /tmp/decl.example.org-ca.pem https://decl.example.org")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -143,8 +143,8 @@ in
|
|||||||
test = mkSpec { host = "command.example.org"; action = "touch /tmp/command.executed"; };
|
test = mkSpec { host = "command.example.org"; action = "touch /tmp/command.executed"; };
|
||||||
};
|
};
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->waitForUnit('cfssl.service');
|
machine.wait_for_unit("cfssl.service")
|
||||||
$machine->waitUntilSucceeds('stat /tmp/command.executed');
|
machine.wait_until_succeeds("stat /tmp/command.executed")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "cfssl";
|
name = "cfssl";
|
||||||
|
|
||||||
machine = { config, lib, pkgs, ... }:
|
machine = { config, lib, pkgs, ... }:
|
||||||
@ -60,8 +60,8 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
});
|
});
|
||||||
in
|
in
|
||||||
''
|
''
|
||||||
$machine->waitForUnit('cfssl.service');
|
machine.wait_for_unit("cfssl.service")
|
||||||
$machine->waitUntilSucceeds('${cfsslrequest}');
|
machine.wait_until_succeeds("${cfsslrequest}")
|
||||||
$machine->succeed('ls /tmp/certificate-key.pem');
|
machine.succeed("ls /tmp/certificate-key.pem")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -17,7 +17,7 @@ let
|
|||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "cjdns";
|
name = "cjdns";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ ehmry ];
|
maintainers = [ ehmry ];
|
||||||
@ -83,36 +83,39 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
|
|
||||||
testScript =
|
testScript =
|
||||||
''
|
''
|
||||||
startAll;
|
import re
|
||||||
|
|
||||||
$alice->waitForUnit("cjdns.service");
|
start_all()
|
||||||
$bob->waitForUnit("cjdns.service");
|
|
||||||
$carol->waitForUnit("cjdns.service");
|
|
||||||
|
|
||||||
sub cjdnsIp {
|
alice.wait_for_unit("cjdns.service")
|
||||||
my ($machine) = @_;
|
bob.wait_for_unit("cjdns.service")
|
||||||
my $ip = (split /[ \/]+/, $machine->succeed("ip -o -6 addr show dev tun0"))[3];
|
carol.wait_for_unit("cjdns.service")
|
||||||
$machine->log("has ip $ip");
|
|
||||||
return $ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $aliceIp6 = cjdnsIp $alice;
|
|
||||||
my $bobIp6 = cjdnsIp $bob;
|
def cjdns_ip(machine):
|
||||||
my $carolIp6 = cjdnsIp $carol;
|
res = machine.succeed("ip -o -6 addr show dev tun0")
|
||||||
|
ip = re.split("\s+|/", res)[3]
|
||||||
|
machine.log("has ip {}".format(ip))
|
||||||
|
return ip
|
||||||
|
|
||||||
|
|
||||||
|
alice_ip6 = cjdns_ip(alice)
|
||||||
|
bob_ip6 = cjdns_ip(bob)
|
||||||
|
carol_ip6 = cjdns_ip(carol)
|
||||||
|
|
||||||
# ping a few times each to let the routing table establish itself
|
# ping a few times each to let the routing table establish itself
|
||||||
|
|
||||||
$alice->succeed("ping -c 4 $carolIp6");
|
alice.succeed("ping -c 4 {}".format(carol_ip6))
|
||||||
$bob->succeed("ping -c 4 $carolIp6");
|
bob.succeed("ping -c 4 {}".format(carol_ip6))
|
||||||
|
|
||||||
$carol->succeed("ping -c 4 $aliceIp6");
|
carol.succeed("ping -c 4 {}".format(alice_ip6))
|
||||||
$carol->succeed("ping -c 4 $bobIp6");
|
carol.succeed("ping -c 4 {}".format(bob_ip6))
|
||||||
|
|
||||||
$alice->succeed("ping -c 4 $bobIp6");
|
alice.succeed("ping -c 4 {}".format(bob_ip6))
|
||||||
$bob->succeed("ping -c 4 $aliceIp6");
|
bob.succeed("ping -c 4 {}".format(alice_ip6))
|
||||||
|
|
||||||
$alice->waitForUnit("httpd.service");
|
alice.wait_for_unit("httpd.service")
|
||||||
|
|
||||||
$bob->succeed("curl --fail -g http://[$aliceIp6]");
|
bob.succeed("curl --fail -g http://[{}]".format(alice_ip6))
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
pkgs ? import ../.. { inherit system config; }
|
pkgs ? import ../.. { inherit system config; }
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with import ../lib/testing.nix { inherit system pkgs; };
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
||||||
with pkgs.lib;
|
with pkgs.lib;
|
||||||
|
|
||||||
let
|
let
|
||||||
@ -30,6 +30,7 @@ let
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in makeTest {
|
in makeTest {
|
||||||
|
name = "cloud-init";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ lewo ];
|
maintainers = [ lewo ];
|
||||||
};
|
};
|
||||||
@ -40,10 +41,12 @@ in makeTest {
|
|||||||
services.cloud-init.enable = true;
|
services.cloud-init.enable = true;
|
||||||
};
|
};
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->start;
|
machine.start()
|
||||||
$machine->waitForUnit("cloud-init.service");
|
machine.wait_for_unit("cloud-init.service")
|
||||||
$machine->succeed("cat /tmp/cloudinit-write-file | grep -q 'cloudinit'");
|
machine.succeed("cat /tmp/cloudinit-write-file | grep -q 'cloudinit'")
|
||||||
|
|
||||||
$machine->waitUntilSucceeds("cat /root/.ssh/authorized_keys | grep -q 'should be a key!'");
|
machine.wait_until_succeeds(
|
||||||
|
"cat /root/.ssh/authorized_keys | grep -q 'should be a key!'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "colord";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.colord.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.colord.installedTests}/share'");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, lib, ...}:
|
import ./make-test-python.nix ({ pkgs, lib, ...}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
@ -35,22 +35,42 @@ with lib;
|
|||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
in ''
|
in ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$couchdb1->waitForUnit("couchdb.service");
|
couchdb1.wait_for_unit("couchdb.service")
|
||||||
$couchdb1->waitUntilSucceeds("${curlJqCheck "GET" "" ".couchdb" "Welcome"}");
|
couchdb1.wait_until_succeeds(
|
||||||
$couchdb1->waitUntilSucceeds("${curlJqCheck "GET" "_all_dbs" ". | length" "2"}");
|
"${curlJqCheck "GET" "" ".couchdb" "Welcome"}"
|
||||||
$couchdb1->succeed("${curlJqCheck "PUT" "foo" ".ok" "true"}");
|
)
|
||||||
$couchdb1->succeed("${curlJqCheck "GET" "_all_dbs" ". | length" "3"}");
|
couchdb1.wait_until_succeeds(
|
||||||
$couchdb1->succeed("${curlJqCheck "DELETE" "foo" ".ok" "true"}");
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "2"}"
|
||||||
$couchdb1->succeed("${curlJqCheck "GET" "_all_dbs" ". | length" "2"}");
|
)
|
||||||
|
couchdb1.succeed("${curlJqCheck "PUT" "foo" ".ok" "true"}")
|
||||||
|
couchdb1.succeed(
|
||||||
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "3"}"
|
||||||
|
)
|
||||||
|
couchdb1.succeed(
|
||||||
|
"${curlJqCheck "DELETE" "foo" ".ok" "true"}"
|
||||||
|
)
|
||||||
|
couchdb1.succeed(
|
||||||
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "2"}"
|
||||||
|
)
|
||||||
|
|
||||||
$couchdb2->waitForUnit("couchdb.service");
|
couchdb2.wait_for_unit("couchdb.service")
|
||||||
$couchdb2->waitUntilSucceeds("${curlJqCheck "GET" "" ".couchdb" "Welcome"}");
|
couchdb2.wait_until_succeeds(
|
||||||
$couchdb2->waitUntilSucceeds("${curlJqCheck "GET" "_all_dbs" ". | length" "0"}");
|
"${curlJqCheck "GET" "" ".couchdb" "Welcome"}"
|
||||||
$couchdb2->succeed("${curlJqCheck "PUT" "foo" ".ok" "true"}");
|
)
|
||||||
$couchdb2->succeed("${curlJqCheck "GET" "_all_dbs" ". | length" "1"}");
|
couchdb2.wait_until_succeeds(
|
||||||
$couchdb2->succeed("${curlJqCheck "DELETE" "foo" ".ok" "true"}");
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "0"}"
|
||||||
$couchdb2->succeed("${curlJqCheck "GET" "_all_dbs" ". | length" "0"}");
|
)
|
||||||
|
couchdb2.succeed("${curlJqCheck "PUT" "foo" ".ok" "true"}")
|
||||||
|
couchdb2.succeed(
|
||||||
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "1"}"
|
||||||
|
)
|
||||||
|
couchdb2.succeed(
|
||||||
|
"${curlJqCheck "DELETE" "foo" ".ok" "true"}"
|
||||||
|
)
|
||||||
|
couchdb2.succeed(
|
||||||
|
"${curlJqCheck "GET" "_all_dbs" ". | length" "0"}"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }: {
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||||
name = "dnscrypt-proxy";
|
name = "dnscrypt-proxy";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ joachifm ];
|
maintainers = [ joachifm ];
|
||||||
@ -23,11 +23,13 @@ import ./make-test.nix ({ pkgs, ... }: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$client->waitForUnit("dnsmasq");
|
client.wait_for_unit("dnsmasq")
|
||||||
|
|
||||||
# The daemon is socket activated; sending a single ping should activate it.
|
# The daemon is socket activated; sending a single ping should activate it.
|
||||||
$client->fail("systemctl is-active dnscrypt-proxy");
|
client.fail("systemctl is-active dnscrypt-proxy")
|
||||||
$client->execute("${pkgs.iputils}/bin/ping -c1 example.com");
|
client.execute(
|
||||||
$client->waitUntilSucceeds("systemctl is-active dnscrypt-proxy");
|
"${pkgs.iputils}/bin/ping -c1 example.com"
|
||||||
|
)
|
||||||
|
client.wait_until_succeeds("systemctl is-active dnscrypt-proxy")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# This test runs docker and checks if simple container starts
|
# This test runs docker and checks if simple container starts
|
||||||
|
|
||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "docker";
|
name = "docker";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ nequissimus offline ];
|
maintainers = [ nequissimus offline ];
|
||||||
@ -31,17 +31,19 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$docker->waitForUnit("sockets.target");
|
docker.wait_for_unit("sockets.target")
|
||||||
$docker->succeed("tar cv --files-from /dev/null | docker import - scratchimg");
|
docker.succeed("tar cv --files-from /dev/null | docker import - scratchimg")
|
||||||
$docker->succeed("docker run -d --name=sleeping -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg /bin/sleep 10");
|
docker.succeed(
|
||||||
$docker->succeed("docker ps | grep sleeping");
|
"docker run -d --name=sleeping -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg /bin/sleep 10"
|
||||||
$docker->succeed("sudo -u hasprivs docker ps");
|
)
|
||||||
$docker->fail("sudo -u noprivs docker ps");
|
docker.succeed("docker ps | grep sleeping")
|
||||||
$docker->succeed("docker stop sleeping");
|
docker.succeed("sudo -u hasprivs docker ps")
|
||||||
|
docker.fail("sudo -u noprivs docker ps")
|
||||||
|
docker.succeed("docker stop sleeping")
|
||||||
|
|
||||||
# Must match version twice to ensure client and server versions are correct
|
# Must match version twice to ensure client and server versions are correct
|
||||||
$docker->succeed('[ $(docker version | grep ${pkgs.docker-edge.version} | wc -l) = "2" ]');
|
docker.succeed('[ $(docker version | grep ${pkgs.docker-edge.version} | wc -l) = "2" ]')
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# This test runs docker and checks if simple container starts
|
# This test runs docker and checks if simple container starts
|
||||||
|
|
||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "docker";
|
name = "docker";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ nequissimus offline ];
|
maintainers = [ nequissimus offline ];
|
||||||
@ -31,17 +31,19 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$docker->waitForUnit("sockets.target");
|
docker.wait_for_unit("sockets.target")
|
||||||
$docker->succeed("tar cv --files-from /dev/null | docker import - scratchimg");
|
docker.succeed("tar cv --files-from /dev/null | docker import - scratchimg")
|
||||||
$docker->succeed("docker run -d --name=sleeping -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg /bin/sleep 10");
|
docker.succeed(
|
||||||
$docker->succeed("docker ps | grep sleeping");
|
"docker run -d --name=sleeping -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg /bin/sleep 10"
|
||||||
$docker->succeed("sudo -u hasprivs docker ps");
|
)
|
||||||
$docker->fail("sudo -u noprivs docker ps");
|
docker.succeed("docker ps | grep sleeping")
|
||||||
$docker->succeed("docker stop sleeping");
|
docker.succeed("sudo -u hasprivs docker ps")
|
||||||
|
docker.fail("sudo -u noprivs docker ps")
|
||||||
|
docker.succeed("docker stop sleeping")
|
||||||
|
|
||||||
# Must match version twice to ensure client and server versions are correct
|
# Must match version twice to ensure client and server versions are correct
|
||||||
$docker->succeed('[ $(docker version | grep ${pkgs.docker.version} | wc -l) = "2" ]');
|
docker.succeed('[ $(docker version | grep ${pkgs.docker.version} | wc -l) = "2" ]')
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, lib, ...} : {
|
import ./make-test-python.nix ({ pkgs, lib, ...} : {
|
||||||
name = "documize";
|
name = "documize";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ ma27 ];
|
maintainers = [ ma27 ];
|
||||||
@ -29,30 +29,34 @@ import ./make-test.nix ({ pkgs, lib, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$machine->waitForUnit("documize-server.service");
|
machine.wait_for_unit("documize-server.service")
|
||||||
$machine->waitForOpenPort(3000);
|
machine.wait_for_open_port(3000)
|
||||||
|
|
||||||
my $dbhash = $machine->succeed("curl -f localhost:3000 "
|
dbhash = machine.succeed(
|
||||||
. " | grep 'property=\"dbhash' "
|
"curl -f localhost:3000 | grep 'property=\"dbhash' | grep -Po 'content=\"\\K[^\"]*'"
|
||||||
. " | grep -Po 'content=\"\\K[^\"]*'"
|
)
|
||||||
);
|
|
||||||
|
|
||||||
chomp($dbhash);
|
dbhash = dbhash.strip()
|
||||||
|
|
||||||
$machine->succeed("curl -X POST "
|
machine.succeed(
|
||||||
. "--data 'dbname=documize' "
|
(
|
||||||
. "--data 'dbhash=$dbhash' "
|
"curl -X POST"
|
||||||
. "--data 'title=NixOS' "
|
" --data 'dbname=documize'"
|
||||||
. "--data 'message=Docs' "
|
" --data 'dbhash={}'"
|
||||||
. "--data 'firstname=John' "
|
" --data 'title=NixOS'"
|
||||||
. "--data 'lastname=Doe' "
|
" --data 'message=Docs'"
|
||||||
. "--data 'email=john.doe\@nixos.org' "
|
" --data 'firstname=John'"
|
||||||
. "--data 'password=verysafe' "
|
" --data 'lastname=Doe'"
|
||||||
. "-f localhost:3000/api/setup"
|
" --data 'email=john.doe@nixos.org'"
|
||||||
);
|
" --data 'password=verysafe'"
|
||||||
|
" -f localhost:3000/api/setup"
|
||||||
|
).format(dbhash)
|
||||||
|
)
|
||||||
|
|
||||||
$machine->succeed('test "$(curl -f localhost:3000/api/public/meta | jq ".title" | xargs echo)" = "NixOS"');
|
machine.succeed(
|
||||||
|
'test "$(curl -f localhost:3000/api/public/meta | jq ".title" | xargs echo)" = "NixOS"'
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }: {
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||||
name = "firefox";
|
name = "firefox";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ eelco shlevy ];
|
maintainers = [ eelco shlevy ];
|
||||||
@ -11,19 +11,27 @@ import ./make-test.nix ({ pkgs, ... }: {
|
|||||||
environment.systemPackages = [ pkgs.firefox pkgs.xdotool ];
|
environment.systemPackages = [ pkgs.firefox pkgs.xdotool ];
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript =
|
testScript = ''
|
||||||
''
|
machine.wait_for_x()
|
||||||
$machine->waitForX;
|
|
||||||
$machine->execute("xterm -e 'firefox file://${pkgs.valgrind.doc}/share/doc/valgrind/html/index.html' &");
|
with subtest("wait until Firefox has finished loading the Valgrind docs page"):
|
||||||
$machine->waitForWindow(qr/Valgrind/);
|
machine.execute(
|
||||||
$machine->sleep(40); # wait until Firefox has finished loading the page
|
"xterm -e 'firefox file://${pkgs.valgrind.doc}/share/doc/valgrind/html/index.html' &"
|
||||||
$machine->execute("xdotool key space"); # do I want to make Firefox the
|
)
|
||||||
# default browser? I just want to close the dialog
|
machine.wait_for_window("Valgrind")
|
||||||
$machine->sleep(2); # wait until Firefox hides the default browser window
|
machine.sleep(40)
|
||||||
$machine->execute("xdotool key F12");
|
|
||||||
$machine->sleep(10); # wait until Firefox draws the developer tool panel
|
with subtest("Close default browser prompt"):
|
||||||
$machine->succeed("xwininfo -root -tree | grep Valgrind");
|
machine.execute("xdotool key space")
|
||||||
$machine->screenshot("screen");
|
|
||||||
|
with subtest("Hide default browser window"):
|
||||||
|
machine.sleep(2)
|
||||||
|
machine.execute("xdotool key F12")
|
||||||
|
|
||||||
|
with subtest("wait until Firefox draws the developer tool panel"):
|
||||||
|
machine.sleep(10)
|
||||||
|
machine.succeed("xwininfo -root -tree | grep Valgrind")
|
||||||
|
machine.screenshot("screen")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "flatpak-builder";
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.flatpak-builder.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
services.flatpak.enable = true;
|
|
||||||
xdg.portal.enable = true;
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing flatpak-builder ] ++ flatpak-builder.installedTestsDependencies;
|
|
||||||
virtualisation.diskSize = 2048;
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.flatpak-builder.installedTests}/share' --timeout 3600");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,26 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "flatpak";
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.flatpak.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
imports = [ ./common/x11.nix ];
|
|
||||||
services.xserver.desktopManager.gnome3.enable = true; # TODO: figure out minimal environment where the tests work
|
|
||||||
# common/x11.nix enables the auto display manager (lightdm)
|
|
||||||
services.xserver.displayManager.gdm.enable = false;
|
|
||||||
environment.gnome3.excludePackages = pkgs.gnome3.optionalPackages;
|
|
||||||
services.flatpak.enable = true;
|
|
||||||
environment.systemPackages = with pkgs; [ gnupg gnome-desktop-testing ostree python2 ];
|
|
||||||
virtualisation.memorySize = 2047;
|
|
||||||
virtualisation.diskSize = 1024;
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->waitForX();
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.flatpak.installedTests}/share' --timeout 3600");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,7 +1,12 @@
|
|||||||
import ./make-test.nix ({ lib, ... }:
|
import ./make-test-python.nix ({ lib, ... }:
|
||||||
{
|
{
|
||||||
name = "fontconfig-default-fonts";
|
name = "fontconfig-default-fonts";
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [
|
||||||
|
jtojnar
|
||||||
|
worldofpeace
|
||||||
|
];
|
||||||
|
|
||||||
machine = { config, pkgs, ... }: {
|
machine = { config, pkgs, ... }: {
|
||||||
fonts.enableDefaultFonts = true; # Background fonts
|
fonts.enableDefaultFonts = true; # Background fonts
|
||||||
fonts.fonts = with pkgs; [
|
fonts.fonts = with pkgs; [
|
||||||
@ -20,9 +25,9 @@ import ./make-test.nix ({ lib, ... }:
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->succeed("fc-match serif | grep '\"Gentium Plus\"'");
|
machine.succeed("fc-match serif | grep '\"Gentium Plus\"'")
|
||||||
$machine->succeed("fc-match sans-serif | grep '\"Cantarell\"'");
|
machine.succeed("fc-match sans-serif | grep '\"Cantarell\"'")
|
||||||
$machine->succeed("fc-match monospace | grep '\"Source Code Pro\"'");
|
machine.succeed("fc-match monospace | grep '\"Source Code Pro\"'")
|
||||||
$machine->succeed("fc-match emoji | grep '\"Twitter Color Emoji\"'");
|
machine.succeed("fc-match emoji | grep '\"Twitter Color Emoji\"'")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }: {
|
|
||||||
name = "fwupd";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.fwupd.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
services.fwupd.enable = true;
|
|
||||||
services.fwupd.blacklistPlugins = []; # don't blacklist test plugin
|
|
||||||
services.fwupd.enableTestRemote = true;
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
environment.variables.XDG_DATA_DIRS = [ "${pkgs.fwupd.installedTests}/share" ];
|
|
||||||
virtualisation.memorySize = 768;
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,21 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }: {
|
|
||||||
name = "gdk-pixbuf";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.gdk-pixbuf.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
environment.variables.XDG_DATA_DIRS = [ "${pkgs.gdk-pixbuf.installedTests}/share" ];
|
|
||||||
|
|
||||||
# Tests allocate a lot of memory trying to exploit a CVE
|
|
||||||
# but qemu-system-i386 has a 2047M memory limit
|
|
||||||
virtualisation.memorySize = if pkgs.stdenv.isi686 then 2047 else 4096;
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -t 1800"); # increase timeout to 1800s
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,19 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }: {
|
|
||||||
name = "gjs";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.gjs.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
imports = [ ./common/x11.nix ];
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
environment.variables.XDG_DATA_DIRS = [ "${pkgs.gjs.installedTests}/share" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->waitForX;
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,17 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "glib-networking";
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.glib-networking.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.glib-networking.installedTests}/share'");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,42 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, lib, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
|
|
||||||
# gsettings tool with access to gsettings-desktop-schemas
|
|
||||||
desktop-gsettings = with pkgs; stdenv.mkDerivation {
|
|
||||||
name = "desktop-gsettings";
|
|
||||||
dontUnpack = true;
|
|
||||||
nativeBuildInputs = [ glib wrapGAppsHook ];
|
|
||||||
buildInputs = [ gsettings-desktop-schemas ];
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
mkdir -p $out/bin
|
|
||||||
ln -s ${glib.bin}/bin/gsettings $out/bin/desktop-gsettings
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "gnome-photos";
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.gnome-photos.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
imports = [ ./common/x11.nix ];
|
|
||||||
programs.dconf.enable = true;
|
|
||||||
services.gnome3.at-spi2-core.enable = true; # needed for dogtail
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing desktop-gsettings ];
|
|
||||||
services.dbus.packages = with pkgs; [ gnome-photos ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->waitForX;
|
|
||||||
# dogtail needs accessibility enabled
|
|
||||||
$machine->succeed("desktop-gsettings set org.gnome.desktop.interface toolkit-accessibility true 2>&1");
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.gnome-photos.installedTests}/share' 2>&1");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ lib, pkgs, ... }:
|
import ./make-test-python.nix ({ lib, pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (lib) mkMerge nameValuePair maintainers;
|
inherit (lib) mkMerge nameValuePair maintainers;
|
||||||
@ -64,28 +64,34 @@ in {
|
|||||||
inherit nodes;
|
inherit nodes;
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll();
|
start_all()
|
||||||
|
|
||||||
subtest "Grafana sqlite", sub {
|
with subtest("Successful API query as admin user with sqlite db"):
|
||||||
$sqlite->waitForUnit("grafana.service");
|
sqlite.wait_for_unit("grafana.service")
|
||||||
$sqlite->waitForOpenPort(3000);
|
sqlite.wait_for_open_port(3000)
|
||||||
$sqlite->succeed("curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost");
|
sqlite.succeed(
|
||||||
};
|
"curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost"
|
||||||
|
)
|
||||||
|
sqlite.shutdown()
|
||||||
|
|
||||||
subtest "Grafana postgresql", sub {
|
with subtest("Successful API query as admin user with postgresql db"):
|
||||||
$postgresql->waitForUnit("grafana.service");
|
postgresql.wait_for_unit("grafana.service")
|
||||||
$postgresql->waitForUnit("postgresql.service");
|
postgresql.wait_for_unit("postgresql.service")
|
||||||
$postgresql->waitForOpenPort(3000);
|
postgresql.wait_for_open_port(3000)
|
||||||
$postgresql->waitForOpenPort(5432);
|
postgresql.wait_for_open_port(5432)
|
||||||
$postgresql->succeed("curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost");
|
postgresql.succeed(
|
||||||
};
|
"curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost"
|
||||||
|
)
|
||||||
|
postgresql.shutdown()
|
||||||
|
|
||||||
subtest "Grafana mysql", sub {
|
with subtest("Successful API query as admin user with mysql db"):
|
||||||
$mysql->waitForUnit("grafana.service");
|
mysql.wait_for_unit("grafana.service")
|
||||||
$mysql->waitForUnit("mysql.service");
|
mysql.wait_for_unit("mysql.service")
|
||||||
$mysql->waitForOpenPort(3000);
|
mysql.wait_for_open_port(3000)
|
||||||
$mysql->waitForOpenPort(3306);
|
mysql.wait_for_open_port(3306)
|
||||||
$mysql->succeed("curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost");
|
mysql.succeed(
|
||||||
};
|
"curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep -q testadmin\@localhost"
|
||||||
|
)
|
||||||
|
mysql.shutdown()
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "graphene";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.graphene.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.graphene.installedTests}/share'");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -16,6 +16,8 @@ import ./make-test.nix ({ pkgs, ...}: {
|
|||||||
frontend http
|
frontend http
|
||||||
bind *:80
|
bind *:80
|
||||||
mode http
|
mode http
|
||||||
|
option http-use-htx
|
||||||
|
http-request use-service prometheus-exporter if { path /metrics }
|
||||||
use_backend http_server
|
use_backend http_server
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@ -36,6 +38,6 @@ import ./make-test.nix ({ pkgs, ...}: {
|
|||||||
$machine->waitForUnit('haproxy.service');
|
$machine->waitForUnit('haproxy.service');
|
||||||
$machine->waitForUnit('httpd.service');
|
$machine->waitForUnit('httpd.service');
|
||||||
$machine->succeed('curl -k http://localhost:80/index.txt | grep "We are all good!"');
|
$machine->succeed('curl -k http://localhost:80/index.txt | grep "We are all good!"');
|
||||||
|
$machine->succeed('curl -k http://localhost:80/metrics | grep haproxy_process_pool_allocated_bytes');
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ../make-test.nix ({ lib, ... }:
|
import ../make-test-python.nix ({ lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "initrd-network-ssh";
|
name = "initrd-network-ssh";
|
||||||
@ -35,25 +35,31 @@ import ../make-test.nix ({ lib, ... }:
|
|||||||
client =
|
client =
|
||||||
{ config, ... }:
|
{ config, ... }:
|
||||||
{
|
{
|
||||||
environment.etc.knownHosts = {
|
environment.etc = {
|
||||||
text = concatStrings [
|
knownHosts = {
|
||||||
"server,"
|
text = concatStrings [
|
||||||
"${toString (head (splitString " " (
|
"server,"
|
||||||
toString (elemAt (splitString "\n" config.networking.extraHosts) 2)
|
"${toString (head (splitString " " (
|
||||||
)))} "
|
toString (elemAt (splitString "\n" config.networking.extraHosts) 2)
|
||||||
"${readFile ./dropbear.pub}"
|
)))} "
|
||||||
];
|
"${readFile ./dropbear.pub}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
sshKey = {
|
||||||
|
source = ./openssh.priv; # dont use this anywhere else
|
||||||
|
mode = "0600";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
$client->waitForUnit("network.target");
|
client.wait_for_unit("network.target")
|
||||||
$client->copyFileFromHost("${./openssh.priv}","/etc/sshKey");
|
client.wait_until_succeeds("ping -c 1 server")
|
||||||
$client->succeed("chmod 0600 /etc/sshKey");
|
client.succeed(
|
||||||
$client->waitUntilSucceeds("ping -c 1 server");
|
"ssh -i /etc/sshKey -o UserKnownHostsFile=/etc/knownHosts server 'touch /fnord'"
|
||||||
$client->succeed("ssh -i /etc/sshKey -o UserKnownHostsFile=/etc/knownHosts server 'touch /fnord'");
|
)
|
||||||
$client->shutdown;
|
client.shutdown()
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
5
nixos/tests/installed-tests/colord.nix
Normal file
5
nixos/tests/installed-tests/colord.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.colord;
|
||||||
|
}
|
80
nixos/tests/installed-tests/default.nix
Normal file
80
nixos/tests/installed-tests/default.nix
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# NixOS tests for gnome-desktop-testing-runner using software
|
||||||
|
# See https://wiki.gnome.org/Initiatives/GnomeGoals/InstalledTests
|
||||||
|
|
||||||
|
{ system ? builtins.currentSystem,
|
||||||
|
config ? {},
|
||||||
|
pkgs ? import ../../.. { inherit system config; }
|
||||||
|
}:
|
||||||
|
|
||||||
|
with import ../../lib/testing-python.nix { inherit system pkgs; };
|
||||||
|
with pkgs.lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
callInstalledTest = pkgs.newScope { inherit makeInstalledTest; };
|
||||||
|
|
||||||
|
makeInstalledTest =
|
||||||
|
{ # Package to test. Needs to have an installedTests output
|
||||||
|
tested
|
||||||
|
|
||||||
|
# Config to inject into machine
|
||||||
|
, testConfig ? {}
|
||||||
|
|
||||||
|
# Test script snippet to inject before gnome-desktop-testing-runner begins.
|
||||||
|
# This is useful for extra setup the environment may need before the runner begins.
|
||||||
|
, preTestScript ? ""
|
||||||
|
|
||||||
|
# Does test need X11?
|
||||||
|
, withX11 ? false
|
||||||
|
|
||||||
|
# Extra flags to pass to gnome-desktop-testing-runner.
|
||||||
|
, testRunnerFlags ? ""
|
||||||
|
}:
|
||||||
|
makeTest rec {
|
||||||
|
name = tested.name;
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
maintainers = tested.meta.maintainers;
|
||||||
|
};
|
||||||
|
|
||||||
|
machine = { ... }: {
|
||||||
|
imports = [
|
||||||
|
testConfig
|
||||||
|
] ++ optional withX11 ../common/x11.nix;
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript =
|
||||||
|
optionalString withX11 ''
|
||||||
|
machine.wait_for_x()
|
||||||
|
'' +
|
||||||
|
optionalString (preTestScript != "") ''
|
||||||
|
${preTestScript}
|
||||||
|
'' +
|
||||||
|
''
|
||||||
|
machine.succeed(
|
||||||
|
"gnome-desktop-testing-runner ${testRunnerFlags} -d '${tested.installedTests}/share'"
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
colord = callInstalledTest ./colord.nix {};
|
||||||
|
flatpak = callInstalledTest ./flatpak.nix {};
|
||||||
|
flatpak-builder = callInstalledTest ./flatpak-builder.nix {};
|
||||||
|
fwupd = callInstalledTest ./fwupd.nix {};
|
||||||
|
gcab = callInstalledTest ./gcab.nix {};
|
||||||
|
gdk-pixbuf = callInstalledTest ./gdk-pixbuf.nix {};
|
||||||
|
gjs = callInstalledTest ./gjs.nix {};
|
||||||
|
glib-networking = callInstalledTest ./glib-networking.nix {};
|
||||||
|
gnome-photos = callInstalledTest ./gnome-photos.nix {};
|
||||||
|
graphene = callInstalledTest ./graphene.nix {};
|
||||||
|
libgdata = callInstalledTest ./libgdata.nix {};
|
||||||
|
libxmlb = callInstalledTest ./libxmlb.nix {};
|
||||||
|
ostree = callInstalledTest ./ostree.nix {};
|
||||||
|
xdg-desktop-portal = callInstalledTest ./xdg-desktop-portal.nix {};
|
||||||
|
}
|
14
nixos/tests/installed-tests/flatpak-builder.nix
Normal file
14
nixos/tests/installed-tests/flatpak-builder.nix
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.flatpak-builder;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
xdg.portal.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [ flatpak-builder ] ++ flatpak-builder.installedTestsDependencies;
|
||||||
|
virtualisation.diskSize = 2048;
|
||||||
|
};
|
||||||
|
|
||||||
|
testRunnerFlags = "--timeout 3600";
|
||||||
|
}
|
19
nixos/tests/installed-tests/flatpak.nix
Normal file
19
nixos/tests/installed-tests/flatpak.nix
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.flatpak;
|
||||||
|
withX11 = true;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
services.xserver.desktopManager.gnome3.enable = true; # TODO: figure out minimal environment where the tests work
|
||||||
|
# common/x11.nix enables the auto display manager (lightdm)
|
||||||
|
services.xserver.displayManager.gdm.enable = false;
|
||||||
|
services.gnome3.core-utilities.enable = false;
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [ gnupg ostree python2 ];
|
||||||
|
virtualisation.memorySize = 2047;
|
||||||
|
virtualisation.diskSize = 1024;
|
||||||
|
};
|
||||||
|
|
||||||
|
testRunnerFlags = "--timeout 3600";
|
||||||
|
}
|
12
nixos/tests/installed-tests/fwupd.nix
Normal file
12
nixos/tests/installed-tests/fwupd.nix
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.fwupd;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
services.fwupd.enable = true;
|
||||||
|
services.fwupd.blacklistPlugins = []; # don't blacklist test plugin
|
||||||
|
services.fwupd.enableTestRemote = true;
|
||||||
|
virtualisation.memorySize = 768;
|
||||||
|
};
|
||||||
|
}
|
5
nixos/tests/installed-tests/gcab.nix
Normal file
5
nixos/tests/installed-tests/gcab.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.gcab;
|
||||||
|
}
|
13
nixos/tests/installed-tests/gdk-pixbuf.nix
Normal file
13
nixos/tests/installed-tests/gdk-pixbuf.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.gdk-pixbuf;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
# Tests allocate a lot of memory trying to exploit a CVE
|
||||||
|
# but qemu-system-i386 has a 2047M memory limit
|
||||||
|
virtualisation.memorySize = if pkgs.stdenv.isi686 then 2047 else 4096;
|
||||||
|
};
|
||||||
|
|
||||||
|
testRunnerFlags = "--timeout 1800";
|
||||||
|
}
|
6
nixos/tests/installed-tests/gjs.nix
Normal file
6
nixos/tests/installed-tests/gjs.nix
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.gjs;
|
||||||
|
withX11 = true;
|
||||||
|
}
|
5
nixos/tests/installed-tests/glib-networking.nix
Normal file
5
nixos/tests/installed-tests/glib-networking.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.glib-networking;
|
||||||
|
}
|
35
nixos/tests/installed-tests/gnome-photos.nix
Normal file
35
nixos/tests/installed-tests/gnome-photos.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.gnome-photos;
|
||||||
|
|
||||||
|
withX11 = true;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
programs.dconf.enable = true;
|
||||||
|
services.gnome3.at-spi2-core.enable = true; # needed for dogtail
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# gsettings tool with access to gsettings-desktop-schemas
|
||||||
|
(stdenv.mkDerivation {
|
||||||
|
name = "desktop-gsettings";
|
||||||
|
dontUnpack = true;
|
||||||
|
nativeBuildInputs = [ glib wrapGAppsHook ];
|
||||||
|
buildInputs = [ gsettings-desktop-schemas ];
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
mkdir -p $out/bin
|
||||||
|
ln -s ${glib.bin}/bin/gsettings $out/bin/desktop-gsettings
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
];
|
||||||
|
services.dbus.packages = with pkgs; [ gnome-photos ];
|
||||||
|
};
|
||||||
|
|
||||||
|
preTestScript = ''
|
||||||
|
# dogtail needs accessibility enabled
|
||||||
|
machine.succeed(
|
||||||
|
"desktop-gsettings set org.gnome.desktop.interface toolkit-accessibility true 2>&1"
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
}
|
5
nixos/tests/installed-tests/graphene.nix
Normal file
5
nixos/tests/installed-tests/graphene.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.graphene;
|
||||||
|
}
|
11
nixos/tests/installed-tests/libgdata.nix
Normal file
11
nixos/tests/installed-tests/libgdata.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.libgdata;
|
||||||
|
|
||||||
|
testConfig = {
|
||||||
|
# # GLib-GIO-DEBUG: _g_io_module_get_default: Found default implementation dummy (GDummyTlsBackend) for ‘gio-tls-backend’
|
||||||
|
# Bail out! libgdata:ERROR:../gdata/tests/common.c:134:gdata_test_init: assertion failed (child_error == NULL): TLS support is not available (g-tls-error-quark, 0)
|
||||||
|
services.gnome3.glib-networking.enable = true;
|
||||||
|
};
|
||||||
|
}
|
5
nixos/tests/installed-tests/libxmlb.nix
Normal file
5
nixos/tests/installed-tests/libxmlb.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.libxmlb;
|
||||||
|
}
|
23
nixos/tests/installed-tests/ostree.nix
Normal file
23
nixos/tests/installed-tests/ostree.nix
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{ pkgs, lib, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.ostree;
|
||||||
|
|
||||||
|
# TODO: Wrap/patch the tests directly in the package
|
||||||
|
testConfig = {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
(python3.withPackages (p: with p; [ pyyaml ]))
|
||||||
|
gnupg
|
||||||
|
ostree
|
||||||
|
];
|
||||||
|
|
||||||
|
# for GJS tests
|
||||||
|
environment.variables.GI_TYPELIB_PATH = lib.makeSearchPath "lib/girepository-1.0" (with pkgs; [
|
||||||
|
gtk3
|
||||||
|
pango.out
|
||||||
|
ostree
|
||||||
|
gdk-pixbuf
|
||||||
|
atk
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
5
nixos/tests/installed-tests/xdg-desktop-portal.nix
Normal file
5
nixos/tests/installed-tests/xdg-desktop-portal.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ pkgs, makeInstalledTest, ... }:
|
||||||
|
|
||||||
|
makeInstalledTest {
|
||||||
|
tested = pkgs.xdg-desktop-portal;
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "libgdata";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.libgdata.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
# # GLib-GIO-DEBUG: _g_io_module_get_default: Found default implementation dummy (GDummyTlsBackend) for ‘gio-tls-backend’
|
|
||||||
# Bail out! libgdata:ERROR:../gdata/tests/common.c:134:gdata_test_init: assertion failed (child_error == NULL): TLS support is not available (g-tls-error-quark, 0)
|
|
||||||
services.gnome3.glib-networking.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.libgdata.installedTests}/share'");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,17 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
name = "libxmlb";
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.libxmlb.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [ gnome-desktop-testing ];
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d '${pkgs.libxmlb.installedTests}/share'");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "lightdm";
|
name = "lightdm";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ aszlig worldofpeace ];
|
maintainers = [ aszlig worldofpeace ];
|
||||||
@ -18,12 +18,12 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
testScript = { nodes, ... }: let
|
testScript = { nodes, ... }: let
|
||||||
user = nodes.machine.config.users.users.alice;
|
user = nodes.machine.config.users.users.alice;
|
||||||
in ''
|
in ''
|
||||||
startAll;
|
start_all()
|
||||||
$machine->waitForText(qr/${user.description}/);
|
machine.wait_for_text("${user.description}")
|
||||||
$machine->screenshot("lightdm");
|
machine.screenshot("lightdm")
|
||||||
$machine->sendChars("${user.password}\n");
|
machine.send_chars("${user.password}\n")
|
||||||
$machine->waitForFile("/home/alice/.Xauthority");
|
machine.wait_for_file("${user.home}/.Xauthority")
|
||||||
$machine->succeed("xauth merge ~alice/.Xauthority");
|
machine.succeed("xauth merge ${user.home}/.Xauthority")
|
||||||
$machine->waitForWindow("^IceWM ");
|
machine.wait_for_window("^IceWM ")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ lib, pkgs, ... }:
|
import ./make-test-python.nix ({ lib, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "loki";
|
name = "loki";
|
||||||
@ -26,12 +26,14 @@ import ./make-test.nix ({ lib, pkgs, ... }:
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->start;
|
machine.start
|
||||||
$machine->waitForUnit("loki.service");
|
machine.wait_for_unit("loki.service")
|
||||||
$machine->waitForUnit("promtail.service");
|
machine.wait_for_unit("promtail.service")
|
||||||
$machine->waitForOpenPort(3100);
|
machine.wait_for_open_port(3100)
|
||||||
$machine->waitForOpenPort(9080);
|
machine.wait_for_open_port(9080)
|
||||||
$machine->succeed("echo 'Loki Ingestion Test' > /var/log/testlog");
|
machine.succeed("echo 'Loki Ingestion Test' > /var/log/testlog")
|
||||||
$machine->waitUntilSucceeds("${pkgs.grafana-loki}/bin/logcli --addr='http://localhost:3100' query --no-labels '{job=\"varlogs\",filename=\"/var/log/testlog\"}' | grep -q 'Loki Ingestion Test'");
|
machine.wait_until_succeeds(
|
||||||
|
"${pkgs.grafana-loki}/bin/logcli --addr='http://localhost:3100' query --no-labels '{job=\"varlogs\",filename=\"/var/log/testlog\"}' | grep -q 'Loki Ingestion Test'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... } : let
|
import ./make-test-python.nix ({ pkgs, ... } : let
|
||||||
|
|
||||||
|
|
||||||
runWithOpenSSL = file: cmd: pkgs.runCommand file {
|
runWithOpenSSL = file: cmd: pkgs.runCommand file {
|
||||||
@ -55,13 +55,17 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
$serverpostgres->waitForUnit("matrix-synapse.service");
|
serverpostgres.wait_for_unit("matrix-synapse.service")
|
||||||
$serverpostgres->waitUntilSucceeds("curl -L --cacert ${ca_pem} https://localhost:8448/");
|
serverpostgres.wait_until_succeeds(
|
||||||
$serverpostgres->requireActiveUnit("postgresql.service");
|
"curl -L --cacert ${ca_pem} https://localhost:8448/"
|
||||||
$serversqlite->waitForUnit("matrix-synapse.service");
|
)
|
||||||
$serversqlite->waitUntilSucceeds("curl -L --cacert ${ca_pem} https://localhost:8448/");
|
serverpostgres.require_unit_state("postgresql.service")
|
||||||
$serversqlite->mustSucceed("[ -e /var/lib/matrix-synapse/homeserver.db ]");
|
serversqlite.wait_for_unit("matrix-synapse.service")
|
||||||
|
serversqlite.wait_until_succeeds(
|
||||||
|
"curl -L --cacert ${ca_pem} https://localhost:8448/"
|
||||||
|
)
|
||||||
|
serversqlite.succeed("[ -e /var/lib/matrix-synapse/homeserver.db ]")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, lib, ... }: {
|
import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||||
name = "moodle";
|
name = "moodle";
|
||||||
meta.maintainers = [ lib.maintainers.aanderse ];
|
meta.maintainers = [ lib.maintainers.aanderse ];
|
||||||
|
|
||||||
@ -15,8 +15,8 @@ import ./make-test.nix ({ pkgs, lib, ... }: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
$machine->waitForUnit('phpfpm-moodle.service');
|
machine.wait_for_unit("phpfpm-moodle.service")
|
||||||
$machine->succeed('curl http://localhost/') =~ /You are not logged in/ or die;
|
machine.wait_until_succeeds("curl http://localhost/ | grep 'You are not logged in'")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }:
|
import ./make-test-python.nix ({ pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "morty";
|
name = "morty";
|
||||||
@ -22,11 +22,9 @@ import ./make-test.nix ({ pkgs, ... }:
|
|||||||
testScript =
|
testScript =
|
||||||
{ ... }:
|
{ ... }:
|
||||||
''
|
''
|
||||||
$mortyProxyWithKey->waitForUnit("default.target");
|
mortyProxyWithKey.wait_for_unit("default.target")
|
||||||
|
mortyProxyWithKey.wait_for_open_port(3001)
|
||||||
$mortyProxyWithKey->waitForOpenPort(3001);
|
mortyProxyWithKey.succeed("curl -L 127.0.0.1:3001 | grep MortyProxy")
|
||||||
$mortyProxyWithKey->succeed("curl -L 127.0.0.1:3001 | grep MortyProxy");
|
|
||||||
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix {
|
import ./make-test-python.nix {
|
||||||
name = "opensmtpd";
|
name = "opensmtpd";
|
||||||
|
|
||||||
nodes = {
|
nodes = {
|
||||||
@ -102,23 +102,23 @@ import ./make-test.nix {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$client->waitForUnit("network-online.target");
|
client.wait_for_unit("network-online.target")
|
||||||
$smtp1->waitForUnit('opensmtpd');
|
smtp1.wait_for_unit("opensmtpd")
|
||||||
$smtp2->waitForUnit('opensmtpd');
|
smtp2.wait_for_unit("opensmtpd")
|
||||||
$smtp2->waitForUnit('dovecot2');
|
smtp2.wait_for_unit("dovecot2")
|
||||||
|
|
||||||
# To prevent sporadic failures during daemon startup, make sure
|
# To prevent sporadic failures during daemon startup, make sure
|
||||||
# services are listening on their ports before sending requests
|
# services are listening on their ports before sending requests
|
||||||
$smtp1->waitForOpenPort(25);
|
smtp1.wait_for_open_port(25)
|
||||||
$smtp2->waitForOpenPort(25);
|
smtp2.wait_for_open_port(25)
|
||||||
$smtp2->waitForOpenPort(143);
|
smtp2.wait_for_open_port(143)
|
||||||
|
|
||||||
$client->succeed('send-a-test-mail');
|
client.succeed("send-a-test-mail")
|
||||||
$smtp1->waitUntilFails('smtpctl show queue | egrep .');
|
smtp1.wait_until_fails("smtpctl show queue | egrep .")
|
||||||
$smtp2->waitUntilFails('smtpctl show queue | egrep .');
|
smtp2.wait_until_fails("smtpctl show queue | egrep .")
|
||||||
$client->succeed('check-mail-landed >&2');
|
client.succeed("check-mail-landed >&2")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta.timeout = 30;
|
meta.timeout = 30;
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
# run installed tests
|
|
||||||
import ./make-test.nix ({ pkgs, lib, ... }: {
|
|
||||||
name = "ostree";
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
maintainers = pkgs.ostree.meta.maintainers;
|
|
||||||
};
|
|
||||||
|
|
||||||
# TODO: Wrap/patch the tests directly in the package
|
|
||||||
machine = { pkgs, ... }: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
gnome-desktop-testing ostree gnupg (python3.withPackages (p: with p; [ pyyaml ]))
|
|
||||||
];
|
|
||||||
|
|
||||||
environment.variables.GI_TYPELIB_PATH = lib.makeSearchPath "lib/girepository-1.0" (with pkgs; [ gtk3 pango.out ostree gdk-pixbuf atk ]); # for GJS tests
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
$machine->succeed("gnome-desktop-testing-runner -d ${pkgs.ostree.installedTests}/share");
|
|
||||||
'';
|
|
||||||
})
|
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }: {
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||||
name = "packagekit";
|
name = "packagekit";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ peterhoeg ];
|
maintainers = [ peterhoeg ];
|
||||||
@ -13,12 +13,14 @@ import ./make-test.nix ({ pkgs, ... }: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
# send a dbus message to activate the service
|
# send a dbus message to activate the service
|
||||||
$machine->succeed("dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.PackageKit /org/freedesktop/PackageKit org.freedesktop.DBus.Introspectable.Introspect");
|
machine.succeed(
|
||||||
|
"dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.PackageKit /org/freedesktop/PackageKit org.freedesktop.DBus.Introspectable.Introspect"
|
||||||
|
)
|
||||||
|
|
||||||
# so now it should be running
|
# so now it should be running
|
||||||
$machine->succeed("systemctl is-active packagekit.service");
|
machine.wait_for_unit("packagekit.service")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,12 +1,5 @@
|
|||||||
import ./make-test.nix ({ pkgs, lib, ...}:
|
import ./make-test-python.nix ({ pkgs, lib, ...}:
|
||||||
let
|
|
||||||
test = with pkgs; runCommand "patch-test" {
|
|
||||||
nativeBuildInputs = [ pgjwt ];
|
|
||||||
}
|
|
||||||
''
|
|
||||||
sed -e '12 i CREATE EXTENSION pgcrypto;\nCREATE EXTENSION pgtap;\nSET search_path TO tap,public;' ${pgjwt.src}/test.sql > $out;
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
with pkgs; {
|
with pkgs; {
|
||||||
name = "pgjwt";
|
name = "pgjwt";
|
||||||
meta = with lib.maintainers; {
|
meta = with lib.maintainers; {
|
||||||
@ -29,9 +22,13 @@ with pkgs; {
|
|||||||
pgProve = "${pkgs.perlPackages.TAPParserSourceHandlerpgTAP}";
|
pgProve = "${pkgs.perlPackages.TAPParserSourceHandlerpgTAP}";
|
||||||
in
|
in
|
||||||
''
|
''
|
||||||
startAll;
|
start_all()
|
||||||
$master->waitForUnit("postgresql");
|
master.wait_for_unit("postgresql")
|
||||||
$master->copyFileFromHost("${test}","/tmp/test.sql");
|
master.succeed(
|
||||||
$master->succeed("${pkgs.sudo}/bin/sudo -u ${sqlSU} PGOPTIONS=--search_path=tap,public ${pgProve}/bin/pg_prove -d postgres -v -f /tmp/test.sql");
|
"${pkgs.gnused}/bin/sed -e '12 i CREATE EXTENSION pgcrypto;\\nCREATE EXTENSION pgtap;\\nSET search_path TO tap,public;' ${pgjwt.src}/test.sql > /tmp/test.sql"
|
||||||
|
)
|
||||||
|
master.succeed(
|
||||||
|
"${pkgs.sudo}/bin/sudo -u ${sqlSU} PGOPTIONS=--search_path=tap,public ${pgProve}/bin/pg_prove -d postgres -v -f /tmp/test.sql"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }: {
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
||||||
name = "powerdns";
|
name = "powerdns";
|
||||||
|
|
||||||
nodes.server = { ... }: {
|
nodes.server = { ... }: {
|
||||||
services.powerdns.enable = true;
|
services.powerdns.enable = true;
|
||||||
|
environment.systemPackages = [ pkgs.dnsutils ];
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$server->waitForUnit("pdns");
|
server.wait_for_unit("pdns")
|
||||||
$server->succeed("${pkgs.dnsutils}/bin/dig version.bind txt chaos \@127.0.0.1");
|
server.succeed("dig version.bind txt chaos \@127.0.0.1")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix (
|
import ./make-test-python.nix (
|
||||||
let
|
let
|
||||||
chap-secrets = {
|
chap-secrets = {
|
||||||
text = ''"flynn" * "reindeerflotilla" *'';
|
text = ''"flynn" * "reindeerflotilla" *'';
|
||||||
@ -53,10 +53,10 @@ import ./make-test.nix (
|
|||||||
environment.etc."ppp/chap-secrets" = chap-secrets;
|
environment.etc."ppp/chap-secrets" = chap-secrets;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
$client->waitUntilSucceeds("ping -c1 -W1 192.0.2.1");
|
client.wait_until_succeeds("ping -c1 -W1 192.0.2.1")
|
||||||
$server->waitUntilSucceeds("ping -c1 -W1 192.0.2.2");
|
server.wait_until_succeeds("ping -c1 -W1 192.0.2.2")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -4,12 +4,10 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (import ../lib/testing.nix { inherit system pkgs; }) makeTest;
|
inherit (import ../lib/testing-python.nix { inherit system pkgs; }) makeTest;
|
||||||
inherit (pkgs.lib) concatStringsSep maintainers mapAttrs mkMerge
|
inherit (pkgs.lib) concatStringsSep maintainers mapAttrs mkMerge
|
||||||
removeSuffix replaceChars singleton splitString;
|
removeSuffix replaceChars singleton splitString;
|
||||||
|
|
||||||
escape' = str: replaceChars [''"'' "$" "\n"] [''\\\"'' "\\$" ""] str;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The attrset `exporterTests` contains one attribute
|
* The attrset `exporterTests` contains one attribute
|
||||||
* for each exporter test. Each of these attributes
|
* for each exporter test. Each of these attributes
|
||||||
@ -33,9 +31,9 @@ let
|
|||||||
* services.<metricProvider>.enable = true;
|
* services.<metricProvider>.enable = true;
|
||||||
* };
|
* };
|
||||||
* exporterTest = ''
|
* exporterTest = ''
|
||||||
* waitForUnit("prometheus-<exporterName>-exporter.service");
|
* wait_for_unit("prometheus-<exporterName>-exporter.service")
|
||||||
* waitForOpenPort("1234");
|
* wait_for_open_port("1234")
|
||||||
* succeed("curl -sSf 'localhost:1234/metrics'");
|
* succeed("curl -sSf 'localhost:1234/metrics'")
|
||||||
* '';
|
* '';
|
||||||
* };
|
* };
|
||||||
*
|
*
|
||||||
@ -49,11 +47,11 @@ let
|
|||||||
* };
|
* };
|
||||||
*
|
*
|
||||||
* testScript = ''
|
* testScript = ''
|
||||||
* $<exporterName>->start();
|
* <exporterName>.start()
|
||||||
* $<exporterName>->waitForUnit("prometheus-<exporterName>-exporter.service");
|
* <exporterName>.wait_for_unit("prometheus-<exporterName>-exporter.service")
|
||||||
* $<exporterName>->waitForOpenPort("1234");
|
* <exporterName>.wait_for_open_port("1234")
|
||||||
* $<exporterName>->succeed("curl -sSf 'localhost:1234/metrics'");
|
* <exporterName>.succeed("curl -sSf 'localhost:1234/metrics'")
|
||||||
* $<exporterName>->shutdown();
|
* <exporterName>.shutdown()
|
||||||
* '';
|
* '';
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -72,9 +70,11 @@ let
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-bind-exporter.service");
|
wait_for_unit("prometheus-bind-exporter.service")
|
||||||
waitForOpenPort(9119);
|
wait_for_open_port(9119)
|
||||||
succeed("curl -sSf http://localhost:9119/metrics | grep -q 'bind_query_recursions_total 0'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9119/metrics | grep -q 'bind_query_recursions_total 0'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -89,9 +89,11 @@ let
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-blackbox-exporter.service");
|
wait_for_unit("prometheus-blackbox-exporter.service")
|
||||||
waitForOpenPort(9115);
|
wait_for_open_port(9115)
|
||||||
succeed("curl -sSf 'http://localhost:9115/probe?target=localhost&module=icmp_v6' | grep -q 'probe_success 1'");
|
succeed(
|
||||||
|
"curl -sSf 'http://localhost:9115/probe?target=localhost&module=icmp_v6' | grep -q 'probe_success 1'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -100,7 +102,7 @@ let
|
|||||||
enable = true;
|
enable = true;
|
||||||
extraFlags = [ "--web.collectd-push-path /collectd" ];
|
extraFlags = [ "--web.collectd-push-path /collectd" ];
|
||||||
};
|
};
|
||||||
exporterTest =let postData = escape' ''
|
exporterTest = let postData = replaceChars [ "\n" ] [ "" ] ''
|
||||||
[{
|
[{
|
||||||
"values":[23],
|
"values":[23],
|
||||||
"dstypes":["gauge"],
|
"dstypes":["gauge"],
|
||||||
@ -108,13 +110,21 @@ let
|
|||||||
"interval":1000,
|
"interval":1000,
|
||||||
"host":"testhost",
|
"host":"testhost",
|
||||||
"plugin":"testplugin",
|
"plugin":"testplugin",
|
||||||
"time":$(date +%s)
|
"time":DATE
|
||||||
}]
|
}]
|
||||||
''; in ''
|
''; in ''
|
||||||
waitForUnit("prometheus-collectd-exporter.service");
|
wait_for_unit("prometheus-collectd-exporter.service")
|
||||||
waitForOpenPort(9103);
|
wait_for_open_port(9103)
|
||||||
succeed("curl -sSfH 'Content-Type: application/json' -X POST --data \"${postData}\" localhost:9103/collectd");
|
succeed(
|
||||||
succeed("curl -sSf localhost:9103/metrics | grep -q 'collectd_testplugin_gauge{instance=\"testhost\"} 23'");
|
'echo \'${postData}\'> /tmp/data.json'
|
||||||
|
)
|
||||||
|
succeed('sed -ie "s DATE $(date +%s) " /tmp/data.json')
|
||||||
|
succeed(
|
||||||
|
"curl -sSfH 'Content-Type: application/json' -X POST --data @/tmp/data.json localhost:9103/collectd"
|
||||||
|
)
|
||||||
|
succeed(
|
||||||
|
"curl -sSf localhost:9103/metrics | grep -q 'collectd_testplugin_gauge{instance=\"testhost\"} 23'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -127,9 +137,9 @@ let
|
|||||||
services.dnsmasq.enable = true;
|
services.dnsmasq.enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-dnsmasq-exporter.service");
|
wait_for_unit("prometheus-dnsmasq-exporter.service")
|
||||||
waitForOpenPort(9153);
|
wait_for_open_port(9153)
|
||||||
succeed("curl -sSf http://localhost:9153/metrics | grep -q 'dnsmasq_leases 0'");
|
succeed("curl -sSf http://localhost:9153/metrics | grep -q 'dnsmasq_leases 0'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -144,9 +154,11 @@ let
|
|||||||
services.dovecot2.enable = true;
|
services.dovecot2.enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-dovecot-exporter.service");
|
wait_for_unit("prometheus-dovecot-exporter.service")
|
||||||
waitForOpenPort(9166);
|
wait_for_open_port(9166)
|
||||||
succeed("curl -sSf http://localhost:9166/metrics | grep -q 'dovecot_up{scope=\"global\"} 1'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9166/metrics | grep -q 'dovecot_up{scope=\"global\"} 1'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -155,9 +167,11 @@ let
|
|||||||
enable = true;
|
enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-fritzbox-exporter.service");
|
wait_for_unit("prometheus-fritzbox-exporter.service")
|
||||||
waitForOpenPort(9133);
|
wait_for_open_port(9133)
|
||||||
succeed("curl -sSf http://localhost:9133/metrics | grep -q 'fritzbox_exporter_collect_errors 0'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9133/metrics | grep -q 'fritzbox_exporter_collect_errors 0'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -180,11 +194,11 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("nginx.service");
|
wait_for_unit("nginx.service")
|
||||||
waitForOpenPort(80);
|
wait_for_open_port(80)
|
||||||
waitForUnit("prometheus-json-exporter.service");
|
wait_for_unit("prometheus-json-exporter.service")
|
||||||
waitForOpenPort(7979);
|
wait_for_open_port(7979)
|
||||||
succeed("curl -sSf localhost:7979/metrics | grep -q 'json_test_metric 1'");
|
succeed("curl -sSf localhost:7979/metrics | grep -q 'json_test_metric 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -222,10 +236,12 @@ let
|
|||||||
users.users.mailexporter.isSystemUser = true;
|
users.users.mailexporter.isSystemUser = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("postfix.service")
|
wait_for_unit("postfix.service")
|
||||||
waitForUnit("prometheus-mail-exporter.service")
|
wait_for_unit("prometheus-mail-exporter.service")
|
||||||
waitForOpenPort(9225)
|
wait_for_open_port(9225)
|
||||||
waitUntilSucceeds("curl -sSf http://localhost:9225/metrics | grep -q 'mail_deliver_success{configname=\"testserver\"} 1'")
|
wait_until_succeeds(
|
||||||
|
"curl -sSf http://localhost:9225/metrics | grep -q 'mail_deliver_success{configname=\"testserver\"} 1'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -256,9 +272,9 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("nginx.service")
|
wait_for_unit("nginx.service")
|
||||||
waitForUnit("prometheus-nextcloud-exporter.service")
|
wait_for_unit("prometheus-nextcloud-exporter.service")
|
||||||
waitForOpenPort(9205)
|
wait_for_open_port(9205)
|
||||||
succeed("curl -sSf http://localhost:9205/metrics | grep -q 'nextcloud_up 1'")
|
succeed("curl -sSf http://localhost:9205/metrics | grep -q 'nextcloud_up 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@ -275,9 +291,9 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("nginx.service")
|
wait_for_unit("nginx.service")
|
||||||
waitForUnit("prometheus-nginx-exporter.service")
|
wait_for_unit("prometheus-nginx-exporter.service")
|
||||||
waitForOpenPort(9113)
|
wait_for_open_port(9113)
|
||||||
succeed("curl -sSf http://localhost:9113/metrics | grep -q 'nginx_up 1'")
|
succeed("curl -sSf http://localhost:9113/metrics | grep -q 'nginx_up 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@ -287,9 +303,11 @@ let
|
|||||||
enable = true;
|
enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-node-exporter.service");
|
wait_for_unit("prometheus-node-exporter.service")
|
||||||
waitForOpenPort(9100);
|
wait_for_open_port(9100)
|
||||||
succeed("curl -sSf http://localhost:9100/metrics | grep -q 'node_exporter_build_info{.\\+} 1'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9100/metrics | grep -q 'node_exporter_build_info{.\\+} 1'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -301,9 +319,11 @@ let
|
|||||||
services.postfix.enable = true;
|
services.postfix.enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-postfix-exporter.service");
|
wait_for_unit("prometheus-postfix-exporter.service")
|
||||||
waitForOpenPort(9154);
|
wait_for_open_port(9154)
|
||||||
succeed("curl -sSf http://localhost:9154/metrics | grep -q 'postfix_smtpd_connects_total 0'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9154/metrics | grep -q 'postfix_smtpd_connects_total 0'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -316,18 +336,24 @@ let
|
|||||||
services.postgresql.enable = true;
|
services.postgresql.enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-postgres-exporter.service");
|
wait_for_unit("prometheus-postgres-exporter.service")
|
||||||
waitForOpenPort(9187);
|
wait_for_open_port(9187)
|
||||||
waitForUnit("postgresql.service");
|
wait_for_unit("postgresql.service")
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'");
|
succeed(
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'");
|
"curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'"
|
||||||
systemctl("stop postgresql.service");
|
)
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -qv 'pg_exporter_last_scrape_error 0'");
|
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'")
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 0'");
|
systemctl("stop postgresql.service")
|
||||||
systemctl("start postgresql.service");
|
succeed(
|
||||||
waitForUnit("postgresql.service");
|
"curl -sSf http://localhost:9187/metrics | grep -qv 'pg_exporter_last_scrape_error 0'"
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'");
|
)
|
||||||
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'");
|
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 0'")
|
||||||
|
systemctl("start postgresql.service")
|
||||||
|
wait_for_unit("postgresql.service")
|
||||||
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'"
|
||||||
|
)
|
||||||
|
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -339,11 +365,13 @@ let
|
|||||||
services.rspamd.enable = true;
|
services.rspamd.enable = true;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("rspamd.service");
|
wait_for_unit("rspamd.service")
|
||||||
waitForUnit("prometheus-rspamd-exporter.service");
|
wait_for_unit("prometheus-rspamd-exporter.service")
|
||||||
waitForOpenPort(11334);
|
wait_for_open_port(11334)
|
||||||
waitForOpenPort(7980);
|
wait_for_open_port(7980)
|
||||||
waitUntilSucceeds("curl -sSf localhost:7980/metrics | grep -q 'rspamd_scanned{host=\"rspamd\"} 0'");
|
wait_until_succeeds(
|
||||||
|
"curl -sSf localhost:7980/metrics | grep -q 'rspamd_scanned{host=\"rspamd\"} 0'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -356,9 +384,9 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-snmp-exporter.service");
|
wait_for_unit("prometheus-snmp-exporter.service")
|
||||||
waitForOpenPort(9116);
|
wait_for_open_port(9116)
|
||||||
succeed("curl -sSf localhost:9116/metrics | grep -q 'snmp_request_errors_total 0'");
|
succeed("curl -sSf localhost:9116/metrics | grep -q 'snmp_request_errors_total 0'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -377,11 +405,11 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("nginx.service");
|
wait_for_unit("nginx.service")
|
||||||
waitForOpenPort(80);
|
wait_for_open_port(80)
|
||||||
waitForUnit("prometheus-surfboard-exporter.service");
|
wait_for_unit("prometheus-surfboard-exporter.service")
|
||||||
waitForOpenPort(9239);
|
wait_for_open_port(9239)
|
||||||
succeed("curl -sSf localhost:9239/metrics | grep -q 'surfboard_up 1'");
|
succeed("curl -sSf localhost:9239/metrics | grep -q 'surfboard_up 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -396,11 +424,11 @@ let
|
|||||||
services.tor.controlPort = 9051;
|
services.tor.controlPort = 9051;
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("tor.service");
|
wait_for_unit("tor.service")
|
||||||
waitForOpenPort(9051);
|
wait_for_open_port(9051)
|
||||||
waitForUnit("prometheus-tor-exporter.service");
|
wait_for_unit("prometheus-tor-exporter.service")
|
||||||
waitForOpenPort(9130);
|
wait_for_open_port(9130)
|
||||||
succeed("curl -sSf localhost:9130/metrics | grep -q 'tor_version{.\\+} 1'");
|
succeed("curl -sSf localhost:9130/metrics | grep -q 'tor_version{.\\+} 1'")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -426,10 +454,12 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-varnish-exporter.service");
|
wait_for_unit("prometheus-varnish-exporter.service")
|
||||||
waitForOpenPort(6081);
|
wait_for_open_port(6081)
|
||||||
waitForOpenPort(9131);
|
wait_for_open_port(9131)
|
||||||
succeed("curl -sSf http://localhost:9131/metrics | grep -q 'varnish_up 1'");
|
succeed(
|
||||||
|
"curl -sSf http://localhost:9131/metrics | grep -q 'varnish_up 1'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -451,9 +481,11 @@ let
|
|||||||
systemd.services.prometheus-wireguard-exporter.after = [ "wireguard-wg0.service" ];
|
systemd.services.prometheus-wireguard-exporter.after = [ "wireguard-wg0.service" ];
|
||||||
};
|
};
|
||||||
exporterTest = ''
|
exporterTest = ''
|
||||||
waitForUnit("prometheus-wireguard-exporter.service");
|
wait_for_unit("prometheus-wireguard-exporter.service")
|
||||||
waitForOpenPort(9586);
|
wait_for_open_port(9586)
|
||||||
waitUntilSucceeds("curl -sSf http://localhost:9586/metrics | grep '${snakeoil.peer1.publicKey}'");
|
wait_until_succeeds(
|
||||||
|
"curl -sSf http://localhost:9586/metrics | grep '${snakeoil.peer1.publicKey}'"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -466,11 +498,13 @@ mapAttrs (exporter: testConfig: (makeTest {
|
|||||||
} testConfig.metricProvider or {}];
|
} testConfig.metricProvider or {}];
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
${"$"+exporter}->start();
|
${exporter}.start()
|
||||||
${concatStringsSep " " (map (line: ''
|
${concatStringsSep "\n" (map (line:
|
||||||
${"$"+exporter}->${line};
|
if (builtins.substring 0 1 line == " " || builtins.substring 0 1 line == ")")
|
||||||
'') (splitString "\n" (removeSuffix "\n" testConfig.exporterTest)))}
|
then line
|
||||||
${"$"+exporter}->shutdown();
|
else "${exporter}.${line}"
|
||||||
|
) (splitString "\n" (removeSuffix "\n" testConfig.exporterTest)))}
|
||||||
|
${exporter}.shutdown()
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = with maintainers; {
|
meta = with maintainers; {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ lib, ... }:
|
import ./make-test-python.nix ({ lib, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
@ -11,8 +11,8 @@ with lib;
|
|||||||
{ services.radarr.enable = true; };
|
{ services.radarr.enable = true; };
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$machine->waitForUnit('radarr.service');
|
machine.wait_for_unit("radarr.service")
|
||||||
$machine->waitForOpenPort('7878');
|
machine.wait_for_open_port("7878")
|
||||||
$machine->succeed("curl --fail http://localhost:7878/");
|
machine.succeed("curl --fail http://localhost:7878/")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "redis";
|
name = "redis";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ flokli ];
|
maintainers = [ flokli ];
|
||||||
@ -15,12 +15,10 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
machine.wait_for_unit("redis")
|
||||||
$machine->waitForUnit("redis");
|
machine.wait_for_open_port("6379")
|
||||||
$machine->waitForOpenPort("6379");
|
machine.succeed("redis-cli ping | grep PONG")
|
||||||
|
machine.succeed("redis-cli -s /run/redis/redis.sock ping | grep PONG")
|
||||||
$machine->succeed("redis-cli ping | grep PONG");
|
|
||||||
$machine->succeed("redis-cli -s /run/redis/redis.sock ping | grep PONG");
|
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -64,18 +64,13 @@ let
|
|||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
v3-mysql = mysqlTest pkgs.redmine // {
|
mysql = mysqlTest pkgs.redmine // {
|
||||||
name = "v3-mysql";
|
name = "mysql";
|
||||||
meta.maintainers = [ maintainers.aanderse ];
|
meta.maintainers = [ maintainers.aanderse ];
|
||||||
};
|
};
|
||||||
|
|
||||||
v4-mysql = mysqlTest pkgs.redmine_4 // {
|
pgsql = pgsqlTest pkgs.redmine // {
|
||||||
name = "v4-mysql";
|
name = "pgsql";
|
||||||
meta.maintainers = [ maintainers.aanderse ];
|
|
||||||
};
|
|
||||||
|
|
||||||
v4-pgsql = pgsqlTest pkgs.redmine_4 // {
|
|
||||||
name = "v4-pgsql";
|
|
||||||
meta.maintainers = [ maintainers.aanderse ];
|
meta.maintainers = [ maintainers.aanderse ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "roundcube";
|
name = "roundcube";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ globin ];
|
maintainers = [ globin ];
|
||||||
@ -21,10 +21,10 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
$roundcube->start;
|
roundcube.start
|
||||||
$roundcube->waitForUnit("postgresql.service");
|
roundcube.wait_for_unit("postgresql.service")
|
||||||
$roundcube->waitForUnit("phpfpm-roundcube.service");
|
roundcube.wait_for_unit("phpfpm-roundcube.service")
|
||||||
$roundcube->waitForUnit("nginx.service");
|
roundcube.wait_for_unit("nginx.service")
|
||||||
$roundcube->succeed("curl -sSfL http://roundcube/ | grep 'Keep me logged in'");
|
roundcube.succeed("curl -sSfL http://roundcube/ | grep 'Keep me logged in'")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix {
|
import ./make-test-python.nix {
|
||||||
name = "opensmtpd";
|
name = "opensmtpd";
|
||||||
|
|
||||||
nodes = {
|
nodes = {
|
||||||
@ -53,14 +53,14 @@ import ./make-test.nix {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
|
|
||||||
$server->waitForUnit("network-online.target");
|
server.wait_for_unit("network-online.target")
|
||||||
$server->waitForUnit("opensmtpd");
|
server.wait_for_unit("opensmtpd")
|
||||||
$server->waitForUnit("dovecot2");
|
server.wait_for_unit("dovecot2")
|
||||||
$server->waitForUnit("nginx");
|
server.wait_for_unit("nginx")
|
||||||
$server->waitForUnit("rss2email");
|
server.wait_for_unit("rss2email")
|
||||||
|
|
||||||
$server->waitUntilSucceeds('check-mail-landed >&2');
|
server.wait_until_succeeds("check-mail-landed >&2")
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ... }:
|
import ./make-test-python.nix ({ pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "samba";
|
name = "samba";
|
||||||
@ -36,12 +36,12 @@ import ./make-test.nix ({ pkgs, ... }:
|
|||||||
|
|
||||||
testScript =
|
testScript =
|
||||||
''
|
''
|
||||||
$server->start;
|
server.start()
|
||||||
$server->waitForUnit("samba.target");
|
server.wait_for_unit("samba.target")
|
||||||
$server->succeed("mkdir -p /public; echo bar > /public/foo");
|
server.succeed("mkdir -p /public; echo bar > /public/foo")
|
||||||
|
|
||||||
$client->start;
|
client.start()
|
||||||
$client->waitForUnit("remote-fs.target");
|
client.wait_for_unit("remote-fs.target")
|
||||||
$client->succeed("[[ \$(cat /public/foo) = bar ]]");
|
client.succeed("[[ $(cat /public/foo) = bar ]]")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
pkgs ? import ../.. { inherit system config; }
|
pkgs ? import ../.. { inherit system config; }
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with import ../lib/testing.nix { inherit system pkgs; };
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (pkgs) lib;
|
inherit (pkgs) lib;
|
||||||
@ -26,13 +26,13 @@ let
|
|||||||
testScript = { nodes, ... }: let
|
testScript = { nodes, ... }: let
|
||||||
user = nodes.machine.config.users.users.alice;
|
user = nodes.machine.config.users.users.alice;
|
||||||
in ''
|
in ''
|
||||||
startAll;
|
start_all()
|
||||||
$machine->waitForText(qr/select your user/i);
|
machine.wait_for_text("select your user")
|
||||||
$machine->screenshot("sddm");
|
machine.screenshot("sddm")
|
||||||
$machine->sendChars("${user.password}\n");
|
machine.send_chars("${user.password}\n")
|
||||||
$machine->waitForFile("/home/alice/.Xauthority");
|
machine.wait_for_file("${user.home}/.Xauthority")
|
||||||
$machine->succeed("xauth merge ~alice/.Xauthority");
|
machine.succeed("xauth merge ${user.home}/.Xauthority")
|
||||||
$machine->waitForWindow("^IceWM ");
|
machine.wait_for_window("^IceWM ")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -57,11 +57,13 @@ let
|
|||||||
services.xserver.desktopManager.default = "none";
|
services.xserver.desktopManager.default = "none";
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = { ... }: ''
|
testScript = { nodes, ... }: let
|
||||||
startAll;
|
user = nodes.machine.config.users.users.alice;
|
||||||
$machine->waitForFile("/home/alice/.Xauthority");
|
in ''
|
||||||
$machine->succeed("xauth merge ~alice/.Xauthority");
|
start_all()
|
||||||
$machine->waitForWindow("^IceWM ");
|
machine.wait_for_file("${user.home}/.Xauthority")
|
||||||
|
machine.succeed("xauth merge ${user.home}/.Xauthority")
|
||||||
|
machine.wait_for_window("^IceWM ")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ lib, ...}:
|
import ./make-test-python.nix ({ pkgs, lib, ...}:
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "shiori";
|
name = "shiori";
|
||||||
@ -8,10 +8,74 @@ import ./make-test.nix ({ lib, ...}:
|
|||||||
{ ... }:
|
{ ... }:
|
||||||
{ services.shiori.enable = true; };
|
{ services.shiori.enable = true; };
|
||||||
|
|
||||||
testScript = ''
|
testScript = let
|
||||||
$machine->waitForUnit('shiori.service');
|
authJSON = pkgs.writeText "auth.json" (builtins.toJSON {
|
||||||
$machine->waitForOpenPort('8080');
|
username = "shiori";
|
||||||
$machine->succeed("curl --fail http://localhost:8080/");
|
password = "gopher";
|
||||||
$machine->succeed("curl --fail --location http://localhost:8080/ | grep -qi shiori");
|
remember = 1; # hour
|
||||||
|
owner = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
insertBookmark = {
|
||||||
|
url = "http://example.org";
|
||||||
|
title = "Example Bookmark";
|
||||||
|
};
|
||||||
|
|
||||||
|
insertBookmarkJSON = pkgs.writeText "insertBookmark.json" (builtins.toJSON insertBookmark);
|
||||||
|
in ''
|
||||||
|
import json
|
||||||
|
|
||||||
|
machine.wait_for_unit("shiori.service")
|
||||||
|
machine.wait_for_open_port(8080)
|
||||||
|
machine.succeed("curl --fail http://localhost:8080/")
|
||||||
|
machine.succeed("curl --fail --location http://localhost:8080/ | grep -qi shiori")
|
||||||
|
|
||||||
|
with subtest("login"):
|
||||||
|
auth_json = machine.succeed(
|
||||||
|
"curl --fail --location http://localhost:8080/api/login "
|
||||||
|
"-X POST -H 'Content-Type:application/json' -d @${authJSON}"
|
||||||
|
)
|
||||||
|
auth_ret = json.loads(auth_json)
|
||||||
|
session_id = auth_ret["session"]
|
||||||
|
|
||||||
|
with subtest("bookmarks"):
|
||||||
|
with subtest("first use no bookmarks"):
|
||||||
|
bookmarks_json = machine.succeed(
|
||||||
|
(
|
||||||
|
"curl --fail --location http://localhost:8080/api/bookmarks "
|
||||||
|
"-H 'X-Session-Id:{}'"
|
||||||
|
).format(session_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
if json.loads(bookmarks_json)["bookmarks"] != []:
|
||||||
|
raise Exception("Shiori have a bookmark on first use")
|
||||||
|
|
||||||
|
with subtest("insert bookmark"):
|
||||||
|
machine.succeed(
|
||||||
|
(
|
||||||
|
"curl --fail --location http://localhost:8080/api/bookmarks "
|
||||||
|
"-X POST -H 'X-Session-Id:{}' "
|
||||||
|
"-H 'Content-Type:application/json' -d @${insertBookmarkJSON}"
|
||||||
|
).format(session_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
with subtest("get inserted bookmark"):
|
||||||
|
bookmarks_json = machine.succeed(
|
||||||
|
(
|
||||||
|
"curl --fail --location http://localhost:8080/api/bookmarks "
|
||||||
|
"-H 'X-Session-Id:{}'"
|
||||||
|
).format(session_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
bookmarks = json.loads(bookmarks_json)["bookmarks"]
|
||||||
|
if len(bookmarks) != 1:
|
||||||
|
raise Exception("Shiori didn't save the bookmark")
|
||||||
|
|
||||||
|
bookmark = bookmarks[0]
|
||||||
|
if (
|
||||||
|
bookmark["url"] != "${insertBookmark.url}"
|
||||||
|
or bookmark["title"] != "${insertBookmark.title}"
|
||||||
|
):
|
||||||
|
raise Exception("Inserted bookmark doesn't have same URL or title")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} :
|
import ./make-test-python.nix ({ pkgs, ...} :
|
||||||
|
|
||||||
{
|
{
|
||||||
name = "signal-desktop";
|
name = "signal-desktop";
|
||||||
@ -24,14 +24,14 @@ import ./make-test.nix ({ pkgs, ...} :
|
|||||||
testScript = { nodes, ... }: let
|
testScript = { nodes, ... }: let
|
||||||
user = nodes.machine.config.users.users.alice;
|
user = nodes.machine.config.users.users.alice;
|
||||||
in ''
|
in ''
|
||||||
startAll;
|
start_all()
|
||||||
$machine->waitForX;
|
machine.wait_for_x()
|
||||||
|
|
||||||
# start signal desktop
|
# start signal desktop
|
||||||
$machine->execute("su - alice -c signal-desktop &");
|
machine.execute("su - alice -c signal-desktop &")
|
||||||
|
|
||||||
# wait for the "Link your phone to Signal Desktop" message
|
# wait for the "Link your phone to Signal Desktop" message
|
||||||
$machine->waitForText(qr/Link your phone to Signal Desktop/);
|
machine.wait_for_text("Link your phone to Signal Desktop")
|
||||||
$machine->screenshot("signal_desktop");
|
machine.screenshot("signal_desktop")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...} : {
|
import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
name = "smokeping";
|
name = "smokeping";
|
||||||
meta = with pkgs.stdenv.lib.maintainers; {
|
meta = with pkgs.stdenv.lib.maintainers; {
|
||||||
maintainers = [ cransom ];
|
maintainers = [ cransom ];
|
||||||
@ -22,12 +22,12 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
startAll;
|
start_all()
|
||||||
$sm->waitForUnit("smokeping");
|
sm.wait_for_unit("smokeping")
|
||||||
$sm->waitForUnit("thttpd");
|
sm.wait_for_unit("thttpd")
|
||||||
$sm->waitForFile("/var/lib/smokeping/data/Local/LocalMachine.rrd");
|
sm.wait_for_file("/var/lib/smokeping/data/Local/LocalMachine.rrd")
|
||||||
$sm->succeed("curl -s -f localhost:8081/smokeping.fcgi?target=Local");
|
sm.succeed("curl -s -f localhost:8081/smokeping.fcgi?target=Local")
|
||||||
$sm->succeed("ls /var/lib/smokeping/cache/Local/LocalMachine_mini.png");
|
sm.succeed("ls /var/lib/smokeping/cache/Local/LocalMachine_mini.png")
|
||||||
$sm->succeed("ls /var/lib/smokeping/cache/index.html");
|
sm.succeed("ls /var/lib/smokeping/cache/index.html")
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user