Merge branch 'master' into haskell-updates
This commit is contained in:
@@ -842,6 +842,12 @@ in mkLicense lset) ({
|
||||
fullName = "SGI Free Software License B v2.0";
|
||||
};
|
||||
|
||||
# Gentoo seems to treat it as a license:
|
||||
# https://gitweb.gentoo.org/repo/gentoo.git/tree/licenses/SGMLUG?id=7d999af4a47bf55e53e54713d98d145f935935c1
|
||||
sgmlug = {
|
||||
fullName = "SGML UG SGML Parser Materials license";
|
||||
};
|
||||
|
||||
sleepycat = {
|
||||
spdxId = "Sleepycat";
|
||||
fullName = "Sleepycat License";
|
||||
|
||||
@@ -76,6 +76,14 @@
|
||||
<link xlink:href="options.html#opt-services.v2raya.enable">services.v2raya</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://www.netfilter.org/projects/ulogd/index.html">ulogd</link>,
|
||||
a userspace logging daemon for netfilter/iptables related
|
||||
logging. Available as
|
||||
<link xlink:href="options.html#opt-services.ulogd.enable">services.ulogd</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section xml:id="sec-release-23.05-incompatibilities">
|
||||
@@ -399,6 +407,21 @@
|
||||
<link xlink:href="https://github.com/google/ngx_brotli/blob/master/README.md">here</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<link xlink:href="https://garagehq.deuxfleurs.fr/">Garage</link>
|
||||
version is based on
|
||||
<link xlink:href="options.html#opt-system.stateVersion">system.stateVersion</link>,
|
||||
existing installations will keep using version 0.7. New
|
||||
installations will use version 0.8. In order to upgrade a
|
||||
Garage cluster, please follow
|
||||
<link xlink:href="https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/">upstream
|
||||
instructions</link> and force
|
||||
<link xlink:href="options.html#opt-services.garage.package">services.garage.package</link>
|
||||
or upgrade accordingly
|
||||
<link xlink:href="options.html#opt-system.stateVersion">system.stateVersion</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Resilio sync secret keys can now be provided using a secrets
|
||||
|
||||
@@ -28,6 +28,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- [v2rayA](https://v2raya.org), a Linux web GUI client of Project V which supports V2Ray, Xray, SS, SSR, Trojan and Pingtunnel. Available as [services.v2raya](options.html#opt-services.v2raya.enable).
|
||||
|
||||
- [ulogd](https://www.netfilter.org/projects/ulogd/index.html), a userspace logging daemon for netfilter/iptables related logging. Available as [services.ulogd](options.html#opt-services.ulogd.enable).
|
||||
|
||||
## Backward Incompatibilities {#sec-release-23.05-incompatibilities}
|
||||
|
||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||
@@ -109,6 +111,8 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||
|
||||
- A new option `recommendedBrotliSettings` has been added to `services.nginx`. Learn more about compression in Brotli format [here](https://github.com/google/ngx_brotli/blob/master/README.md).
|
||||
|
||||
- [Garage](https://garagehq.deuxfleurs.fr/) version is based on [system.stateVersion](options.html#opt-system.stateVersion), existing installations will keep using version 0.7. New installations will use version 0.8. In order to upgrade a Garage cluster, please follow [upstream instructions](https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/) and force [services.garage.package](options.html#opt-services.garage.package) or upgrade accordingly [system.stateVersion](options.html#opt-system.stateVersion).
|
||||
|
||||
- Resilio sync secret keys can now be provided using a secrets file at runtime, preventing these secrets from ending up in the Nix store.
|
||||
|
||||
- The `firewall` and `nat` module now has a nftables based implementation. Enable `networking.nftables` to use it.
|
||||
|
||||
@@ -41,11 +41,9 @@ def writeable_dir(arg: str) -> Path:
|
||||
"""
|
||||
path = Path(arg)
|
||||
if not path.is_dir():
|
||||
raise argparse.ArgumentTypeError("{0} is not a directory".format(path))
|
||||
raise argparse.ArgumentTypeError(f"{path} is not a directory")
|
||||
if not os.access(path, os.W_OK):
|
||||
raise argparse.ArgumentTypeError(
|
||||
"{0} is not a writeable directory".format(path)
|
||||
)
|
||||
raise argparse.ArgumentTypeError(f"{path} is not a writeable directory")
|
||||
return path
|
||||
|
||||
|
||||
|
||||
@@ -19,15 +19,11 @@ def get_tmp_dir() -> Path:
|
||||
tmp_dir.mkdir(mode=0o700, exist_ok=True)
|
||||
if not tmp_dir.is_dir():
|
||||
raise NotADirectoryError(
|
||||
"The directory defined by TMPDIR, TEMP, TMP or CWD: {0} is not a directory".format(
|
||||
tmp_dir
|
||||
)
|
||||
f"The directory defined by TMPDIR, TEMP, TMP or CWD: {tmp_dir} is not a directory"
|
||||
)
|
||||
if not os.access(tmp_dir, os.W_OK):
|
||||
raise PermissionError(
|
||||
"The directory defined by TMPDIR, TEMP, TMP, or CWD: {0} is not writeable".format(
|
||||
tmp_dir
|
||||
)
|
||||
f"The directory defined by TMPDIR, TEMP, TMP, or CWD: {tmp_dir} is not writeable"
|
||||
)
|
||||
return tmp_dir
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class Logger:
|
||||
|
||||
def maybe_prefix(self, message: str, attributes: Dict[str, str]) -> str:
|
||||
if "machine" in attributes:
|
||||
return "{}: {}".format(attributes["machine"], message)
|
||||
return f"{attributes['machine']}: {message}"
|
||||
return message
|
||||
|
||||
def log_line(self, message: str, attributes: Dict[str, str]) -> None:
|
||||
@@ -62,9 +62,7 @@ class Logger:
|
||||
def log_serial(self, message: str, machine: str) -> None:
|
||||
self.enqueue({"msg": message, "machine": machine, "type": "serial"})
|
||||
if self._print_serial_logs:
|
||||
self._eprint(
|
||||
Style.DIM + "{} # {}".format(machine, message) + Style.RESET_ALL
|
||||
)
|
||||
self._eprint(Style.DIM + f"{machine} # {message}" + Style.RESET_ALL)
|
||||
|
||||
def enqueue(self, item: Dict[str, str]) -> None:
|
||||
self.queue.put(item)
|
||||
@@ -97,7 +95,7 @@ class Logger:
|
||||
yield
|
||||
self.drain_log_queue()
|
||||
toc = time.time()
|
||||
self.log("(finished: {}, in {:.2f} seconds)".format(message, toc - tic))
|
||||
self.log(f"(finished: {message}, in {toc - tic:.2f} seconds)")
|
||||
|
||||
self.xml.endElement("nest")
|
||||
|
||||
|
||||
@@ -420,8 +420,8 @@ class Machine:
|
||||
|
||||
def send_monitor_command(self, command: str) -> str:
|
||||
self.run_callbacks()
|
||||
with self.nested("sending monitor command: {}".format(command)):
|
||||
message = ("{}\n".format(command)).encode()
|
||||
with self.nested(f"sending monitor command: {command}"):
|
||||
message = f"{command}\n".encode()
|
||||
assert self.monitor is not None
|
||||
self.monitor.send(message)
|
||||
return self.wait_for_monitor_prompt()
|
||||
@@ -438,7 +438,7 @@ class Machine:
|
||||
info = self.get_unit_info(unit, user)
|
||||
state = info["ActiveState"]
|
||||
if state == "failed":
|
||||
raise Exception('unit "{}" reached state "{}"'.format(unit, state))
|
||||
raise Exception(f'unit "{unit}" reached state "{state}"')
|
||||
|
||||
if state == "inactive":
|
||||
status, jobs = self.systemctl("list-jobs --full 2>&1", user)
|
||||
@@ -446,27 +446,24 @@ class Machine:
|
||||
info = self.get_unit_info(unit, user)
|
||||
if info["ActiveState"] == state:
|
||||
raise Exception(
|
||||
(
|
||||
'unit "{}" is inactive and there ' "are no pending jobs"
|
||||
).format(unit)
|
||||
f'unit "{unit}" is inactive and there are no pending jobs'
|
||||
)
|
||||
|
||||
return state == "active"
|
||||
|
||||
with self.nested(
|
||||
"waiting for unit {}{}".format(
|
||||
unit, f" with user {user}" if user is not None else ""
|
||||
)
|
||||
f"waiting for unit {unit}"
|
||||
+ (f" with user {user}" if user is not None else "")
|
||||
):
|
||||
retry(check_active, timeout)
|
||||
|
||||
def get_unit_info(self, unit: str, user: Optional[str] = None) -> Dict[str, str]:
|
||||
status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user)
|
||||
status, lines = self.systemctl(f'--no-pager show "{unit}"', user)
|
||||
if status != 0:
|
||||
raise Exception(
|
||||
'retrieving systemctl info for unit "{}" {} failed with exit code {}'.format(
|
||||
unit, "" if user is None else 'under user "{}"'.format(user), status
|
||||
)
|
||||
f'retrieving systemctl info for unit "{unit}"'
|
||||
+ ("" if user is None else f' under user "{user}"')
|
||||
+ f" failed with exit code {status}"
|
||||
)
|
||||
|
||||
line_pattern = re.compile(r"^([^=]+)=(.*)$")
|
||||
@@ -486,24 +483,22 @@ class Machine:
|
||||
if user is not None:
|
||||
q = q.replace("'", "\\'")
|
||||
return self.execute(
|
||||
(
|
||||
"su -l {} --shell /bin/sh -c "
|
||||
"$'XDG_RUNTIME_DIR=/run/user/`id -u` "
|
||||
"systemctl --user {}'"
|
||||
).format(user, q)
|
||||
f"su -l {user} --shell /bin/sh -c "
|
||||
"$'XDG_RUNTIME_DIR=/run/user/`id -u` "
|
||||
f"systemctl --user {q}'"
|
||||
)
|
||||
return self.execute("systemctl {}".format(q))
|
||||
return self.execute(f"systemctl {q}")
|
||||
|
||||
def require_unit_state(self, unit: str, require_state: str = "active") -> None:
|
||||
with self.nested(
|
||||
"checking if unit ‘{}’ has reached state '{}'".format(unit, require_state)
|
||||
f"checking if unit '{unit}' has reached state '{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)
|
||||
+ "'{}' but it is in state ‘{}’".format(require_state, state)
|
||||
f"Expected unit '{unit}' to to be in state "
|
||||
f"'{require_state}' but it is in state '{state}'"
|
||||
)
|
||||
|
||||
def _next_newline_closed_block_from_shell(self) -> str:
|
||||
@@ -593,13 +588,11 @@ class Machine:
|
||||
"""Execute each command and check that it succeeds."""
|
||||
output = ""
|
||||
for command in commands:
|
||||
with self.nested("must succeed: {}".format(command)):
|
||||
with self.nested(f"must succeed: {command}"):
|
||||
(status, out) = self.execute(command, timeout=timeout)
|
||||
if status != 0:
|
||||
self.log("output: {}".format(out))
|
||||
raise Exception(
|
||||
"command `{}` failed (exit code {})".format(command, status)
|
||||
)
|
||||
self.log(f"output: {out}")
|
||||
raise Exception(f"command `{command}` failed (exit code {status})")
|
||||
output += out
|
||||
return output
|
||||
|
||||
@@ -607,12 +600,10 @@ class Machine:
|
||||
"""Execute each command and check that it fails."""
|
||||
output = ""
|
||||
for command in commands:
|
||||
with self.nested("must fail: {}".format(command)):
|
||||
with self.nested(f"must fail: {command}"):
|
||||
(status, out) = self.execute(command, timeout=timeout)
|
||||
if status == 0:
|
||||
raise Exception(
|
||||
"command `{}` unexpectedly succeeded".format(command)
|
||||
)
|
||||
raise Exception(f"command `{command}` unexpectedly succeeded")
|
||||
output += out
|
||||
return output
|
||||
|
||||
@@ -627,7 +618,7 @@ class Machine:
|
||||
status, output = self.execute(command, timeout=timeout)
|
||||
return status == 0
|
||||
|
||||
with self.nested("waiting for success: {}".format(command)):
|
||||
with self.nested(f"waiting for success: {command}"):
|
||||
retry(check_success, timeout)
|
||||
return output
|
||||
|
||||
@@ -642,7 +633,7 @@ class Machine:
|
||||
status, output = self.execute(command, timeout=timeout)
|
||||
return status != 0
|
||||
|
||||
with self.nested("waiting for failure: {}".format(command)):
|
||||
with self.nested(f"waiting for failure: {command}"):
|
||||
retry(check_failure)
|
||||
return output
|
||||
|
||||
@@ -661,8 +652,8 @@ class Machine:
|
||||
|
||||
def get_tty_text(self, tty: str) -> str:
|
||||
status, output = self.execute(
|
||||
"fold -w$(stty -F /dev/tty{0} size | "
|
||||
"awk '{{print $2}}') /dev/vcs{0}".format(tty)
|
||||
f"fold -w$(stty -F /dev/tty{tty} size | "
|
||||
f"awk '{{print $2}}') /dev/vcs{tty}"
|
||||
)
|
||||
return output
|
||||
|
||||
@@ -681,11 +672,11 @@ class Machine:
|
||||
)
|
||||
return len(matcher.findall(text)) > 0
|
||||
|
||||
with self.nested("waiting for {} to appear on tty {}".format(regexp, tty)):
|
||||
with self.nested(f"waiting for {regexp} to appear on tty {tty}"):
|
||||
retry(tty_matches)
|
||||
|
||||
def send_chars(self, chars: str, delay: Optional[float] = 0.01) -> None:
|
||||
with self.nested("sending keys ‘{}‘".format(chars)):
|
||||
with self.nested(f"sending keys '{chars}'"):
|
||||
for char in chars:
|
||||
self.send_key(char, delay)
|
||||
|
||||
@@ -693,35 +684,33 @@ class Machine:
|
||||
"""Waits until the file exists in machine's file system."""
|
||||
|
||||
def check_file(_: Any) -> bool:
|
||||
status, _ = self.execute("test -e {}".format(filename))
|
||||
status, _ = self.execute(f"test -e {filename}")
|
||||
return status == 0
|
||||
|
||||
with self.nested("waiting for file ‘{}‘".format(filename)):
|
||||
with self.nested(f"waiting for file '{filename}'"):
|
||||
retry(check_file)
|
||||
|
||||
def wait_for_open_port(self, port: int, addr: str = "localhost") -> None:
|
||||
def port_is_open(_: Any) -> bool:
|
||||
status, _ = self.execute("nc -z {} {}".format(addr, port))
|
||||
status, _ = self.execute(f"nc -z {addr} {port}")
|
||||
return status == 0
|
||||
|
||||
with self.nested("waiting for TCP port {} on {}".format(port, addr)):
|
||||
with self.nested(f"waiting for TCP port {port} on {addr}"):
|
||||
retry(port_is_open)
|
||||
|
||||
def wait_for_closed_port(self, port: int, addr: str = "localhost") -> None:
|
||||
def port_is_closed(_: Any) -> bool:
|
||||
status, _ = self.execute("nc -z {} {}".format(addr, port))
|
||||
status, _ = self.execute(f"nc -z {addr} {port}")
|
||||
return status != 0
|
||||
|
||||
with self.nested(
|
||||
"waiting for TCP port {} on {} to be closed".format(port, addr)
|
||||
):
|
||||
with self.nested(f"waiting for TCP port {port} on {addr} to be closed"):
|
||||
retry(port_is_closed)
|
||||
|
||||
def start_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]:
|
||||
return self.systemctl("start {}".format(jobname), user)
|
||||
return self.systemctl(f"start {jobname}", user)
|
||||
|
||||
def stop_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]:
|
||||
return self.systemctl("stop {}".format(jobname), user)
|
||||
return self.systemctl(f"stop {jobname}", user)
|
||||
|
||||
def wait_for_job(self, jobname: str) -> None:
|
||||
self.wait_for_unit(jobname)
|
||||
@@ -741,21 +730,21 @@ class Machine:
|
||||
toc = time.time()
|
||||
|
||||
self.log("connected to guest root shell")
|
||||
self.log("(connecting took {:.2f} seconds)".format(toc - tic))
|
||||
self.log(f"(connecting took {toc - tic:.2f} seconds)")
|
||||
self.connected = True
|
||||
|
||||
def screenshot(self, filename: str) -> None:
|
||||
word_pattern = re.compile(r"^\w+$")
|
||||
if word_pattern.match(filename):
|
||||
filename = os.path.join(self.out_dir, "{}.png".format(filename))
|
||||
tmp = "{}.ppm".format(filename)
|
||||
filename = os.path.join(self.out_dir, f"{filename}.png")
|
||||
tmp = f"{filename}.ppm"
|
||||
|
||||
with self.nested(
|
||||
"making screenshot {}".format(filename),
|
||||
f"making screenshot {filename}",
|
||||
{"image": os.path.basename(filename)},
|
||||
):
|
||||
self.send_monitor_command("screendump {}".format(tmp))
|
||||
ret = subprocess.run("pnmtopng {} > {}".format(tmp, filename), shell=True)
|
||||
self.send_monitor_command(f"screendump {tmp}")
|
||||
ret = subprocess.run(f"pnmtopng {tmp} > {filename}", shell=True)
|
||||
os.unlink(tmp)
|
||||
if ret.returncode != 0:
|
||||
raise Exception("Cannot convert screenshot")
|
||||
@@ -817,7 +806,7 @@ class Machine:
|
||||
|
||||
def dump_tty_contents(self, tty: str) -> None:
|
||||
"""Debugging: Dump the contents of the TTY<n>"""
|
||||
self.execute("fold -w 80 /dev/vcs{} | systemd-cat".format(tty))
|
||||
self.execute(f"fold -w 80 /dev/vcs{tty} | systemd-cat")
|
||||
|
||||
def _get_screen_text_variants(self, model_ids: Iterable[int]) -> List[str]:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
@@ -839,15 +828,15 @@ class Machine:
|
||||
return True
|
||||
|
||||
if last:
|
||||
self.log("Last OCR attempt failed. Text was: {}".format(variants))
|
||||
self.log(f"Last OCR attempt failed. Text was: {variants}")
|
||||
|
||||
return False
|
||||
|
||||
with self.nested("waiting for {} to appear on screen".format(regex)):
|
||||
with self.nested(f"waiting for {regex} to appear on screen"):
|
||||
retry(screen_matches)
|
||||
|
||||
def wait_for_console_text(self, regex: str) -> None:
|
||||
with self.nested("waiting for {} to appear on console".format(regex)):
|
||||
with self.nested(f"waiting for {regex} to appear on console"):
|
||||
# Buffer the console output, this is needed
|
||||
# to match multiline regexes.
|
||||
console = io.StringIO()
|
||||
@@ -864,7 +853,7 @@ class Machine:
|
||||
|
||||
def send_key(self, key: str, delay: Optional[float] = 0.01) -> None:
|
||||
key = CHAR_TO_KEY.get(key, key)
|
||||
self.send_monitor_command("sendkey {}".format(key))
|
||||
self.send_monitor_command(f"sendkey {key}")
|
||||
if delay is not None:
|
||||
time.sleep(delay)
|
||||
|
||||
@@ -923,7 +912,7 @@ class Machine:
|
||||
self.pid = self.process.pid
|
||||
self.booted = True
|
||||
|
||||
self.log("QEMU running (pid {})".format(self.pid))
|
||||
self.log(f"QEMU running (pid {self.pid})")
|
||||
|
||||
def cleanup_statedir(self) -> None:
|
||||
shutil.rmtree(self.state_dir)
|
||||
@@ -977,7 +966,7 @@ class Machine:
|
||||
names = self.get_window_names()
|
||||
if last_try:
|
||||
self.log(
|
||||
"Last chance to match {} on the window list,".format(regexp)
|
||||
f"Last chance to match {regexp} on the window list,"
|
||||
+ " which currently contains: "
|
||||
+ ", ".join(names)
|
||||
)
|
||||
@@ -994,9 +983,7 @@ class Machine:
|
||||
"""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)
|
||||
)
|
||||
self.send_monitor_command(f"hostfwd_add tcp::{host_port}-:{guest_port}")
|
||||
|
||||
def block(self) -> None:
|
||||
"""Make the machine unreachable by shutting down eth1 (the multicast
|
||||
|
||||
@@ -77,6 +77,14 @@ let
|
||||
else
|
||||
config.boot.loader.timeout * 10;
|
||||
|
||||
# Timeout in grub is in seconds.
|
||||
# null means max timeout (infinity)
|
||||
# 0 means disable timeout
|
||||
grubEfiTimeout = if config.boot.loader.timeout == null then
|
||||
-1
|
||||
else
|
||||
config.boot.loader.timeout;
|
||||
|
||||
# The configuration file for syslinux.
|
||||
|
||||
# Notes on syslinux configuration and UNetbootin compatibility:
|
||||
@@ -284,7 +292,7 @@ let
|
||||
if serial; then set with_serial=yes ;fi
|
||||
export with_serial
|
||||
clear
|
||||
set timeout=10
|
||||
set timeout=${toString grubEfiTimeout}
|
||||
|
||||
# This message will only be viewable when "gfxterm" is not used.
|
||||
echo ""
|
||||
|
||||
@@ -520,6 +520,7 @@
|
||||
./services/logging/syslog-ng.nix
|
||||
./services/logging/syslogd.nix
|
||||
./services/logging/vector.nix
|
||||
./services/logging/ulogd.nix
|
||||
./services/mail/clamsmtp.nix
|
||||
./services/mail/davmail.nix
|
||||
./services/mail/dkimproxy-out.nix
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.ulogd;
|
||||
settingsFormat = pkgs.formats.ini { };
|
||||
settingsFile = settingsFormat.generate "ulogd.conf" cfg.settings;
|
||||
in {
|
||||
options = {
|
||||
services.ulogd = {
|
||||
enable = mkEnableOption (lib.mdDoc "ulogd");
|
||||
|
||||
settings = mkOption {
|
||||
example = {
|
||||
global.stack = "stack=log1:NFLOG,base1:BASE,pcap1:PCAP";
|
||||
log1.group = 2;
|
||||
pcap1 = {
|
||||
file = "/var/log/ulogd.pcap";
|
||||
sync = 1;
|
||||
};
|
||||
};
|
||||
type = settingsFormat.type;
|
||||
default = { };
|
||||
description = lib.mdDoc "Configuration for ulogd. See {file}`/share/doc/ulogd/` in `pkgs.ulogd.doc`.";
|
||||
};
|
||||
|
||||
logLevel = mkOption {
|
||||
type = types.enum [ 1 3 5 7 8 ];
|
||||
default = 5;
|
||||
description = lib.mdDoc "Log level (1 = debug, 3 = info, 5 = notice, 7 = error, 8 = fatal)";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services.ulogd = {
|
||||
description = "Ulogd Daemon";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wants = [ "network-pre.target" ];
|
||||
before = [ "network-pre.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.ulogd}/bin/ulogd -c ${settingsFile} --verbose --loglevel ${toString cfg.logLevel}";
|
||||
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -168,8 +168,7 @@ in
|
||||
inherit originRequest;
|
||||
|
||||
credentialsFile = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
Credential file.
|
||||
|
||||
@@ -190,8 +189,7 @@ in
|
||||
};
|
||||
|
||||
default = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
Catch-all service if no ingress matches.
|
||||
|
||||
@@ -262,12 +260,12 @@ in
|
||||
systemd.targets =
|
||||
mapAttrs'
|
||||
(name: tunnel:
|
||||
nameValuePair "cloudflared-tunnel-${name}" ({
|
||||
description = lib.mdDoc "Cloudflare tunnel '${name}' target";
|
||||
nameValuePair "cloudflared-tunnel-${name}" {
|
||||
description = "Cloudflare tunnel '${name}' target";
|
||||
requires = [ "cloudflared-tunnel-${name}.service" ];
|
||||
after = [ "cloudflared-tunnel-${name}.service" ];
|
||||
unitConfig.StopWhenUnneeded = true;
|
||||
})
|
||||
}
|
||||
)
|
||||
config.services.cloudflared.tunnels;
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ let
|
||||
description = lib.mdDoc "Username to authenticate with.";
|
||||
example = "example-user";
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
};
|
||||
|
||||
# Note: It does not make sense to provide a way to declaratively
|
||||
@@ -108,7 +109,7 @@ let
|
||||
ExecStart = "${openconnect}/bin/openconnect --config=${
|
||||
generateConfig name icfg
|
||||
} ${icfg.gateway}";
|
||||
StandardInput = "file:${icfg.passwordFile}";
|
||||
StandardInput = lib.mkIf (icfg.passwordFile != null) "file:${icfg.passwordFile}";
|
||||
|
||||
ProtectHome = true;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
<chapter xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="module-services-garage">
|
||||
<title>Garage</title>
|
||||
<para>
|
||||
<link xlink:href="https://garagehq.deuxfleurs.fr/">Garage</link>
|
||||
is an open-source, self-hostable S3 store, simpler than MinIO, for geodistributed stores.
|
||||
The server setup can be automated using
|
||||
<link linkend="opt-services.garage.enable">services.garage</link>. A
|
||||
client configured to your local Garage instance is available in
|
||||
the global environment as <literal>garage-manage</literal>.
|
||||
</para>
|
||||
<para>
|
||||
The current default by NixOS is <package>garage_0_8</package> which is also the latest
|
||||
major version available.
|
||||
</para>
|
||||
<section xml:id="module-services-garage-upgrade-scenarios">
|
||||
<title>General considerations on upgrades</title>
|
||||
|
||||
<para>
|
||||
Garage provides a cookbook documentation on how to upgrade:
|
||||
<link xlink:href="https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/">https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/</link>
|
||||
</para>
|
||||
|
||||
<warning>
|
||||
<para>Garage has two types of upgrades: patch-level upgrades and minor/major version upgrades.</para>
|
||||
|
||||
<para>In all cases, you should read the changelog and ideally test the upgrade on a staging cluster.</para>
|
||||
|
||||
<para>Checking the health of your cluster can be achieved using <literal>garage-manage repair</literal>.</para>
|
||||
</warning>
|
||||
|
||||
|
||||
<warning>
|
||||
<para>Until 1.0 is released, patch-level upgrades are considered as minor version upgrades.
|
||||
Minor version upgrades are considered as major version upgrades.
|
||||
i.e. 0.6 to 0.7 is a major version upgrade.</para>
|
||||
</warning>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<formalpara>
|
||||
<title>Straightforward upgrades (patch-level upgrades)</title>
|
||||
<para>
|
||||
Upgrades must be performed one by one, i.e. for each node, stop it, upgrade it : change <link linkend="opt-system.stateVersion">stateVersion</link> or <link linkend="opt-services.garage.package">services.garage.package</link>, restart it if it was not already by switching.
|
||||
</para>
|
||||
</formalpara>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<formalpara>
|
||||
<title>Multiple version upgrades</title>
|
||||
<para>
|
||||
Garage do not provide any guarantee on moving more than one major-version forward.
|
||||
E.g., if you're on <literal>0.7</literal>, you cannot upgrade to <literal>0.9</literal>.
|
||||
You need to upgrade to <literal>0.8</literal> first.
|
||||
|
||||
As long as <link linkend="opt-system.stateVersion">stateVersion</link> is declared properly,
|
||||
this is enforced automatically. The module will issue a warning to remind the user to upgrade to latest
|
||||
Garage <emphasis>after</emphasis> that deploy.
|
||||
</para>
|
||||
</formalpara>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
|
||||
<section xml:id="module-services-garage-advanced-upgrades">
|
||||
<title>Advanced upgrades (minor/major version upgrades)</title>
|
||||
<para>Here are some baseline instructions to handle advanced upgrades in Garage, when in doubt, please refer to upstream instructions.</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>Disable API and web access to Garage.</para></listitem>
|
||||
<listitem><para>Perform <literal>garage-manage repair --all-nodes --yes tables</literal> and <literal>garage-manage repair --all-nodes --yes blocks</literal>.</para></listitem>
|
||||
<listitem><para>Verify the resulting logs and check that data is synced properly between all nodes.
|
||||
If you have time, do additional checks (<literal>scrub</literal>, <literal>block_refs</literal>, etc.).</para></listitem>
|
||||
<listitem><para>Check if queues are empty by <literal>garage-manage stats</literal> or through monitoring tools.</para></listitem>
|
||||
<listitem><para>Run <literal>systemctl stop garage</literal> to stop the actual Garage version.</para></listitem>
|
||||
<listitem><para>Backup the metadata folder of ALL your nodes, e.g. for a metadata directory (the default one) in <literal>/var/lib/garage/meta</literal>,
|
||||
you can run <literal>pushd /var/lib/garage; tar -acf meta-v0.7.tar.zst meta/; popd</literal>.</para></listitem>
|
||||
<listitem><para>Run the offline migration: <literal>nix-shell -p garage_0_8 --run "garage offline-repair --yes"</literal>, this can take some time depending on how many objects are stored in your cluster.</para></listitem>
|
||||
<listitem><para>Bump Garage version in your NixOS configuration, either by changing <link linkend="opt-system.stateVersion">stateVersion</link> or bumping <link linkend="opt-services.garage.package">services.garage.package</link>, this should restart Garage automatically.</para></listitem>
|
||||
<listitem><para>Perform <literal>garage-manage repair --all-nodes --yes tables</literal> and <literal>garage-manage repair --all-nodes --yes blocks</literal>.</para></listitem>
|
||||
<listitem><para>Wait for a full table sync to run.</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
Your upgraded cluster should be in a working state, re-enable API and web access.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section xml:id="module-services-garage-maintainer-info">
|
||||
<title>Maintainer information</title>
|
||||
|
||||
<para>
|
||||
As stated in the previous paragraph, we must provide a clean upgrade-path for Garage
|
||||
since it cannot move more than one major version forward on a single upgrade. This chapter
|
||||
adds some notes how Garage updates should be rolled out in the future.
|
||||
|
||||
This is inspired from how Nextcloud does it.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
While patch-level updates are no problem and can be done directly in the
|
||||
package-expression (and should be backported to supported stable branches after that),
|
||||
major-releases should be added in a new attribute (e.g. Garage <literal>v0.8.0</literal>
|
||||
should be available in <literal>nixpkgs</literal> as <literal>pkgs.garage_0_8_0</literal>).
|
||||
To provide simple upgrade paths it's generally useful to backport those as well to stable
|
||||
branches. As long as the package-default isn't altered, this won't break existing setups.
|
||||
After that, the versioning-warning in the <literal>garage</literal>-module should be
|
||||
updated to make sure that the
|
||||
<link linkend="opt-services.garage.package">package</link>-option selects the latest version
|
||||
on fresh setups.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If major-releases will be abandoned by upstream, we should check first if those are needed
|
||||
in NixOS for a safe upgrade-path before removing those. In that case we shold keep those
|
||||
packages, but mark them as insecure in an expression like this (in
|
||||
<literal><nixpkgs/pkgs/tools/filesystem/garage/default.nix></literal>):
|
||||
<programlisting>/* ... */
|
||||
{
|
||||
garage_0_7_3 = generic {
|
||||
version = "0.7.3";
|
||||
sha256 = "0000000000000000000000000000000000000000000000000000";
|
||||
eol = true;
|
||||
};
|
||||
}</programlisting>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Ideally we should make sure that it's possible to jump two NixOS versions forward:
|
||||
i.e. the warnings and the logic in the module should guard a user to upgrade from a
|
||||
Garage on e.g. 22.11 to a Garage on 23.11.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
</chapter>
|
||||
@@ -8,7 +8,10 @@ let
|
||||
configFile = toml.generate "garage.toml" cfg.settings;
|
||||
in
|
||||
{
|
||||
meta.maintainers = [ maintainers.raitobezarius ];
|
||||
meta = {
|
||||
doc = ./garage-doc.xml;
|
||||
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
|
||||
};
|
||||
|
||||
options.services.garage = {
|
||||
enable = mkEnableOption (lib.mdDoc "Garage Object Storage (S3 compatible)");
|
||||
@@ -56,10 +59,12 @@ in
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
default = pkgs.garage;
|
||||
defaultText = literalExpression "pkgs.garage";
|
||||
# TODO: when 23.05 is released and if Garage 0.9 is the default, put a stateVersion check.
|
||||
default = if versionAtLeast stateVersion "23.05" then pkgs.garage_0_8_0
|
||||
else pkgs.garage_0_7;
|
||||
defaultText = literalExpression "pkgs.garage_0_7";
|
||||
type = types.package;
|
||||
description = lib.mdDoc "Garage package to use.";
|
||||
description = lib.mdDoc "Garage package to use, if you are upgrading from a major version, please read NixOS and Garage release notes for upgrade instructions.";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ in {
|
||||
fsck = handleTest ./fsck.nix {};
|
||||
ft2-clone = handleTest ./ft2-clone.nix {};
|
||||
mimir = handleTest ./mimir.nix {};
|
||||
garage = handleTest ./garage.nix {};
|
||||
garage = handleTest ./garage {};
|
||||
gerrit = handleTest ./gerrit.nix {};
|
||||
geth = handleTest ./geth.nix {};
|
||||
ghostunnel = handleTest ./ghostunnel.nix {};
|
||||
@@ -240,6 +240,7 @@ in {
|
||||
gitolite-fcgiwrap = handleTest ./gitolite-fcgiwrap.nix {};
|
||||
glusterfs = handleTest ./glusterfs.nix {};
|
||||
gnome = handleTest ./gnome.nix {};
|
||||
gnome-flashback = handleTest ./gnome-flashback.nix {};
|
||||
gnome-xorg = handleTest ./gnome-xorg.nix {};
|
||||
go-neb = handleTest ./go-neb.nix {};
|
||||
gobgpd = handleTest ./gobgpd.nix {};
|
||||
@@ -683,6 +684,7 @@ in {
|
||||
tuxguitar = handleTest ./tuxguitar.nix {};
|
||||
ucarp = handleTest ./ucarp.nix {};
|
||||
udisks2 = handleTest ./udisks2.nix {};
|
||||
ulogd = handleTest ./ulogd.nix {};
|
||||
unbound = handleTest ./unbound.nix {};
|
||||
unifi = handleTest ./unifi.nix {};
|
||||
unit-php = handleTest ./web-servers/unit-php.nix {};
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
args@{ mkNode, ... }:
|
||||
(import ../make-test-python.nix ({ pkgs, ...} : {
|
||||
name = "garage-basic";
|
||||
meta = {
|
||||
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
single_node = mkNode { replicationMode = "none"; };
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
from typing import List
|
||||
from dataclasses import dataclass
|
||||
import re
|
||||
|
||||
start_all()
|
||||
|
||||
cur_version_regex = re.compile('Current cluster layout version: (?P<ver>\d*)')
|
||||
key_creation_regex = re.compile('Key name: (?P<key_name>.*)\nKey ID: (?P<key_id>.*)\nSecret key: (?P<secret_key>.*)')
|
||||
|
||||
@dataclass
|
||||
class S3Key:
|
||||
key_name: str
|
||||
key_id: str
|
||||
secret_key: str
|
||||
|
||||
@dataclass
|
||||
class GarageNode:
|
||||
node_id: str
|
||||
host: str
|
||||
|
||||
def get_node_fqn(machine: Machine) -> GarageNode:
|
||||
node_id, host = machine.succeed("garage node id").split('@')
|
||||
return GarageNode(node_id=node_id, host=host)
|
||||
|
||||
def get_node_id(machine: Machine) -> str:
|
||||
return get_node_fqn(machine).node_id
|
||||
|
||||
def get_layout_version(machine: Machine) -> int:
|
||||
version_data = machine.succeed("garage layout show")
|
||||
m = cur_version_regex.search(version_data)
|
||||
if m and m.group('ver') is not None:
|
||||
return int(m.group('ver')) + 1
|
||||
else:
|
||||
raise ValueError('Cannot find current layout version')
|
||||
|
||||
def apply_garage_layout(machine: Machine, layouts: List[str]):
|
||||
for layout in layouts:
|
||||
machine.succeed(f"garage layout assign {layout}")
|
||||
version = get_layout_version(machine)
|
||||
machine.succeed(f"garage layout apply --version {version}")
|
||||
|
||||
def create_api_key(machine: Machine, key_name: str) -> S3Key:
|
||||
output = machine.succeed(f"garage key new --name {key_name}")
|
||||
m = key_creation_regex.match(output)
|
||||
if not m or not m.group('key_id') or not m.group('secret_key'):
|
||||
raise ValueError('Cannot parse API key data')
|
||||
return S3Key(key_name=key_name, key_id=m.group('key_id'), secret_key=m.group('secret_key'))
|
||||
|
||||
def get_api_key(machine: Machine, key_pattern: str) -> S3Key:
|
||||
output = machine.succeed(f"garage key info {key_pattern}")
|
||||
m = key_creation_regex.match(output)
|
||||
if not m or not m.group('key_name') or not m.group('key_id') or not m.group('secret_key'):
|
||||
raise ValueError('Cannot parse API key data')
|
||||
return S3Key(key_name=m.group('key_name'), key_id=m.group('key_id'), secret_key=m.group('secret_key'))
|
||||
|
||||
def test_bucket_writes(node):
|
||||
node.succeed("garage bucket create test-bucket")
|
||||
s3_key = create_api_key(node, "test-api-key")
|
||||
node.succeed("garage bucket allow --read --write test-bucket --key test-api-key")
|
||||
other_s3_key = get_api_key(node, 'test-api-key')
|
||||
assert other_s3_key.secret_key == other_s3_key.secret_key
|
||||
node.succeed(
|
||||
f"mc alias set test-garage http://[::1]:3900 {s3_key.key_id} {s3_key.secret_key} --api S3v4"
|
||||
)
|
||||
node.succeed("echo test | mc pipe test-garage/test-bucket/test.txt")
|
||||
assert node.succeed("mc cat test-garage/test-bucket/test.txt").strip() == "test"
|
||||
|
||||
def test_bucket_over_http(node, bucket='test-bucket', url=None):
|
||||
if url is None:
|
||||
url = f"{bucket}.web.garage"
|
||||
|
||||
node.succeed(f'garage bucket website --allow {bucket}')
|
||||
node.succeed(f'echo hello world | mc pipe test-garage/{bucket}/index.html')
|
||||
assert (node.succeed(f"curl -H 'Host: {url}' http://localhost:3902")).strip() == 'hello world'
|
||||
|
||||
with subtest("Garage works as a single-node S3 storage"):
|
||||
single_node.wait_for_unit("garage.service")
|
||||
single_node.wait_for_open_port(3900)
|
||||
# Now Garage is initialized.
|
||||
single_node_id = get_node_id(single_node)
|
||||
apply_garage_layout(single_node, [f'-z qemutest -c 1 "{single_node_id}"'])
|
||||
# Now Garage is operational.
|
||||
test_bucket_writes(single_node)
|
||||
test_bucket_over_http(single_node)
|
||||
'';
|
||||
})) args
|
||||
@@ -0,0 +1,53 @@
|
||||
{ system ? builtins.currentSystem
|
||||
, config ? { }
|
||||
, pkgs ? import ../../.. { inherit system config; }
|
||||
}:
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
mkNode = package: { replicationMode, publicV6Address ? "::1" }: { pkgs, ... }: {
|
||||
networking.interfaces.eth1.ipv6.addresses = [{
|
||||
address = publicV6Address;
|
||||
prefixLength = 64;
|
||||
}];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 3901 3902 ];
|
||||
|
||||
services.garage = {
|
||||
enable = true;
|
||||
inherit package;
|
||||
settings = {
|
||||
replication_mode = replicationMode;
|
||||
|
||||
rpc_bind_addr = "[::]:3901";
|
||||
rpc_public_addr = "[${publicV6Address}]:3901";
|
||||
rpc_secret = "5c1915fa04d0b6739675c61bf5907eb0fe3d9c69850c83820f51b4d25d13868c";
|
||||
|
||||
s3_api = {
|
||||
s3_region = "garage";
|
||||
api_bind_addr = "[::]:3900";
|
||||
root_domain = ".s3.garage";
|
||||
};
|
||||
|
||||
s3_web = {
|
||||
bind_addr = "[::]:3902";
|
||||
root_domain = ".web.garage";
|
||||
index = "index.html";
|
||||
};
|
||||
};
|
||||
};
|
||||
environment.systemPackages = [ pkgs.minio-client ];
|
||||
|
||||
# Garage requires at least 1GiB of free disk space to run.
|
||||
virtualisation.diskSize = 2 * 1024;
|
||||
};
|
||||
in
|
||||
foldl
|
||||
(matrix: ver: matrix // {
|
||||
"basic${toString ver}" = import ./basic.nix { inherit system pkgs; mkNode = mkNode pkgs."garage_${ver}"; };
|
||||
"with-3node-replication${toString ver}" = import ./with-3node-replication.nix { inherit system pkgs; mkNode = mkNode pkgs."garage_${ver}"; };
|
||||
})
|
||||
{}
|
||||
[
|
||||
"0_8_0"
|
||||
]
|
||||
@@ -1,50 +1,12 @@
|
||||
import ./make-test-python.nix ({ pkgs, ...} :
|
||||
let
|
||||
mkNode = { replicationMode, publicV6Address ? "::1" }: { pkgs, ... }: {
|
||||
networking.interfaces.eth1.ipv6.addresses = [{
|
||||
address = publicV6Address;
|
||||
prefixLength = 64;
|
||||
}];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 3901 3902 ];
|
||||
|
||||
services.garage = {
|
||||
enable = true;
|
||||
settings = {
|
||||
replication_mode = replicationMode;
|
||||
|
||||
rpc_bind_addr = "[::]:3901";
|
||||
rpc_public_addr = "[${publicV6Address}]:3901";
|
||||
rpc_secret = "5c1915fa04d0b6739675c61bf5907eb0fe3d9c69850c83820f51b4d25d13868c";
|
||||
|
||||
s3_api = {
|
||||
s3_region = "garage";
|
||||
api_bind_addr = "[::]:3900";
|
||||
root_domain = ".s3.garage";
|
||||
};
|
||||
|
||||
s3_web = {
|
||||
bind_addr = "[::]:3902";
|
||||
root_domain = ".web.garage";
|
||||
index = "index.html";
|
||||
};
|
||||
};
|
||||
};
|
||||
environment.systemPackages = [ pkgs.minio-client ];
|
||||
|
||||
# Garage requires at least 1GiB of free disk space to run.
|
||||
virtualisation.diskSize = 2 * 1024;
|
||||
};
|
||||
|
||||
|
||||
in {
|
||||
name = "garage";
|
||||
args@{ mkNode, ... }:
|
||||
(import ../make-test-python.nix ({ pkgs, ...} :
|
||||
{
|
||||
name = "garage-3node-replication";
|
||||
meta = {
|
||||
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
single_node = mkNode { replicationMode = "none"; };
|
||||
node1 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::1"; };
|
||||
node2 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::2"; };
|
||||
node3 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::3"; };
|
||||
@@ -126,16 +88,6 @@ in {
|
||||
node.succeed(f'echo hello world | mc pipe test-garage/{bucket}/index.html')
|
||||
assert (node.succeed(f"curl -H 'Host: {url}' http://localhost:3902")).strip() == 'hello world'
|
||||
|
||||
with subtest("Garage works as a single-node S3 storage"):
|
||||
single_node.wait_for_unit("garage.service")
|
||||
single_node.wait_for_open_port(3900)
|
||||
# Now Garage is initialized.
|
||||
single_node_id = get_node_id(single_node)
|
||||
apply_garage_layout(single_node, [f'-z qemutest -c 1 "{single_node_id}"'])
|
||||
# Now Garage is operational.
|
||||
test_bucket_writes(single_node)
|
||||
test_bucket_over_http(single_node)
|
||||
|
||||
with subtest("Garage works as a multi-node S3 storage"):
|
||||
nodes = ('node1', 'node2', 'node3', 'node4')
|
||||
rev_machines = {m.name: m for m in machines}
|
||||
@@ -166,4 +118,4 @@ in {
|
||||
for node in nodes:
|
||||
test_bucket_over_http(get_machine(node))
|
||||
'';
|
||||
})
|
||||
})) args
|
||||
@@ -0,0 +1,51 @@
|
||||
import ./make-test-python.nix ({ pkgs, lib, ...} : {
|
||||
name = "gnome-flashback";
|
||||
meta = with lib; {
|
||||
maintainers = teams.gnome.members ++ [ maintainers.chpatrick ];
|
||||
};
|
||||
|
||||
nodes.machine = { nodes, ... }: let
|
||||
user = nodes.machine.config.users.users.alice;
|
||||
in
|
||||
|
||||
{ imports = [ ./common/user-account.nix ];
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
services.xserver.displayManager = {
|
||||
gdm.enable = true;
|
||||
gdm.debug = true;
|
||||
autoLogin = {
|
||||
enable = true;
|
||||
user = user.name;
|
||||
};
|
||||
};
|
||||
|
||||
services.xserver.desktopManager.gnome.enable = true;
|
||||
services.xserver.desktopManager.gnome.debug = true;
|
||||
services.xserver.desktopManager.gnome.flashback.enableMetacity = true;
|
||||
services.xserver.displayManager.defaultSession = "gnome-flashback-metacity";
|
||||
};
|
||||
|
||||
testScript = { nodes, ... }: let
|
||||
user = nodes.machine.config.users.users.alice;
|
||||
uid = toString user.uid;
|
||||
xauthority = "/run/user/${uid}/gdm/Xauthority";
|
||||
in ''
|
||||
with subtest("Login to GNOME Flashback with GDM"):
|
||||
machine.wait_for_x()
|
||||
# Wait for alice to be logged in"
|
||||
machine.wait_for_unit("default.target", "${user.name}")
|
||||
machine.wait_for_file("${xauthority}")
|
||||
machine.succeed("xauth merge ${xauthority}")
|
||||
# Check that logging in has given the user ownership of devices
|
||||
assert "alice" in machine.succeed("getfacl -p /dev/snd/timer")
|
||||
|
||||
with subtest("Wait for Metacity"):
|
||||
machine.wait_until_succeeds(
|
||||
"pgrep metacity"
|
||||
)
|
||||
machine.sleep(20)
|
||||
machine.screenshot("screen")
|
||||
'';
|
||||
})
|
||||
@@ -0,0 +1,84 @@
|
||||
import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||
name = "ulogd";
|
||||
|
||||
meta = with lib; {
|
||||
maintainers = with maintainers; [ p-h ];
|
||||
};
|
||||
|
||||
nodes.machine = { ... }: {
|
||||
networking.firewall.enable = false;
|
||||
networking.nftables.enable = true;
|
||||
networking.nftables.ruleset = ''
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0;
|
||||
log group 2 accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
log group 2 accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
log group 2 accept
|
||||
}
|
||||
|
||||
}
|
||||
'';
|
||||
services.ulogd = {
|
||||
enable = true;
|
||||
settings = {
|
||||
global = {
|
||||
logfile = "/var/log/ulogd.log";
|
||||
stack = "log1:NFLOG,base1:BASE,pcap1:PCAP";
|
||||
};
|
||||
|
||||
log1.group = 2;
|
||||
|
||||
pcap1 = {
|
||||
file = "/var/log/ulogd.pcap";
|
||||
sync = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
tcpdump
|
||||
];
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
machine.wait_for_unit("ulogd.service")
|
||||
machine.wait_for_unit("network-online.target")
|
||||
|
||||
with subtest("Ulogd is running"):
|
||||
machine.succeed("pgrep ulogd >&2")
|
||||
|
||||
# All packets show up twice in the logs
|
||||
with subtest("Logs are collected"):
|
||||
machine.succeed("ping -f 127.0.0.1 -c 5 >&2")
|
||||
machine.succeed("sleep 2")
|
||||
machine.wait_until_succeeds("du /var/log/ulogd.pcap >&2")
|
||||
_, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1")
|
||||
expected, actual = 5*2, len(echo_request_packets.splitlines())
|
||||
assert expected == actual, f"Expected {expected} packets, got: {actual}"
|
||||
_, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1")
|
||||
expected, actual = 5*2, len(echo_reply_packets.splitlines())
|
||||
assert expected == actual, f"Expected {expected} packets, got: {actual}"
|
||||
|
||||
with subtest("Reloading service reopens log file"):
|
||||
machine.succeed("mv /var/log/ulogd.pcap /var/log/old_ulogd.pcap")
|
||||
machine.succeed("systemctl reload ulogd.service")
|
||||
machine.succeed("ping -f 127.0.0.1 -c 5 >&2")
|
||||
machine.succeed("sleep 2")
|
||||
_, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1")
|
||||
expected, actual = 5*2, len(echo_request_packets.splitlines())
|
||||
assert expected == actual, f"Expected {expected} packets, got: {actual}"
|
||||
_, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1")
|
||||
expected, actual = 5*2, len(echo_reply_packets.splitlines())
|
||||
assert expected == actual, f"Expected {expected} packets, got: {actual}"
|
||||
'';
|
||||
})
|
||||
@@ -1,4 +1,8 @@
|
||||
{ lib, stdenv, fetchFromGitHub, pythonPackages, mopidy }:
|
||||
{ lib
|
||||
, fetchFromGitHub
|
||||
, pythonPackages
|
||||
, mopidy
|
||||
}:
|
||||
|
||||
pythonPackages.buildPythonApplication rec {
|
||||
pname = "mopidy-musicbox-webclient";
|
||||
@@ -6,18 +10,22 @@ pythonPackages.buildPythonApplication rec {
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "pimusicbox";
|
||||
repo = "mopidy-musicbox-webclient";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "1lzarazq67gciyn6r8cdms0f7j0ayyfwhpf28z93ydb280mfrrb9";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [ mopidy ];
|
||||
propagatedBuildInputs = [
|
||||
mopidy
|
||||
];
|
||||
|
||||
doCheck = false;
|
||||
|
||||
meta = with lib; {
|
||||
description = "Mopidy extension for playing music from SoundCloud";
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.spwhitt ];
|
||||
description = "A Mopidy frontend extension and web client with additional features for Pi MusicBox";
|
||||
homepage = "https://github.com/pimusicbox/mopidy-musicbox-webclient";
|
||||
changelog = "https://github.com/pimusicbox/mopidy-musicbox-webclient/blob/v${version}/CHANGELOG.rst";
|
||||
license = licenses.asl20;
|
||||
maintainers = with maintainers; [ spwhitt ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -24,13 +24,13 @@ let
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "neovim-unwrapped";
|
||||
version = "0.8.1";
|
||||
version = "0.8.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "neovim";
|
||||
repo = "neovim";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-B2ZpwhdmdvPOnxVyJDfNzUT5rTVuBhJXyMwwzCl9Fac=";
|
||||
sha256 = "sha256-eqiH/K8w0FZNHLBBMjiTSQjNQyONqcx3X+d85gPnFJg=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
{ fetchzip, lib, stdenv, jdk, runtimeShell }:
|
||||
{ fetchzip, lib, stdenv, jdk, runtimeShell, glib, wrapGAppsHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "5.4.4";
|
||||
version = "5.5.1";
|
||||
pname = "keystore-explorer";
|
||||
src = fetchzip {
|
||||
url = "https://github.com/kaikramer/keystore-explorer/releases/download/v${version}/kse-544.zip";
|
||||
sha256 = "01kpa8g6p6vcqq9y70w5bm8jbw4kp55pbywj2zrhgjibrhgjqi0b";
|
||||
url = "https://github.com/kaikramer/keystore-explorer/releases/download/v${version}/kse-${lib.replaceStrings ["."] [""] version}.zip";
|
||||
sha256 = "2C/LkUUuef30PkN7HL0CtcNOjR5uNo9XaCiTatv5hgA=";
|
||||
};
|
||||
|
||||
# glib is necessary so file dialogs don't hang.
|
||||
buildInputs = [ glib ];
|
||||
nativeBuildInputs = [ wrapGAppsHook ];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
{ lib, stdenv, fetchurl, appimageTools, makeWrapper, electron, git }:
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchurl
|
||||
, appimageTools
|
||||
, makeWrapper
|
||||
, electron
|
||||
, git
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "logseq";
|
||||
version = "0.8.12";
|
||||
version = "0.8.15";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/logseq/logseq/releases/download/${version}/logseq-linux-x64-${version}.AppImage";
|
||||
sha256 = "sha256-I1jGPNGlZ53N3ZlN9nN/GSgQIfdoUeclyuMl+PpNVY4=";
|
||||
sha256 = "sha256-lE/bO/zpqChvdf8vfNqbC5iIpXAZDb36/N7Tpsj7PWY=";
|
||||
name = "${pname}-${version}.AppImage";
|
||||
};
|
||||
|
||||
@@ -52,6 +59,7 @@ stdenv.mkDerivation rec {
|
||||
meta = with lib; {
|
||||
description = "A local-first, non-linear, outliner notebook for organizing and sharing your personal knowledge base";
|
||||
homepage = "https://github.com/logseq/logseq";
|
||||
changelog = "https://github.com/logseq/logseq/releases/tag/${version}";
|
||||
license = licenses.agpl3Plus;
|
||||
maintainers = with maintainers; [ weihua ];
|
||||
platforms = [ "x86_64-linux" ];
|
||||
|
||||
@@ -14,12 +14,12 @@ let
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "splitter";
|
||||
version = "652";
|
||||
version = "653";
|
||||
|
||||
src = fetchsvn {
|
||||
url = "https://svn.mkgmap.org.uk/mkgmap/splitter/trunk";
|
||||
rev = version;
|
||||
sha256 = "sha256-yCdVOT8if3AImD4Q63gKfMep7WZsrCgV+IXfP4ZL3Qw=";
|
||||
sha256 = "sha256-iw414ecnOfeG3FdlIaoVOPv9BXZ95uUHuPzCQGH4G+A=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
(callPackage ./generic.nix { }) {
|
||||
channel = "edge";
|
||||
version = "22.8.2";
|
||||
sha256 = "114lfq5d5b09zg14iwnmaf0vmm183xr37q7b4bj3m8zbzhpbk7xx";
|
||||
vendorSha256 = "sha256-hKdokt5QW50oc2z8UFMq78DRWpwPlL5tSf2F0rQNEQ8=";
|
||||
version = "22.12.1";
|
||||
sha256 = "1ss6rhh71nq89ya8312fgy30pdw9vvnvnc8a7zs8a8yqg6p4x9lp";
|
||||
vendorSha256 = "sha256-V4BQ+7J1T+g5I7SrCexkfe3ngl7Qy3cf0SF+u28QKWE=";
|
||||
}
|
||||
|
||||
@@ -149,13 +149,13 @@
|
||||
},
|
||||
"baiducloud": {
|
||||
"deleteVendor": true,
|
||||
"hash": "sha256-4v9FuM69U+4V2Iy85vc4RP9KgzeME/R8rXxNSMBABdM=",
|
||||
"hash": "sha256-13vbO5EJsdVvR456uBCDbFBWlOaAZb9XhNJ7fE8fjto=",
|
||||
"homepage": "https://registry.terraform.io/providers/baidubce/baiducloud",
|
||||
"owner": "baidubce",
|
||||
"repo": "terraform-provider-baiducloud",
|
||||
"rev": "v1.18.4",
|
||||
"rev": "v1.19.0",
|
||||
"spdx": "MPL-2.0",
|
||||
"vendorHash": "sha256-ya2FpsLQMIu8zWYObpyPgBHVkHoNKzHgdMxukbtsje4="
|
||||
"vendorHash": "sha256-3PLBs8LSE5JPtrhmdx+jQsnCrfZQQEUGA7wnf9M72yY="
|
||||
},
|
||||
"bigip": {
|
||||
"hash": "sha256-VntKiBTQxe8lKV8Bb3A0moA/EUzyQQ7CInPjKJL4iBQ=",
|
||||
@@ -415,13 +415,13 @@
|
||||
"vendorHash": "sha256-ZgVA2+2tu17dnAc51Aw3k6v8k7QosNTmFjFhmeknxa8="
|
||||
},
|
||||
"gandi": {
|
||||
"hash": "sha256-dF3YCX3ghjg/OGLQT3Vzs/VLRoiuDXrTo5xP1Y8Jhgw=",
|
||||
"hash": "sha256-mQ4L2XCudyPGDw21jihF7nkSct7/KWAe/txnbtuJ8Lk=",
|
||||
"homepage": "https://registry.terraform.io/providers/go-gandi/gandi",
|
||||
"owner": "go-gandi",
|
||||
"repo": "terraform-provider-gandi",
|
||||
"rev": "v2.2.1",
|
||||
"rev": "v2.2.2",
|
||||
"spdx": "MPL-2.0",
|
||||
"vendorHash": "sha256-cStVmI58V46I3MYYYrbCY3llnOx2pyuM2Ku+rhe5DVQ="
|
||||
"vendorHash": "sha256-uWTY8cFztXFrQQ7GW6/R+x9M6vHmsb934ldq+oeW5vk="
|
||||
},
|
||||
"github": {
|
||||
"hash": "sha256-o7Sge0rCfP6Yueq+DP7siBsEinawgGe+nEu0/Olu8uQ=",
|
||||
@@ -1095,11 +1095,11 @@
|
||||
"vendorHash": "sha256-2wPmLpjhG6QgG+BUCO0oIzHjBOWIOYuptgdtSIm9TZw="
|
||||
},
|
||||
"tencentcloud": {
|
||||
"hash": "sha256-mN52iD0HdsfzPxo9hLFlKxiwIm7641cnjUYk8XyRP0s=",
|
||||
"hash": "sha256-vXd0yZ57bEdZ0OcIANMWdDN8PzOKnXJKw7HgjcOhSeE=",
|
||||
"homepage": "https://registry.terraform.io/providers/tencentcloudstack/tencentcloud",
|
||||
"owner": "tencentcloudstack",
|
||||
"repo": "terraform-provider-tencentcloud",
|
||||
"rev": "v1.79.2",
|
||||
"rev": "v1.79.3",
|
||||
"spdx": "MPL-2.0",
|
||||
"vendorHash": null
|
||||
},
|
||||
|
||||
@@ -27,11 +27,11 @@ let
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "PortfolioPerformance";
|
||||
version = "0.60.0";
|
||||
version = "0.60.1";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/buchen/portfolio/releases/download/${version}/PortfolioPerformance-${version}-linux.gtk.x86_64.tar.gz";
|
||||
sha256 = "sha256-L4ZLlxHsnJrvrrrX56Z+agjnaMl472Izm4Un1uaNqZA=";
|
||||
sha256 = "sha256-Lyo/T8df7tIc+h8MFh6yL+I+2W6On/C5PguNZfQAu9s=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "workcraft";
|
||||
version = "3.3.8";
|
||||
version = "3.3.9";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/workcraft/workcraft/releases/download/v${version}/workcraft-v${version}-linux.tar.gz";
|
||||
sha256 = "sha256-T2rUEZsO8g/nk10LZvC+mXEC6IzutbjncERlmqg814g=";
|
||||
sha256 = "sha256-Z3QtOGyOjmiM+qfB0FO4UDg8O99Ru/Qy2WNoBpXd1So=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
stdenv.mkDerivation rec {
|
||||
|
||||
pname = "seabios";
|
||||
version = "1.16.0";
|
||||
version = "1.16.1";
|
||||
|
||||
src = fetchgit {
|
||||
url = "https://git.seabios.org/seabios.git";
|
||||
rev = "rel-${version}";
|
||||
sha256 = "0acal1rr7sya86wlhw2mgimabwhjnr0y1pl5zxwb79j8k1w1r8sh";
|
||||
sha256 = "sha256-oIl2ZbhgSiVJPMBGbVt6N074vOifAoZL6VdKcBwM8D4=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ python3 ];
|
||||
|
||||
@@ -65,5 +65,5 @@ writeTextFile {
|
||||
name = "${name}.pc";
|
||||
destination = "/lib/pkgconfig/${name}.pc";
|
||||
text = builtins.concatStringsSep "\n" content;
|
||||
checkPhase = ''${buildPackages.pkg-config}/bin/pkg-config --validate "$target"'';
|
||||
checkPhase = ''${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config --validate "$target"'';
|
||||
}
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
|
||||
fetchzip rec {
|
||||
pname = "hackgen-font";
|
||||
version = "2.7.1";
|
||||
version = "2.8.0";
|
||||
|
||||
url = "https://github.com/yuru7/HackGen/releases/download/v${version}/HackGen_v${version}.zip";
|
||||
sha256 = "sha256-UL6U/q2u1UUP31lp0tEnFjzkn6dn8AY6hk5hJhPsOAE=";
|
||||
sha256 = "sha256-TLqns6ulovHRKoLHxxwKpj6SqfCq5UDVBf7gUASCGK4=";
|
||||
postFetch = ''
|
||||
install -Dm644 $out/*.ttf -t $out/share/fonts/hackgen
|
||||
shopt -s extglob dotglob
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{ stdenv
|
||||
, lib
|
||||
, fetchFromGitHub
|
||||
, fetchpatch
|
||||
, substituteAll
|
||||
, cairo
|
||||
, cinnamon-desktop
|
||||
@@ -39,13 +40,6 @@ stdenv.mkDerivation rec {
|
||||
|
||||
outputs = [ "out" "dev" "man" ];
|
||||
|
||||
patches = [
|
||||
(substituteAll {
|
||||
src = ./fix-paths.patch;
|
||||
zenity = gnome.zenity;
|
||||
})
|
||||
];
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "linuxmint";
|
||||
repo = pname;
|
||||
@@ -53,6 +47,20 @@ stdenv.mkDerivation rec {
|
||||
hash = "sha256-bHEBzl0aBXsHOhSWJUz428pG5M6L0s/Q6acKO+2oMXo=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
(substituteAll {
|
||||
src = ./fix-paths.patch;
|
||||
zenity = gnome.zenity;
|
||||
})
|
||||
|
||||
# compositor: Fix crash when restarting Cinnamon
|
||||
# https://github.com/linuxmint/muffin/pull/655
|
||||
(fetchpatch {
|
||||
url = "https://github.com/linuxmint/muffin/commit/1a941ec603a1565dbd2f943f7da6e877d1541bcb.patch";
|
||||
sha256 = "sha256-6x64rWQ20ZjM9z79Pg6QMDPeFN5VNdDHBueRvy2kA6c=";
|
||||
})
|
||||
];
|
||||
|
||||
nativeBuildInputs = [
|
||||
desktop-file-utils
|
||||
mesa # needed for gbm
|
||||
|
||||
@@ -180,9 +180,11 @@ let
|
||||
dontWrapGApps = true; # We want to do the wrapping ourselves.
|
||||
|
||||
# gnome-flashback and gnome-panel need to be added to XDG_DATA_DIRS so that their .desktop files can be found by gnome-session.
|
||||
# We need to pass the --builtin flag so that gnome-session invokes gnome-session-binary instead of systemd.
|
||||
# If systemd is used, it doesn't use the environment we set up here and so it can't find the .desktop files.
|
||||
preFixup = ''
|
||||
makeWrapper ${gnome-session}/bin/gnome-session $out \
|
||||
--add-flags "--session=gnome-flashback-${wmName}" \
|
||||
--add-flags "--session=gnome-flashback-${wmName} --builtin" \
|
||||
--set-default XDG_CURRENT_DESKTOP 'GNOME-Flashback:GNOME' \
|
||||
--prefix XDG_DATA_DIRS : '${lib.makeSearchPath "share" ([ wmApplication gnomeSession gnome-flashback ] ++ lib.optional enableGnomePanel gnome-panel)}' \
|
||||
"''${gappsWrapperArgs[@]}" \
|
||||
|
||||
@@ -163,4 +163,8 @@ rec {
|
||||
inherit callPackage fetchFromGitHub passthruFun;
|
||||
};
|
||||
|
||||
luajit_openresty = import ../luajit/openresty.nix {
|
||||
self = luajit_openresty;
|
||||
inherit callPackage fetchFromGitHub passthruFun;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
callPackage ./default.nix {
|
||||
version = "2.0.5-2022-09-13";
|
||||
isStable = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "LuaJIT";
|
||||
repo = "LuaJIT";
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{ self, callPackage, fetchFromGitHub, passthruFun }:
|
||||
|
||||
callPackage ./default.nix {
|
||||
version = "2.1.0-2022-10-04";
|
||||
isStable = false;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "LuaJIT";
|
||||
repo = "LuaJIT";
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, buildPackages
|
||||
, isStable
|
||||
, version
|
||||
, src
|
||||
, extraMeta ? { }
|
||||
@@ -71,7 +70,7 @@ stdenv.mkDerivation rec {
|
||||
} >> src/luaconf.h
|
||||
'';
|
||||
|
||||
configurePhase = false;
|
||||
dontConfigure = true;
|
||||
|
||||
buildInputs = lib.optional enableValgrindSupport valgrind;
|
||||
|
||||
@@ -91,8 +90,9 @@ stdenv.mkDerivation rec {
|
||||
postInstall = ''
|
||||
( cd "$out/include"; ln -s luajit-*/* . )
|
||||
ln -s "$out"/bin/luajit-* "$out"/bin/lua
|
||||
'' + lib.optionalString (!isStable) ''
|
||||
ln -s "$out"/bin/luajit-* "$out"/bin/luajit
|
||||
if [[ ! -e "$out"/bin/luajit ]]; then
|
||||
ln -s "$out"/bin/luajit* "$out"/bin/luajit
|
||||
fi
|
||||
'';
|
||||
|
||||
LuaPathSearchPaths = luaPackages.luaLib.luaPathList;
|
||||
@@ -117,7 +117,7 @@ stdenv.mkDerivation rec {
|
||||
|
||||
meta = with lib; {
|
||||
description = "High-performance JIT compiler for Lua 5.1";
|
||||
homepage = "http://luajit.org";
|
||||
homepage = "https://luajit.org/";
|
||||
license = licenses.mit;
|
||||
platforms = platforms.linux ++ platforms.darwin;
|
||||
# See https://github.com/LuaJIT/LuaJIT/issues/628
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{ self, callPackage, fetchFromGitHub, passthruFun }:
|
||||
|
||||
callPackage ./default.nix rec {
|
||||
version = "2.1-20220915";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "openresty";
|
||||
repo = "luajit2";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-kMHE4iQtm2CujK9TVut1jNhY2QxYP514jfBsxOCyd4s=";
|
||||
};
|
||||
|
||||
inherit self passthruFun;
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
, lib
|
||||
, fetchgit
|
||||
, autoreconfHook
|
||||
, buildPackages
|
||||
, optimize ? false # impure hardware optimizations
|
||||
}:
|
||||
stdenv.mkDerivation rec {
|
||||
@@ -16,6 +17,8 @@ stdenv.mkDerivation rec {
|
||||
sha256 = "04g5jg0i4vz46b4w2dvbmahwzi3k6b8g515mfw7im1inc78s14id";
|
||||
};
|
||||
|
||||
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
||||
|
||||
nativeBuildInputs = [
|
||||
autoreconfHook
|
||||
];
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{ lib, stdenv, fetchurl, m4, which, yasm }:
|
||||
{ lib, stdenv, fetchurl, m4, which, yasm, buildPackages }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "mpir";
|
||||
version = "3.0.0";
|
||||
|
||||
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
||||
|
||||
nativeBuildInputs = [ m4 which yasm ];
|
||||
|
||||
src = fetchurl {
|
||||
|
||||
@@ -266,7 +266,6 @@ stdenv.mkDerivation rec {
|
||||
|
||||
# Move development tools to $dev
|
||||
moveQtDevTools
|
||||
moveToOutput bin "$dev"
|
||||
moveToOutput libexec "$dev"
|
||||
|
||||
# fixup .pc file (where to find 'moc' etc.)
|
||||
|
||||
@@ -17,4 +17,28 @@ qtModule {
|
||||
NIX_CFLAGS_COMPILE = [
|
||||
"-DNIX_OUTPUT_DEV=\"${placeholder "dev"}\""
|
||||
];
|
||||
|
||||
devTools = [
|
||||
"bin/qcollectiongenerator"
|
||||
"bin/linguist"
|
||||
"bin/assistant"
|
||||
"bin/qdoc"
|
||||
"bin/lconvert"
|
||||
"bin/designer"
|
||||
"bin/qtattributionsscanner"
|
||||
"bin/lrelease"
|
||||
"bin/lrelease-pro"
|
||||
"bin/pixeltool"
|
||||
"bin/lupdate"
|
||||
"bin/lupdate-pro"
|
||||
"bin/qtdiag"
|
||||
"bin/qhelpgenerator"
|
||||
"bin/qtplugininfo"
|
||||
"bin/qthelpconverter"
|
||||
"bin/lprodump"
|
||||
"bin/qdistancefieldgenerator"
|
||||
] ++ lib.optionals stdenv.isDarwin [
|
||||
"bin/macdeployqt"
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
commit 4f497c358e0386b65df1c1d636aadf72f8647134
|
||||
commit bd8f6ecea0663bdd150aa48941cbd47d25874396
|
||||
Author: Nick Cao <nickcao@nichi.co>
|
||||
Date: Tue Apr 19 13:49:59 2022 +0800
|
||||
|
||||
@@ -13,10 +13,10 @@ Date: Tue Apr 19 13:49:59 2022 +0800
|
||||
generated cmake files to point to the corrected pathes.
|
||||
|
||||
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
|
||||
index 8b0f64e23b..03291e2ee2 100644
|
||||
index 5a33349b19..677a6084d6 100644
|
||||
--- a/Source/cmExportFileGenerator.cxx
|
||||
+++ b/Source/cmExportFileGenerator.cxx
|
||||
@@ -6,6 +6,7 @@
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
@@ -24,7 +24,7 @@ index 8b0f64e23b..03291e2ee2 100644
|
||||
|
||||
#include <cm/memory>
|
||||
|
||||
@@ -325,9 +326,23 @@ static void prefixItems(std::string& exportDirs)
|
||||
@@ -330,9 +331,21 @@ static void prefixItems(std::string& exportDirs)
|
||||
for (std::string const& e : entries) {
|
||||
exportDirs += sep;
|
||||
sep = ";";
|
||||
@@ -35,8 +35,6 @@ index 8b0f64e23b..03291e2ee2 100644
|
||||
+ if (std::getenv("dev")) {
|
||||
+ if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
|
||||
+ exportDirs += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
|
||||
+ exportDirs += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
|
||||
+ exportDirs += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
|
||||
@@ -52,18 +50,18 @@ index 8b0f64e23b..03291e2ee2 100644
|
||||
exportDirs += e;
|
||||
}
|
||||
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
|
||||
index 4a3c565bce..5afa9e5e50 100644
|
||||
index adccdfeece..ba248305bd 100644
|
||||
--- a/Source/cmExportInstallFileGenerator.cxx
|
||||
+++ b/Source/cmExportInstallFileGenerator.cxx
|
||||
@@ -5,6 +5,7 @@
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
+#include <cstdlib>
|
||||
|
||||
#include "cmExportSet.h"
|
||||
#include "cmGeneratedFileStream.h"
|
||||
@@ -263,7 +264,7 @@ void cmExportInstallFileGenerator::LoadConfigFiles(std::ostream& os)
|
||||
#include "cmFileSet.h"
|
||||
@@ -266,7 +267,7 @@ void cmExportInstallFileGenerator::LoadConfigFiles(std::ostream& os)
|
||||
|
||||
void cmExportInstallFileGenerator::ReplaceInstallPrefix(std::string& input)
|
||||
{
|
||||
@@ -72,7 +70,7 @@ index 4a3c565bce..5afa9e5e50 100644
|
||||
}
|
||||
|
||||
bool cmExportInstallFileGenerator::GenerateImportFileConfig(
|
||||
@@ -381,9 +382,24 @@ void cmExportInstallFileGenerator::SetImportLocationProperty(
|
||||
@@ -382,9 +383,22 @@ void cmExportInstallFileGenerator::SetImportLocationProperty(
|
||||
// Construct the installed location of the target.
|
||||
std::string dest = itgen->GetDestination(config);
|
||||
std::string value;
|
||||
@@ -83,8 +81,6 @@ index 4a3c565bce..5afa9e5e50 100644
|
||||
+ if (std::getenv("dev")) {
|
||||
+ if (cmHasLiteralPrefix(dest, "include") || cmHasLiteralPrefix(dest, "./include")) {
|
||||
+ value = std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(dest, "bin") || cmHasLiteralPrefix(dest, "./bin")) {
|
||||
+ value = std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(dest, "mkspecs") || cmHasLiteralPrefix(dest, "./mkspecs")) {
|
||||
+ value = std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(dest, "libexec") || cmHasLiteralPrefix(dest, "./libexec")) {
|
||||
@@ -100,10 +96,10 @@ index 4a3c565bce..5afa9e5e50 100644
|
||||
value += dest;
|
||||
value += "/";
|
||||
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
|
||||
index 840f5112d6..7bb4ab41aa 100644
|
||||
index f988e54a19..cc5c7ac9fd 100644
|
||||
--- a/Source/cmGeneratorExpression.cxx
|
||||
+++ b/Source/cmGeneratorExpression.cxx
|
||||
@@ -197,7 +197,22 @@ static void prefixItems(const std::string& content, std::string& result,
|
||||
@@ -192,7 +192,20 @@ static void prefixItems(const std::string& content, std::string& result,
|
||||
sep = ";";
|
||||
if (!cmSystemTools::FileIsFullPath(e) &&
|
||||
cmGeneratorExpression::Find(e) != 0) {
|
||||
@@ -111,8 +107,6 @@ index 840f5112d6..7bb4ab41aa 100644
|
||||
+ if (std::getenv("dev")) {
|
||||
+ if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
|
||||
+ result += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
|
||||
+ result += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
|
||||
+ result += std::getenv("dev");
|
||||
+ } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
|
||||
|
||||
@@ -33,7 +33,7 @@ stdenv.mkDerivation (args // {
|
||||
postInstall = ''
|
||||
if [ ! -z "$dev" ]; then
|
||||
mkdir "$dev"
|
||||
for dir in bin libexec mkspecs
|
||||
for dir in libexec mkspecs
|
||||
do
|
||||
moveToOutput "$dir" "$dev"
|
||||
done
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
{ disabled ? false
|
||||
, propagatedBuildInputs ? [ ]
|
||||
, makeFlags ? [ ]
|
||||
, ...
|
||||
} @ attrs:
|
||||
|
||||
@@ -9,18 +10,16 @@ if disabled then
|
||||
throw "${attrs.name} not supported by interpreter lua-${lua.luaversion}"
|
||||
else
|
||||
toLuaModule (lua.stdenv.mkDerivation (
|
||||
{
|
||||
attrs // {
|
||||
name = "lua${lua.luaversion}-" + attrs.pname + "-" + attrs.version;
|
||||
|
||||
makeFlags = [
|
||||
"PREFIX=$(out)"
|
||||
"LUA_LIBDIR=$(out)/lib/lua/${lua.luaversion}"
|
||||
"LUA_INC=-I${lua}/include"
|
||||
];
|
||||
}
|
||||
//
|
||||
attrs
|
||||
//
|
||||
{
|
||||
name = "lua${lua.luaversion}-" + attrs.pname + "-" + attrs.version;
|
||||
"LUA_LIBDIR=$(out)/lib/lua/${lua.luaversion}"
|
||||
"LUA_VERSION=${lua.luaversion}"
|
||||
] ++ makeFlags;
|
||||
|
||||
propagatedBuildInputs = propagatedBuildInputs ++ [
|
||||
lua # propagate it for its setup-hook
|
||||
];
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
}:
|
||||
|
||||
{ toolsVersion ? "26.1.1"
|
||||
, platformToolsVersion ? "33.0.2"
|
||||
, buildToolsVersions ? [ "32.0.0" ]
|
||||
, platformToolsVersion ? "33.0.3"
|
||||
, buildToolsVersions ? [ "33.0.1" ]
|
||||
, includeEmulator ? false
|
||||
, emulatorVersion ? "31.3.9"
|
||||
, emulatorVersion ? "31.3.14"
|
||||
, platformVersions ? []
|
||||
, includeSources ? false
|
||||
, includeSystemImages ? false
|
||||
@@ -14,7 +14,7 @@
|
||||
, abiVersions ? [ "armeabi-v7a" "arm64-v8a" ]
|
||||
, cmakeVersions ? [ ]
|
||||
, includeNDK ? false
|
||||
, ndkVersion ? "24.0.8215888"
|
||||
, ndkVersion ? "25.1.8937393"
|
||||
, ndkVersions ? [ndkVersion]
|
||||
, useGoogleAPIs ? false
|
||||
, useGoogleTVAddOns ? false
|
||||
|
||||
@@ -6,12 +6,15 @@
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz";
|
||||
sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy";
|
||||
}),
|
||||
pkgs ? import nixpkgsSource {},
|
||||
pkgsi686Linux ? import nixpkgsSource { system = "i686-linux"; },*/
|
||||
pkgs ? import nixpkgsSource {
|
||||
config.allowUnfree = true;
|
||||
},
|
||||
*/
|
||||
|
||||
# If you want to use the in-tree version of nixpkgs:
|
||||
pkgs ? import ../../../../.. {},
|
||||
pkgsi686Linux ? import ../../../../.. { system = "i686-linux"; },
|
||||
pkgs ? import ../../../../.. {
|
||||
config.allowUnfree = true;
|
||||
},
|
||||
|
||||
config ? pkgs.config
|
||||
}:
|
||||
@@ -23,17 +26,17 @@ let
|
||||
android = {
|
||||
versions = {
|
||||
tools = "26.1.1";
|
||||
platformTools = "31.0.2";
|
||||
platformTools = "33.0.3";
|
||||
buildTools = "30.0.3";
|
||||
ndk = [
|
||||
"22.1.7171670"
|
||||
"21.3.6528147" # LTS NDK
|
||||
"25.1.8937393" # LTS NDK
|
||||
"24.0.8215888"
|
||||
];
|
||||
cmake = "3.18.1";
|
||||
emulator = "30.6.3";
|
||||
cmake = "3.22.1";
|
||||
emulator = "31.3.14";
|
||||
};
|
||||
|
||||
platforms = ["23" "24" "25" "26" "27" "28" "29" "30"];
|
||||
platforms = ["23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33"];
|
||||
abis = ["armeabi-v7a" "arm64-v8a"];
|
||||
extras = ["extras;google;gcm"];
|
||||
};
|
||||
@@ -46,13 +49,13 @@ let
|
||||
};
|
||||
|
||||
androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" {
|
||||
inherit config pkgs pkgsi686Linux;
|
||||
inherit config pkgs;
|
||||
licenseAccepted = true;
|
||||
};*/
|
||||
|
||||
# Otherwise, just use the in-tree androidenv:
|
||||
androidEnv = pkgs.callPackage ./.. {
|
||||
inherit config pkgs pkgsi686Linux;
|
||||
inherit config pkgs;
|
||||
licenseAccepted = true;
|
||||
};
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ end
|
||||
|
||||
# Returns a system image URL for a given system image name.
|
||||
def image_url value, dir
|
||||
if dir == "default"
|
||||
dir = "android"
|
||||
end
|
||||
if value && value.start_with?('http')
|
||||
value
|
||||
elsif value
|
||||
@@ -154,6 +157,7 @@ def normalize_license license
|
||||
license = license.dup
|
||||
license.gsub!(/([^\n])\n([^\n])/m, '\1 \2')
|
||||
license.gsub!(/ +/, ' ')
|
||||
license.strip!
|
||||
license
|
||||
end
|
||||
|
||||
@@ -281,8 +285,18 @@ def parse_addon_xml doc
|
||||
[licenses, addons, extras]
|
||||
end
|
||||
|
||||
def merge_recursively a, b
|
||||
a.merge!(b) {|key, a_item, b_item|
|
||||
if a_item.is_a?(Hash) && b_item.is_a?(Hash)
|
||||
merge_recursively(a_item, b_item)
|
||||
else
|
||||
a[key] = b_item
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def merge dest, src
|
||||
dest.merge! src
|
||||
merge_recursively dest, src
|
||||
end
|
||||
|
||||
opts = Slop.parse do |o|
|
||||
@@ -300,19 +314,19 @@ result = {
|
||||
}
|
||||
|
||||
opts[:packages].each do |filename|
|
||||
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)))
|
||||
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
|
||||
merge result[:licenses], licenses
|
||||
merge result[:packages], packages
|
||||
end
|
||||
|
||||
opts[:images].each do |filename|
|
||||
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)))
|
||||
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
|
||||
merge result[:licenses], licenses
|
||||
merge result[:images], images
|
||||
end
|
||||
|
||||
opts[:addons].each do |filename|
|
||||
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)))
|
||||
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
|
||||
merge result[:licenses], licenses
|
||||
merge result[:addons], addons
|
||||
merge result[:extras], extras
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -11,7 +11,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "azure-mgmt-containerservice";
|
||||
version = "21.0.0";
|
||||
version = "21.1.0";
|
||||
format = "setuptools";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
@@ -19,7 +19,7 @@ buildPythonPackage rec {
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
extension = "zip";
|
||||
hash = "sha256-9Jhhd/qmphNnmWphXtFr6V52WA7KtKA8lI6cKsdGsOE=";
|
||||
hash = "sha256-5EOythXO7spLzzlqDWrwcdkkJAMH9W8OBv96rYaWxAY=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
@@ -39,6 +39,7 @@ buildPythonPackage rec {
|
||||
meta = with lib; {
|
||||
description = "This is the Microsoft Azure Container Service Management Client Library";
|
||||
homepage = "https://github.com/Azure/azure-sdk-for-python";
|
||||
changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-containerservice_${version}/sdk/containerservice/azure-mgmt-containerservice/CHANGELOG.md";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ maxwilson ];
|
||||
};
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "labelbox";
|
||||
version = "3.33.1";
|
||||
version = "3.34.0";
|
||||
format = "setuptools";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
@@ -37,7 +37,7 @@ buildPythonPackage rec {
|
||||
owner = "Labelbox";
|
||||
repo = "labelbox-python";
|
||||
rev = "refs/tags/v.${version}";
|
||||
hash = "sha256-lYhgBELeVtNUp6ZvcSTIeKp2YkaGt6MH8BbzSERGHXw=";
|
||||
hash = "sha256-x/XvcGiFS//f/le3JAd2n/tuUy9MBrCsISpkIkCCNis=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
|
||||
@@ -7,17 +7,19 @@
|
||||
, nbformat
|
||||
, sphinx
|
||||
, traitlets
|
||||
, isPy3k
|
||||
, pythonOlder
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "nbsphinx";
|
||||
version = "0.8.10";
|
||||
version = "0.8.11";
|
||||
format = "setuptools";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "sha256-qNaARviquRbilAubOBm9PvndzoaKo4hF6jZmRcq7YlQ=";
|
||||
hash = "sha256-q+GMBLM9m837PWbxGV9rDVHuykY+ywf2Bh3kl+QzFuQ=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
@@ -33,16 +35,16 @@ buildPythonPackage rec {
|
||||
doCheck = false;
|
||||
|
||||
JUPYTER_PATH = "${nbconvert}/share/jupyter";
|
||||
|
||||
pythonImportsCheck = [
|
||||
"nbsphinx"
|
||||
];
|
||||
|
||||
disabled = !isPy3k;
|
||||
|
||||
meta = with lib; {
|
||||
description = "Jupyter Notebook Tools for Sphinx";
|
||||
homepage = "https://nbsphinx.readthedocs.io/";
|
||||
changelog = "https://github.com/spatialaudio/nbsphinx/blob/${version}/NEWS.rst";
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.costrouc ];
|
||||
maintainers = with maintainers; [ costrouc ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{ stdenv
|
||||
, lib
|
||||
{ lib
|
||||
, stdenv
|
||||
, bash
|
||||
, buildPythonPackage
|
||||
, fetchFromGitHub
|
||||
, gnumake
|
||||
, httpx
|
||||
, openssl
|
||||
, paramiko
|
||||
, pytest-asyncio
|
||||
@@ -15,7 +18,7 @@
|
||||
buildPythonPackage rec {
|
||||
pname = "proxy-py";
|
||||
version = "2.4.3";
|
||||
format = "setuptools";
|
||||
format = "pyproject";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
|
||||
@@ -23,9 +26,18 @@ buildPythonPackage rec {
|
||||
owner = "abhinavsingh";
|
||||
repo = "proxy.py";
|
||||
rev = "refs/tags/v${version}";
|
||||
sha256 = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
|
||||
hash = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace Makefile \
|
||||
--replace "SHELL := /bin/bash" "SHELL := ${bash}/bin/bash"
|
||||
substituteInPlace pytest.ini \
|
||||
--replace "-p pytest_cov" "" \
|
||||
--replace "--no-cov-on-fail" ""
|
||||
sed -i "/--cov/d" pytest.ini
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
setuptools-scm
|
||||
];
|
||||
@@ -36,7 +48,9 @@ buildPythonPackage rec {
|
||||
];
|
||||
|
||||
checkInputs = [
|
||||
httpx
|
||||
openssl
|
||||
gnumake
|
||||
pytest-asyncio
|
||||
pytest-mock
|
||||
pytestCheckHook
|
||||
@@ -46,20 +60,23 @@ buildPythonPackage rec {
|
||||
export HOME=$(mktemp -d);
|
||||
'';
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace requirements.txt \
|
||||
--replace "typing-extensions==3.7.4.3" "typing-extensions"
|
||||
'';
|
||||
disabledTests = [
|
||||
# Test requires network access
|
||||
"test_http2_via_proxy"
|
||||
# Tests run into a timeout
|
||||
"integration"
|
||||
];
|
||||
|
||||
pythonImportsCheck = [
|
||||
"proxy"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
|
||||
description = "Python proxy framework";
|
||||
homepage = "https://github.com/abhinavsingh/proxy.py";
|
||||
changelog = "https://github.com/abhinavsingh/proxy.py/releases/tag/v${version}";
|
||||
license = with licenses; [ bsd3 ];
|
||||
maintainers = with maintainers; [ fab ];
|
||||
broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "pybravia";
|
||||
version = "0.2.3";
|
||||
version = "0.2.5";
|
||||
format = "pyproject";
|
||||
|
||||
disabled = pythonOlder "3.8";
|
||||
@@ -17,7 +17,7 @@ buildPythonPackage rec {
|
||||
owner = "Drafteed";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
hash = "sha256-ZM1XJnEYMNcbVOkpcI1ml7Cck2CXA2QXEpJMx3RwtSQ=";
|
||||
hash = "sha256-QWn5VdZlbxm2/ZvsQWlKuVPPBcqFkyt75Odh9Mf9Bqk=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
@@ -38,6 +38,7 @@ buildPythonPackage rec {
|
||||
meta = with lib; {
|
||||
description = "Library for remote control of Sony Bravia TVs 2013 and newer";
|
||||
homepage = "https://github.com/Drafteed/pybravia";
|
||||
changelog = "https://github.com/Drafteed/pybravia/releases/tag/v${version}";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ fab ];
|
||||
};
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchFromGitHub
|
||||
, freezegun
|
||||
, hatchling
|
||||
, pytest
|
||||
, pytestCheckHook
|
||||
, pythonOlder
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "pytest-freezer";
|
||||
version = "0.4.6";
|
||||
format = "pyproject";
|
||||
|
||||
disabled = pythonOlder "3.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "pytest-dev";
|
||||
repo = pname;
|
||||
rev = "refs/tags/${version}";
|
||||
hash = "sha256-0JZv6MavRceAV+ZOetCVxJEyttd5W3PCts6Fz2KQsh0=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
hatchling
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
pytest
|
||||
];
|
||||
|
||||
propagatedBuildInputs = [
|
||||
freezegun
|
||||
];
|
||||
|
||||
checkInputs = [
|
||||
pytestCheckHook
|
||||
];
|
||||
|
||||
pythonImportsCheck = [
|
||||
"pytest_freezer"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Pytest plugin providing a fixture interface for spulec/freezegun";
|
||||
homepage = "https://github.com/pytest-dev/pytest-freezer";
|
||||
changelog = "https://github.com/pytest-dev/pytest-freezer/releases/tag/${version}";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ fab ];
|
||||
};
|
||||
}
|
||||
@@ -1,33 +1,45 @@
|
||||
{ lib, fetchFromGitHub, buildPythonPackage, isPy3k,
|
||||
isodate, lxml, xmlsec, freezegun }:
|
||||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchFromGitHub
|
||||
, freezegun
|
||||
, isodate
|
||||
, lxml
|
||||
, pythonOlder
|
||||
, xmlsec
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "python3-saml";
|
||||
version = "1.14.0";
|
||||
disabled = !isPy3k;
|
||||
version = "1.15.0";
|
||||
format = "setuptools";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "onelogin";
|
||||
repo = "python3-saml";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-TAfVXh1fSKhNn/lsi7elq4wFyKCxCtCYUTrnH3ytBTw=";
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-xPPR2z3h8RpoAROpKpu9ZoDxGq5Stm9wQVt4Stj/6fg=";
|
||||
};
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace setup.py \
|
||||
--replace "lxml<4.7.1" "lxml<5"
|
||||
'';
|
||||
|
||||
propagatedBuildInputs = [
|
||||
isodate lxml xmlsec
|
||||
isodate
|
||||
lxml
|
||||
xmlsec
|
||||
];
|
||||
|
||||
checkInputs = [ freezegun ];
|
||||
pythonImportsCheck = [ "onelogin.saml2" ];
|
||||
checkInputs = [
|
||||
freezegun
|
||||
];
|
||||
|
||||
pythonImportsCheck = [
|
||||
"onelogin.saml2"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "OneLogin's SAML Python Toolkit for Python 3";
|
||||
description = "OneLogin's SAML Python Toolkit";
|
||||
homepage = "https://github.com/onelogin/python3-saml";
|
||||
changelog = "https://github.com/SAML-Toolkits/python3-saml/blob/v${version}/changelog.md";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ zhaofengli ];
|
||||
};
|
||||
|
||||
@@ -1,28 +1,42 @@
|
||||
{ lib, buildPythonPackage, fetchPypi, isPy27, isPy3k
|
||||
, pbr, six, futures ? null, monotonic ? null, typing ? null, setuptools-scm
|
||||
, pytest, sphinx, tornado, typeguard
|
||||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchPypi
|
||||
, pbr
|
||||
, pytest-asyncio
|
||||
, pytestCheckHook
|
||||
, pythonOlder
|
||||
, setuptools-scm
|
||||
, tornado
|
||||
, typeguard
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "tenacity";
|
||||
version = "8.0.1";
|
||||
version = "8.1.0";
|
||||
format = "pyproject";
|
||||
|
||||
disabled = pythonOlder "3.6";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f";
|
||||
sha256 = "sha256-5IxDf9+TQPVma5LNeZDpa8X8lV4SmLr0qQfjlyBnpEU=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pbr setuptools-scm ];
|
||||
propagatedBuildInputs = [ six ]
|
||||
++ lib.optionals isPy27 [ futures monotonic typing ];
|
||||
nativeBuildInputs = [
|
||||
pbr
|
||||
setuptools-scm
|
||||
];
|
||||
|
||||
checkInputs = [ pytest sphinx tornado ]
|
||||
++ lib.optionals isPy3k [ typeguard ];
|
||||
checkPhase = if isPy27 then ''
|
||||
pytest --ignore='tenacity/tests/test_asyncio.py'
|
||||
'' else ''
|
||||
pytest
|
||||
'';
|
||||
checkInputs = [
|
||||
pytest-asyncio
|
||||
pytestCheckHook
|
||||
tornado
|
||||
typeguard
|
||||
];
|
||||
|
||||
pythonImportsCheck = [
|
||||
"tenacity"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/jd/tenacity";
|
||||
|
||||
@@ -10,12 +10,13 @@
|
||||
, pytest-asyncio
|
||||
, pytestCheckHook
|
||||
, pythonOlder
|
||||
, tenacity
|
||||
, wrapt
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "teslajsonpy";
|
||||
version = "3.6.0";
|
||||
version = "3.7.0";
|
||||
format = "pyproject";
|
||||
|
||||
disabled = pythonOlder "3.7";
|
||||
@@ -24,7 +25,7 @@ buildPythonPackage rec {
|
||||
owner = "zabuldon";
|
||||
repo = pname;
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-qxC1nhvisYMfWRTyrkNSpqCKofAmqui23cMRaup8llU=";
|
||||
hash = "sha256-H2PXn2RwEteLpbbQftlSXM7vD59IJCFJhYdnHHGXfo8=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
@@ -37,6 +38,7 @@ buildPythonPackage rec {
|
||||
backoff
|
||||
beautifulsoup4
|
||||
httpx
|
||||
tenacity
|
||||
wrapt
|
||||
];
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "types-dateutil";
|
||||
version = "2.8.19.2";
|
||||
version = "2.8.19.5";
|
||||
format = "setuptools";
|
||||
|
||||
src = fetchPypi {
|
||||
pname = "types-python-dateutil";
|
||||
inherit version;
|
||||
hash = "sha256-5uMs4Y83dlsIxGYiKHvI2BNtwMVi2a1bj9FYxZlj16c=";
|
||||
hash = "sha256-q5H8X3FffXbZpQ09100MaN/jilTwI5z6BQZXWuTYep0=";
|
||||
};
|
||||
|
||||
pythonImportsCheck = [
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, cmake
|
||||
, libclang
|
||||
, libffi
|
||||
, libxml2
|
||||
, llvm
|
||||
, sphinx
|
||||
, zlib
|
||||
, withManual ? true
|
||||
, withHTML ? true
|
||||
{ lib,
|
||||
stdenv,
|
||||
fetchFromGitHub,
|
||||
cmake,
|
||||
libffi,
|
||||
libxml2,
|
||||
zlib,
|
||||
withManual ? true,
|
||||
withHTML ? true,
|
||||
llvmPackages,
|
||||
python3,
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (llvmPackages) libclang llvm;
|
||||
inherit (python3.pkgs) sphinx;
|
||||
in
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "castxml";
|
||||
version = "0.5.1";
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
|
||||
buildNpmPackage rec {
|
||||
pname = "ansible-language-server";
|
||||
version = "1.0.3";
|
||||
version = "1.0.4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ansible";
|
||||
repo = pname;
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-+42fZ4ILUHg/KcnllUaFYYPBKHxauagbsVdIY1MgwSI=";
|
||||
hash = "sha256-IBySScjfF2bIbiOv09uLMt9QH07zegm/W1vmGhdWxGY=";
|
||||
};
|
||||
|
||||
npmDepsHash = "sha256-DRXIbIogMeiJvZOB44hKkkfc3dg8mscnV6k2rUvYCNs=";
|
||||
npmDepsHash = "sha256-rJ1O2OsrJhTIfywK9/MRubwwcCmMbu61T4zyayg+mAU=";
|
||||
npmBuildScript = "compile";
|
||||
|
||||
# We remove the prepare and prepack scripts because they run the
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "uncrustify";
|
||||
version = "0.75.1";
|
||||
version = "0.76.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "uncrustify";
|
||||
repo = "uncrustify";
|
||||
rev = "uncrustify-${version}";
|
||||
sha256 = "sha256-wLzj/KcqXlcTsOJo7T166jLcWi1KNLmgblIqqkj7/9c=";
|
||||
sha256 = "sha256-th3lp4WqqruHx2/ym3I041y2wLbYM1b+V6yXNOWuUvM=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake python3 ];
|
||||
|
||||
@@ -25,14 +25,14 @@ with py.pkgs;
|
||||
|
||||
buildPythonApplication rec {
|
||||
pname = "pip-audit";
|
||||
version = "2.4.11";
|
||||
version = "2.4.12";
|
||||
format = "pyproject";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "trailofbits";
|
||||
repo = pname;
|
||||
rev = "refs/tags/v${version}";
|
||||
hash = "sha256-gfqxrEp+8Jmh32wjmBh0laQvEqja7kZqkqf2l2ztVyk=";
|
||||
hash = "sha256-bpAs7xXWvBVGzbX6Fij71BnEMpqYjSSCtWjuA/EFms8=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "ruff";
|
||||
version = "0.0.199";
|
||||
version = "0.0.201";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "charliermarsh";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-cA3MTk7jlcPKHqW+8Xf508v9v42WmdhCU2r4eIiG5ic=";
|
||||
sha256 = "sha256-+Jt7uvwzA1AtSaQOqsZBm9k0OBSvOaAoNBpsiZ/G+wI=";
|
||||
};
|
||||
|
||||
cargoSha256 = "sha256-cXjQWMnMSypHn0fynzJQYj+bqszuvRmIOPX4IrSuQbo=";
|
||||
cargoSha256 = "sha256-8wxS1ViA5F+y8gkKfSENYga/YSZ7QE8cl2lQlVL382Y=";
|
||||
|
||||
buildInputs = lib.optionals stdenv.isDarwin [
|
||||
darwin.apple_sdk.frameworks.CoreServices
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "skaffold";
|
||||
version = "2.0.3";
|
||||
version = "2.0.4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "GoogleContainerTools";
|
||||
repo = "skaffold";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-wt1BEa8ir8i4VWW03opfy7cSNqCPzQoHgtJz+i8iaLw=";
|
||||
sha256 = "sha256-TFI715knhQ3QyWF1EwIxZfZQW16uDWAqa6LVNfqC8Ws=";
|
||||
};
|
||||
|
||||
vendorSha256 = "sha256-2i7NKf/VJduBec4rEBJqFt1cb6ODqOviSY+flGekN4w=";
|
||||
vendorSha256 = "sha256-yy1BVorjLEcZR6PqupBiZx2plwPJ6xlxripbyB6RLek=";
|
||||
|
||||
subPackages = ["cmd/skaffold"];
|
||||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
{ stdenv, lib, fetchurl, gnumake, libnetfilter_acct, libnetfilter_conntrack
|
||||
, libnetfilter_log, libmnl, libnfnetlink, automake, autoconf, autogen, libtool
|
||||
, pkg-config, libpcap, linuxdoc-tools, autoreconfHook, nixosTests }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "2.0.8";
|
||||
pname = "ulogd";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://netfilter.org/projects/${pname}/files/${pname}-${version}.tar.bz2";
|
||||
hash = "sha256-Tq1sOXDD9X+h6J/i18xIO6b+K9GwhwFSHgs6/WZ98pE=";
|
||||
};
|
||||
|
||||
outputs = [ "out" "doc" "man" ];
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace ulogd.8 --replace "/usr/share/doc" "$doc/share/doc"
|
||||
'';
|
||||
|
||||
postBuild = ''
|
||||
pushd doc/
|
||||
linuxdoc --backend=txt --filter ulogd.sgml
|
||||
linuxdoc --backend=html --split=0 ulogd.sgml
|
||||
popd
|
||||
'';
|
||||
|
||||
postInstall = ''
|
||||
install -Dm444 -t $out/share/doc/${pname} ulogd.conf doc/ulogd.txt doc/ulogd.html README doc/*table
|
||||
install -Dm444 -t $out/share/doc/${pname}-mysql doc/mysql*.sql
|
||||
install -Dm444 -t $out/share/doc/${pname}-pgsql doc/pgsql*.sql
|
||||
'';
|
||||
|
||||
buildInputs = [
|
||||
libnetfilter_acct
|
||||
libnetfilter_conntrack
|
||||
libnetfilter_log
|
||||
libmnl
|
||||
libnfnetlink
|
||||
libpcap
|
||||
];
|
||||
|
||||
nativeBuildInputs = [
|
||||
autoreconfHook
|
||||
pkg-config
|
||||
automake
|
||||
autoconf
|
||||
autogen
|
||||
libtool
|
||||
linuxdoc-tools
|
||||
];
|
||||
|
||||
passthru.tests = { inherit (nixosTests) ulogd; };
|
||||
|
||||
meta = with lib; {
|
||||
description = "Userspace logging daemon for netfilter/iptables";
|
||||
|
||||
longDescription = ''
|
||||
Logging daemon that reads event messages coming from the Netfilter
|
||||
connection tracking, the Netfilter packet logging subsystem and from the
|
||||
Netfilter accounting subsystem. You have to enable support for connection
|
||||
tracking event delivery; ctnetlink and the NFLOG target in your Linux
|
||||
kernel 2.6.x or load their respective modules. The deprecated ULOG target
|
||||
(which has been superseded by NFLOG) is also supported.
|
||||
|
||||
The received messages can be logged into files or into a MySQL, SQLite3
|
||||
or PostgreSQL database. IPFIX and Graphite output are also supported.
|
||||
'';
|
||||
|
||||
homepage = "https://www.netfilter.org/projects/ulogd/index.html";
|
||||
license = licenses.gpl2;
|
||||
platforms = platforms.linux;
|
||||
maintainers = with maintainers; [ p-h ];
|
||||
};
|
||||
}
|
||||
@@ -19,7 +19,7 @@ buildGoPackage rec {
|
||||
|
||||
meta = with lib; {
|
||||
description = "A cross-platform markdown web server";
|
||||
homepage = "https://allmark.io";
|
||||
homepage = "https://github.com/andreaskoch/allmark";
|
||||
changelog = "https://github.com/andreaskoch/allmark/-/releases/v${version}";
|
||||
license = licenses.bsd3;
|
||||
maintainers = with maintainers; [ urandom ];
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "nats-server";
|
||||
version = "2.9.9";
|
||||
version = "2.9.10";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "nats-io";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
hash = "sha256-GIekoIhXhsWl0od/tkUO8h+9WPICds4iPVARTn4P0tE=";
|
||||
hash = "sha256-r/hz80XFEOQN7bzQQTIMAeZI8H09WyiUqQl3glJz+RM=";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-ASLy0rPuCSYGyy5Pw9fj559nxO4vPPagDKAe8wM29lo=";
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
stdenvNoCC.mkDerivation rec {
|
||||
pname = "spaceship-prompt";
|
||||
version = "3.16.7";
|
||||
version = "4.12.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "denysdovhan";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-dMP7mDzb0xLCP2l9j4SOP47bcpuBNSoXsDecVOvZaL8=";
|
||||
sha256 = "sha256-ZL6z5pj2xbnUZl4SK7wxiJjheUY79hwDNVYm9+biKZU=";
|
||||
};
|
||||
|
||||
strictDeps = true;
|
||||
@@ -22,6 +22,7 @@ stdenvNoCC.mkDerivation rec {
|
||||
find scripts -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
|
||||
find sections -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
|
||||
install -Dm644 spaceship.zsh "$out/lib/spaceship-prompt/spaceship.zsh"
|
||||
install -Dm644 async.zsh "$out/lib/spaceship-prompt/async.zsh"
|
||||
install -d "$out/share/zsh/themes/"
|
||||
ln -s "$out/lib/spaceship-prompt/spaceship.zsh" "$out/share/zsh/themes/spaceship.zsh-theme"
|
||||
install -d "$out/share/zsh/site-functions/"
|
||||
@@ -34,6 +35,6 @@ stdenvNoCC.mkDerivation rec {
|
||||
changelog = "https://github.com/spaceship-prompt/spaceship-prompt/releases/tag/v${version}";
|
||||
license = licenses.mit;
|
||||
platforms = platforms.unix;
|
||||
maintainers = with maintainers; [ nyanloutre fortuneteller2k ];
|
||||
maintainers = with maintainers; [ nyanloutre fortuneteller2k kyleondy ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,50 +1,94 @@
|
||||
{ lib, stdenv, rustPlatform, fetchFromGitea, openssl, pkg-config, protobuf
|
||||
, testers, Security, garage }:
|
||||
, testers, Security, garage, nixosTests }:
|
||||
let
|
||||
generic = { version, sha256, cargoSha256, eol ? false, broken ? false }: rustPlatform.buildRustPackage {
|
||||
pname = "garage";
|
||||
inherit version;
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "garage";
|
||||
version = "0.7.3";
|
||||
src = fetchFromGitea {
|
||||
domain = "git.deuxfleurs.fr";
|
||||
owner = "Deuxfleurs";
|
||||
repo = "garage";
|
||||
rev = "v${version}";
|
||||
inherit sha256;
|
||||
};
|
||||
|
||||
src = fetchFromGitea {
|
||||
domain = "git.deuxfleurs.fr";
|
||||
owner = "Deuxfleurs";
|
||||
repo = "garage";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-WDhe2L+NalMoIy2rhfmv8KCNDMkcqBC9ezEKKocihJg=";
|
||||
inherit cargoSha256;
|
||||
|
||||
nativeBuildInputs = [ protobuf pkg-config ];
|
||||
|
||||
buildInputs = [
|
||||
openssl
|
||||
] ++ lib.optional stdenv.isDarwin Security;
|
||||
|
||||
OPENSSL_NO_VENDOR = true;
|
||||
|
||||
# See https://git.deuxfleurs.fr/Deuxfleurs/garage/src/tag/v0.7.2/default.nix#L84-L98
|
||||
# on version changes for checking if changes are required here
|
||||
buildFeatures = [
|
||||
"kubernetes-discovery"
|
||||
] ++
|
||||
(lib.optional (lib.versionAtLeast version "0.8") [
|
||||
"bundled-libs"
|
||||
"sled"
|
||||
"metrics"
|
||||
"k2v"
|
||||
"telemetry-otlp"
|
||||
"lmdb"
|
||||
"sqlite"
|
||||
]);
|
||||
|
||||
# To make integration tests pass, we include the optional k2v feature here,
|
||||
# but not in buildFeatures. See:
|
||||
# https://garagehq.deuxfleurs.fr/documentation/reference-manual/k2v/
|
||||
checkFeatures = [
|
||||
"k2v"
|
||||
"kubernetes-discovery"
|
||||
] ++
|
||||
(lib.optional (lib.versionAtLeast version "0.8") [
|
||||
"bundled-libs"
|
||||
"sled"
|
||||
"metrics"
|
||||
"telemetry-otlp"
|
||||
"lmdb"
|
||||
"sqlite"
|
||||
]);
|
||||
|
||||
passthru = nixosTests.garage;
|
||||
|
||||
meta = {
|
||||
description = "S3-compatible object store for small self-hosted geo-distributed deployments";
|
||||
homepage = "https://garagehq.deuxfleurs.fr";
|
||||
license = lib.licenses.agpl3Only;
|
||||
maintainers = with lib.maintainers; [ nickcao _0x4A6F teutat3s raitobezarius ];
|
||||
knownVulnerabilities = (lib.optional eol "Garage version ${version} is EOL");
|
||||
inherit broken;
|
||||
};
|
||||
};
|
||||
in
|
||||
rec {
|
||||
# Until Garage hits 1.0, 0.7.3 is equivalent to 7.3.0 for now, therefore
|
||||
# we have to keep all the numbers in the version to handle major/minor/patch level.
|
||||
# for <1.0.
|
||||
|
||||
cargoSha256 = "sha256-5m4c8/upBYN8nuysDhGKEnNVJjEGC+yLrraicrAQOfI=";
|
||||
garage_0_7_3 = generic {
|
||||
version = "0.7.3";
|
||||
sha256 = "sha256-WDhe2L+NalMoIy2rhfmv8KCNDMkcqBC9ezEKKocihJg=";
|
||||
cargoSha256 = "sha256-5m4c8/upBYN8nuysDhGKEnNVJjEGC+yLrraicrAQOfI=";
|
||||
eol = true; # Confirmed with upstream maintainers over Matrix.
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ protobuf pkg-config ];
|
||||
garage_0_7 = garage_0_7_3;
|
||||
|
||||
buildInputs = [
|
||||
openssl
|
||||
] ++ lib.optional stdenv.isDarwin Security;
|
||||
garage_0_8_0 = generic {
|
||||
version = "0.8.0";
|
||||
sha256 = "sha256-c2RhHfg0+YV2E9Ckl1YSc+0nfzbHPIt0JgtT0DND9lA=";
|
||||
cargoSha256 = "sha256-vITXckNOiJbMuQW6/8p7dsZThkjxg/zUy3AZBbn33no=";
|
||||
# On Darwin, tests are failing.
|
||||
broken = stdenv.isDarwin;
|
||||
};
|
||||
|
||||
OPENSSL_NO_VENDOR = true;
|
||||
garage_0_8 = garage_0_8_0;
|
||||
|
||||
# See https://git.deuxfleurs.fr/Deuxfleurs/garage/src/tag/v0.7.2/default.nix#L84-L98
|
||||
# on version changes for checking if changes are required here
|
||||
buildFeatures = [
|
||||
"kubernetes-discovery"
|
||||
];
|
||||
|
||||
# To make integration tests pass, we include the optional k2v feature here,
|
||||
# but not in buildFeatures. See:
|
||||
# https://garagehq.deuxfleurs.fr/documentation/reference-manual/k2v/
|
||||
checkFeatures = [
|
||||
"k2v"
|
||||
"kubernetes-discovery"
|
||||
];
|
||||
|
||||
passthru = {
|
||||
tests.version = testers.testVersion { package = garage; };
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "S3-compatible object store for small self-hosted geo-distributed deployments";
|
||||
homepage = "https://garagehq.deuxfleurs.fr";
|
||||
license = lib.licenses.agpl3Only;
|
||||
maintainers = with lib.maintainers; [ nickcao _0x4A6F teutat3s ];
|
||||
};
|
||||
}
|
||||
garage = garage_0_8;
|
||||
}
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "mtd-utils";
|
||||
version = "2.1.4";
|
||||
version = "2.1.5";
|
||||
|
||||
src = fetchgit {
|
||||
url = "git://git.infradead.org/mtd-utils.git";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-lnvG2aJiihOyScmWZu0i8OYowmIMRBkgC3j67sdLkT4=";
|
||||
sha256 = "sha256-Ph9Xjb2Nyo7l3T1pDgW2gnSJxn0pOC6uvCGUfCh0MXU=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ autoreconfHook pkg-config ] ++ lib.optional doCheck cmocka;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{ stdenv
|
||||
, lib
|
||||
, pkgs
|
||||
, buildGoModule
|
||||
, fetchFromGitHub
|
||||
, writeText
|
||||
, writeShellScriptBin
|
||||
, runtimeShell
|
||||
, installShellFiles
|
||||
, ncurses
|
||||
@@ -16,8 +16,7 @@ let
|
||||
# so that using the shell completion (ctrl+r, etc) doesn't result in ugly
|
||||
# warnings on non-nixos machines
|
||||
ourPerl = if stdenv.isDarwin then perl else (
|
||||
pkgs.writers.writeBashBin "perl" ''
|
||||
#!${pkgs.runtimeShell}
|
||||
writeShellScriptBin "perl" ''
|
||||
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||
exec ${perl}/bin/perl "$@"
|
||||
'');
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
{ lib, stdenv, fetchurl, libffi, coreutils }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "txr";
|
||||
version = "280";
|
||||
|
||||
src = fetchurl {
|
||||
url = "http://www.kylheku.com/cgit/txr/snapshot/${pname}-${version}.tar.bz2";
|
||||
sha256 = "sha256-1iqWerUehLFPM63ZjJYY6xo9oHoNK7ne/a6M3+4L4so=";
|
||||
};
|
||||
|
||||
buildInputs = [ libffi ];
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
doCheck = true;
|
||||
checkTarget = "tests";
|
||||
|
||||
postPatch = ''
|
||||
# Fixup references to /usr/bin in tests
|
||||
substituteInPlace tests/017/realpath.tl --replace /usr/bin /bin
|
||||
substituteInPlace tests/017/realpath.expected --replace /usr/bin /bin
|
||||
|
||||
substituteInPlace tests/018/process.tl --replace /usr/bin/env ${lib.getBin coreutils}/bin/env
|
||||
'';
|
||||
|
||||
# Remove failing tests -- 018/chmod tries setting sticky bit
|
||||
preCheck = "rm -rf tests/018/chmod*";
|
||||
|
||||
postInstall = ''
|
||||
d=$out/share/vim-plugins/txr
|
||||
mkdir -p $d/{syntax,ftdetect}
|
||||
|
||||
cp {tl,txr}.vim $d/syntax/
|
||||
|
||||
cat > $d/ftdetect/txr.vim <<EOF
|
||||
au BufRead,BufNewFile *.txr set filetype=txr | set lisp
|
||||
au BufRead,BufNewFile *.tl,*.tlo set filetype=tl | set lisp
|
||||
EOF
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Programming language for convenient data munging";
|
||||
license = licenses.bsd2;
|
||||
homepage = "http://nongnu.org/txr";
|
||||
maintainers = with lib.maintainers; [ dtzWill ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
}
|
||||
@@ -21,6 +21,12 @@ stdenv.mkDerivation rec {
|
||||
url = "https://github.com/openwall/john/commit/154ee1156d62dd207aff0052b04c61796a1fde3b.patch";
|
||||
sha256 = "sha256-3rfS2tu/TF+KW2MQiR+bh4w/FVECciTooDQNTHNw31A=";
|
||||
})
|
||||
(fetchpatch {
|
||||
name = "improve-apple-clang-pseudo-intrinsics-portability.patch";
|
||||
url = "https://github.com/openwall/john/commit/c9825e688d1fb9fdd8942ceb0a6b4457b0f9f9b4.patch";
|
||||
excludes = [ "doc/*" ];
|
||||
sha256 = "sha256-hgoiz7IgR4f66fMP7bV1F8knJttY8g2Hxyk3QfkTu+g=";
|
||||
})
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
@@ -83,7 +89,5 @@ stdenv.mkDerivation rec {
|
||||
homepage = "https://github.com/openwall/john/";
|
||||
maintainers = with maintainers; [ offline matthewbauer ];
|
||||
platforms = platforms.unix;
|
||||
# never built on aarch64-darwin since first introduction in nixpkgs
|
||||
broken = stdenv.isDarwin && stdenv.isAarch64;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,21 +1,25 @@
|
||||
{ lib, stdenv, fetchFromGitHub }:
|
||||
{ lib
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "wslu";
|
||||
version = "4.0.0";
|
||||
version = "4.1.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "wslutilities";
|
||||
repo = pname;
|
||||
rev = "v${version}";
|
||||
hash = "sha256-bW/otr1kqmH2N5sD3R9kYCZyn+BbBZ2fCVGlP1pFnK8=";
|
||||
hash = "sha256-DlWI+rHj1vSJzJ8VJnUfoPH6t4LQhqxJgRKqz41fVmY=";
|
||||
};
|
||||
|
||||
makeFlags = [ "PREFIX=$(out)" ];
|
||||
makeFlags = [ "DESTDIR=$(out)" ];
|
||||
|
||||
meta = with lib; {
|
||||
description = "A collection of utilities for Windows 10 Linux Subsystems";
|
||||
homepage = "https://github.com/wslutilities/wslu";
|
||||
changelog = "https://github.com/wslutilities/wslu/releases/tag/v${version}";
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ jamiemagee ];
|
||||
platforms = platforms.linux;
|
||||
|
||||
@@ -9,24 +9,24 @@
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "difftastic";
|
||||
version = "0.39.0";
|
||||
version = "0.40.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "wilfred";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "sha256-PyjgnO5LXV0UGNqpb2J39Ni077L5MjHc5ZkK/r8//II=";
|
||||
sha256 = "sha256-zLps/R3KMx51eGdHINmvq9Cv4JTkVSont3Gktwgxsrg=";
|
||||
};
|
||||
|
||||
depsExtraArgs = {
|
||||
postBuild = let
|
||||
mimallocPatch = (fetchpatch {
|
||||
mimallocPatch = fetchpatch {
|
||||
name = "mimalloc-older-macos-fixes.patch";
|
||||
url = "https://github.com/microsoft/mimalloc/commit/40e0507a5959ee218f308d33aec212c3ebeef3bb.patch";
|
||||
stripLen = 1;
|
||||
extraPrefix = "libmimalloc-sys/c_src/mimalloc/";
|
||||
sha256 = "1cqgay6ayzxsj8v1dy8405kwd8av34m4bjc84iyg9r52amlijbg4";
|
||||
});
|
||||
};
|
||||
in ''
|
||||
pushd $name
|
||||
patch -p1 < ${mimallocPatch}
|
||||
@@ -40,7 +40,7 @@ rustPlatform.buildRustPackage rec {
|
||||
popd
|
||||
'';
|
||||
};
|
||||
cargoSha256 = "sha256-jVs5KokgofAqhNLfr/RJ9qOHwBYMnkqc2EcAFezS9/0=";
|
||||
cargoSha256 = "sha256-kVJwGEY0TvsKzTbcSgOSWIhx8MbH/KNB3Q8KvQfhCac=";
|
||||
|
||||
passthru.tests.version = testers.testVersion { package = difftastic; };
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
{ stdenv, lib, makeWrapper, fetchFromGitLab, openjade, gnumake, perl, flex
|
||||
, gnused, coreutils, which, opensp, groff, texlive, texinfo, withLatex ? false
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "linuxdoc-tools";
|
||||
version = "0.9.82";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
owner = "agmartin";
|
||||
repo = "linuxdoc-tools";
|
||||
rev = version;
|
||||
sha256 = "17v9ilh79av4n94vk4m52aq57ykb9myffxd2qr8kb8b3xnq5d36z";
|
||||
};
|
||||
|
||||
outputs = [ "out" "man" "doc" ];
|
||||
|
||||
configureFlags = [
|
||||
("--enable-docs=txt info lyx html rtf"
|
||||
+ lib.optionalString withLatex " pdf")
|
||||
];
|
||||
|
||||
LEX = "flex";
|
||||
|
||||
postInstall = ''
|
||||
wrapProgram $out/bin/linuxdoc \
|
||||
--prefix PATH : "${lib.makeBinPath [ groff opensp ]}:$out/bin" \
|
||||
--prefix PERL5LIB : "$out/share/linuxdoc-tools/"
|
||||
'';
|
||||
|
||||
doInstallCheck = true;
|
||||
|
||||
installCheckPhase = ''
|
||||
pushd doc/example
|
||||
substituteInPlace Makefile \
|
||||
--replace "COMMAND=linuxdoc" "COMMAND=$out/bin/linuxdoc" \
|
||||
${lib.optionalString (!withLatex) "--replace '.tex .dvi .ps .pdf' ''"}
|
||||
make
|
||||
popd
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [ flex which makeWrapper ];
|
||||
|
||||
buildInputs = [ opensp groff texinfo perl gnused coreutils ]
|
||||
++ lib.optionals withLatex [ texlive.combined.scheme-medium ];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Toolset for processing LinuxDoc DTD SGML files";
|
||||
longDescription = ''
|
||||
A collection of text formatters which understands a LinuxDoc DTD SGML
|
||||
source file. Each formatter (or "back-end") renders the source file into
|
||||
a variety of output formats, including HTML, TeX, DVI, PostScript, plain
|
||||
text, and groff source in manual-page format. The linuxdoc suite is
|
||||
provided for backward compatibility, because there are still many useful
|
||||
documents written in LinuxDoc DTD sgml source.
|
||||
'';
|
||||
homepage = "https://gitlab.com/agmartin/linuxdoc-tools";
|
||||
license = with licenses; [ gpl3Plus mit sgmlug ];
|
||||
platforms = platforms.linux;
|
||||
maintainers = with maintainers; [ p-h ];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{ lib,
|
||||
stdenv,
|
||||
fetchurl,
|
||||
coreutils,
|
||||
libffi,
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "txr";
|
||||
version = "283";
|
||||
|
||||
src = fetchurl {
|
||||
url = "http://www.kylheku.com/cgit/txr/snapshot/txr-${finalAttrs.version}.tar.bz2";
|
||||
hash = "sha256-2TnwxHAiiWEytHpKXrEwQ+ajq19f0lv7ss842kkPs4Y=";
|
||||
};
|
||||
|
||||
buildInputs = [ libffi ];
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
doCheck = true;
|
||||
checkTarget = "tests";
|
||||
|
||||
postPatch = ''
|
||||
substituteInPlace tests/017/realpath.tl --replace /usr/bin /bin
|
||||
substituteInPlace tests/017/realpath.expected --replace /usr/bin /bin
|
||||
|
||||
substituteInPlace tests/018/process.tl --replace /usr/bin/env ${lib.getBin coreutils}/bin/env
|
||||
'';
|
||||
|
||||
# Remove failing tests -- 018/chmod tries setting sticky bit
|
||||
preCheck = ''
|
||||
rm -rf tests/018/chmod*
|
||||
'';
|
||||
|
||||
# TODO: ship vim plugin separately?
|
||||
postInstall = ''
|
||||
mkdir -p $out/share/vim-plugins/txr/{syntax,ftdetect}
|
||||
|
||||
cp {tl,txr}.vim $out/share/vim-plugins/txr/syntax/
|
||||
|
||||
cat > $out/share/vim-plugins/txr/ftdetect/txr.vim <<EOF
|
||||
au BufRead,BufNewFile *.txr set filetype=txr | set lisp
|
||||
au BufRead,BufNewFile *.tl,*.tlo set filetype=tl | set lisp
|
||||
EOF
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "http://nongnu.org/txr";
|
||||
description = "An Original, New Programming Language for Convenient Data Munging";
|
||||
longDescription = ''
|
||||
TXR is a general-purpose, multi-paradigm programming language. It
|
||||
comprises two languages integrated into a single tool: a text scanning and
|
||||
extraction language referred to as the TXR Pattern Language (sometimes
|
||||
just "TXR"), and a general-purpose dialect of Lisp called TXR Lisp.
|
||||
|
||||
TXR can be used for everything from "one liner" data transformation tasks
|
||||
at the command line, to data scanning and extracting scripts, to full
|
||||
application development in a wide range of areas.
|
||||
'';
|
||||
license = licenses.bsd2;
|
||||
maintainers = with lib.maintainers; [ AndersonTorres dtzWill ];
|
||||
platforms = platforms.all;
|
||||
};
|
||||
})
|
||||
@@ -357,10 +357,7 @@ with pkgs;
|
||||
|
||||
castget = callPackage ../applications/networking/feedreaders/castget { };
|
||||
|
||||
castxml = callPackage ../development/tools/castxml {
|
||||
inherit (llvmPackages) libclang llvm;
|
||||
inherit (python3.pkgs) sphinx;
|
||||
};
|
||||
castxml = callPackage ../development/tools/castxml { };
|
||||
|
||||
catatonit = callPackage ../applications/virtualization/catatonit { };
|
||||
|
||||
@@ -4921,6 +4918,8 @@ with pkgs;
|
||||
|
||||
linuxptp = callPackage ../os-specific/linux/linuxptp { };
|
||||
|
||||
linuxdoc-tools = callPackage ../tools/text/sgml/linuxdoc-tools { };
|
||||
|
||||
lisgd = callPackage ../tools/inputmethods/lisgd { };
|
||||
|
||||
lite = callPackage ../applications/editors/lite { };
|
||||
@@ -7356,9 +7355,12 @@ with pkgs;
|
||||
|
||||
gaphor = python3Packages.callPackage ../tools/misc/gaphor { };
|
||||
|
||||
garage = callPackage ../tools/filesystems/garage {
|
||||
inherit (callPackage ../tools/filesystems/garage {
|
||||
inherit (darwin.apple_sdk.frameworks) Security;
|
||||
};
|
||||
})
|
||||
garage
|
||||
garage_0_7 garage_0_8
|
||||
garage_0_7_3 garage_0_8_0;
|
||||
|
||||
garmin-plugin = callPackage ../applications/misc/garmin-plugin {};
|
||||
|
||||
@@ -12538,7 +12540,7 @@ with pkgs;
|
||||
|
||||
twurl = callPackage ../tools/misc/twurl { };
|
||||
|
||||
txr = callPackage ../tools/misc/txr { inherit (llvmPackages_latest) stdenv; };
|
||||
txr = callPackage ../tools/text/txr { };
|
||||
|
||||
txt2man = callPackage ../tools/misc/txt2man { };
|
||||
|
||||
@@ -13089,6 +13091,8 @@ with pkgs;
|
||||
inherit (chickenPackages_4) eggDerivation fetchegg;
|
||||
};
|
||||
|
||||
ulogd = callPackage ../os-specific/linux/ulogd { };
|
||||
|
||||
unar = callPackage ../tools/archivers/unar {
|
||||
inherit (darwin.apple_sdk.frameworks) Foundation AppKit;
|
||||
stdenv = clangStdenv;
|
||||
@@ -16015,7 +16019,7 @@ with pkgs;
|
||||
|
||||
### LUA interpreters
|
||||
luaInterpreters = callPackage ./../development/interpreters/lua-5 {};
|
||||
inherit (luaInterpreters) lua5_1 lua5_2 lua5_2_compat lua5_3 lua5_3_compat lua5_4 lua5_4_compat luajit_2_1 luajit_2_0;
|
||||
inherit (luaInterpreters) lua5_1 lua5_2 lua5_2_compat lua5_3 lua5_3_compat lua5_4 lua5_4_compat luajit_2_1 luajit_2_0 luajit_openresty;
|
||||
|
||||
lua5 = lua5_2_compat;
|
||||
lua = lua5;
|
||||
|
||||
@@ -30,7 +30,7 @@ let
|
||||
lib.concatMapStringsSep ";" (path: "${drv}/${path}") pathListForVersion;
|
||||
|
||||
in
|
||||
{
|
||||
rec {
|
||||
|
||||
# Dont take luaPackages from "global" pkgs scope to avoid mixing lua versions
|
||||
luaPackages = self;
|
||||
@@ -59,6 +59,46 @@ in
|
||||
# a fork of luarocks used to generate nix lua derivations from rockspecs
|
||||
luarocks-nix = callPackage ../development/tools/misc/luarocks/luarocks-nix.nix { };
|
||||
|
||||
lua-resty-core = callPackage ({ fetchFromGitHub }: buildLuaPackage rec {
|
||||
pname = "lua-resty-core";
|
||||
version = "0.1.24";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "openresty";
|
||||
repo = "lua-resty-core";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-obwyxHSot1Lb2c1dNqJor3inPou+UIBrqldbkNBCQQk=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [ lua-resty-lrucache ];
|
||||
|
||||
meta = with lib; {
|
||||
description = "New FFI-based API for lua-nginx-module";
|
||||
homepage = "https://github.com/openresty/lua-resty-core";
|
||||
license = licenses.bsd3;
|
||||
maintainers = with maintainers; [ SuperSandro2000 ];
|
||||
};
|
||||
}) {};
|
||||
|
||||
lua-resty-lrucache = callPackage ({ fetchFromGitHub }: buildLuaPackage rec {
|
||||
pname = "lua-resty-lrucache";
|
||||
version = "0.13";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "openresty";
|
||||
repo = "lua-resty-lrucache";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-J8RNAMourxqUF8wPKd8XBhNwGC/x1KKvrVnZtYDEu4Q=";
|
||||
};
|
||||
|
||||
meta = with lib; {
|
||||
description = "Lua-land LRU Cache based on LuaJIT FFI";
|
||||
homepage = "https://github.com/openresty/lua-resty-lrucache";
|
||||
license = licenses.bsd3;
|
||||
maintainers = with maintainers; [ SuperSandro2000 ];
|
||||
};
|
||||
}) {};
|
||||
|
||||
luxio = callPackage ({ fetchurl, which, pkg-config }: buildLuaPackage rec {
|
||||
pname = "luxio";
|
||||
version = "13";
|
||||
|
||||
@@ -8884,6 +8884,8 @@ self: super: with self; {
|
||||
|
||||
pytest-freezegun = callPackage ../development/python-modules/pytest-freezegun { };
|
||||
|
||||
pytest-freezer = callPackage ../development/python-modules/pytest-freezer { };
|
||||
|
||||
pytest-golden = callPackage ../development/python-modules/pytest-golden { };
|
||||
|
||||
pytest-helpers-namespace = callPackage ../development/python-modules/pytest-helpers-namespace { };
|
||||
|
||||
Reference in New Issue
Block a user