diff --git a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml
index 2c3b4755894c..6347804e6856 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml
@@ -312,6 +312,14 @@
services.endlessh-go.
+
+
+ Garage,
+ a simple object storage server for geodistributed deployments,
+ alternative to MinIO. Available as
+ services.garage.
+
+
netbird, a zero
diff --git a/nixos/doc/manual/release-notes/rl-2211.section.md b/nixos/doc/manual/release-notes/rl-2211.section.md
index 6c07bf065190..6e95431b330a 100644
--- a/nixos/doc/manual/release-notes/rl-2211.section.md
+++ b/nixos/doc/manual/release-notes/rl-2211.section.md
@@ -108,6 +108,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [endlessh-go](https://github.com/shizunge/endlessh-go), an SSH tarpit that exposes Prometheus metrics. Available as [services.endlessh-go](#opt-services.endlessh-go.enable).
+- [Garage](https://garagehq.deuxfleurs.fr/), a simple object storage server for geodistributed deployments, alternative to MinIO. Available as [services.garage](#opt-services.garage.enable).
+
- [netbird](https://netbird.io), a zero configuration VPN.
Available as [services.netbird](options.html#opt-services.netbird.enable).
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index f821a95c3bc8..ad0679d6165e 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -1147,6 +1147,7 @@
./services/web-servers/caddy/default.nix
./services/web-servers/darkhttpd.nix
./services/web-servers/fcgiwrap.nix
+ ./services/web-servers/garage.nix
./services/web-servers/hitch/default.nix
./services/web-servers/hydron.nix
./services/web-servers/jboss/default.nix
diff --git a/nixos/modules/services/web-servers/garage.nix b/nixos/modules/services/web-servers/garage.nix
new file mode 100644
index 000000000000..76ab273483eb
--- /dev/null
+++ b/nixos/modules/services/web-servers/garage.nix
@@ -0,0 +1,91 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.garage;
+ toml = pkgs.formats.toml {};
+ configFile = toml.generate "garage.toml" cfg.settings;
+in
+{
+ meta.maintainers = [ maintainers.raitobezarius ];
+
+ options.services.garage = {
+ enable = mkEnableOption (lib.mdDoc "Garage Object Storage (S3 compatible)");
+
+ extraEnvironment = mkOption {
+ type = types.attrsOf types.str;
+ description = lib.mdDoc "Extra environment variables to pass to the Garage server.";
+ default = {};
+ example = { RUST_BACKTRACE="yes"; };
+ };
+
+ logLevel = mkOption {
+ type = types.enum (["info" "debug" "trace"]);
+ default = "info";
+ example = "debug";
+ description = lib.mdDoc "Garage log level, see for examples.";
+ };
+
+ settings = mkOption {
+ type = types.submodule {
+ freeformType = toml.type;
+
+ options = {
+ metadata_dir = mkOption {
+ default = "/var/lib/garage/meta";
+ type = types.path;
+ description = lib.mdDoc "The metadata directory, put this on a fast disk (e.g. SSD) if possible.";
+ };
+
+ data_dir = mkOption {
+ default = "/var/lib/garage/data";
+ type = types.path;
+ description = lib.mdDoc "The main data storage, put this on your large storage (e.g. high capacity HDD)";
+ };
+
+ replication_mode = mkOption {
+ default = "none";
+ type = types.enum ([ "none" "1" "2" "3" 1 2 3 ]);
+ apply = v: toString v;
+ description = lib.mdDoc "Garage replication mode, defaults to none, see: for reference.";
+ };
+ };
+ };
+ description = lib.mdDoc "Garage configuration, see for reference.";
+ };
+
+ package = mkOption {
+ default = pkgs.garage;
+ defaultText = literalExpression "pkgs.garage";
+ type = types.package;
+ description = lib.mdDoc "Garage package to use.";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ environment.etc."garage.toml" = {
+ source = configFile;
+ };
+
+ environment.systemPackages = [ cfg.package ]; # For administration
+
+ systemd.services.garage = {
+ description = "Garage Object Storage (S3 compatible)";
+ after = [ "network.target" "network-online.target" ];
+ wants = [ "network.target" "network-online.target" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ ExecStart = "${cfg.package}/bin/garage server";
+
+ StateDirectory = mkIf (hasPrefix "/var/lib/garage" cfg.settings.data_dir && hasPrefix "/var/lib/garage" cfg.settings.metadata_dir) "garage";
+ DynamicUser = lib.mkDefault true;
+ ProtectHome = true;
+ NoNewPrivileges = true;
+ };
+ environment = {
+ RUST_LOG = lib.mkDefault "garage=${cfg.logLevel}";
+ } // cfg.extraEnvironment;
+ };
+ };
+}
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index 8f404b2d1d65..df1304d94c69 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -214,6 +214,7 @@ in {
fsck = handleTest ./fsck.nix {};
ft2-clone = handleTest ./ft2-clone.nix {};
mimir = handleTest ./mimir.nix {};
+ garage = handleTest ./garage.nix {};
gerrit = handleTest ./gerrit.nix {};
geth = handleTest ./geth.nix {};
ghostunnel = handleTest ./ghostunnel.nix {};
diff --git a/nixos/tests/garage.nix b/nixos/tests/garage.nix
new file mode 100644
index 000000000000..dc1f83e7f8f3
--- /dev/null
+++ b/nixos/tests/garage.nix
@@ -0,0 +1,169 @@
+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";
+ 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"; };
+ node4 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::4"; };
+ };
+
+ testScript = ''
+ from typing import List
+ from dataclasses import dataclass
+ import re
+ start_all()
+
+ cur_version_regex = re.compile('Current cluster layout version: (?P\d*)')
+ key_creation_regex = re.compile('Key name: (?P.*)\nKey ID: (?P.*)\nSecret key: (?P.*)')
+
+ @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)
+
+ with subtest("Garage works as a multi-node S3 storage"):
+ nodes = ('node1', 'node2', 'node3', 'node4')
+ rev_machines = {m.name: m for m in machines}
+ def get_machine(key): return rev_machines[key]
+ for key in nodes:
+ node = get_machine(key)
+ node.wait_for_unit("garage.service")
+ node.wait_for_open_port(3900)
+
+ # Garage is initialized on all nodes.
+ node_ids = {key: get_node_fqn(get_machine(key)) for key in nodes}
+
+ for key in nodes:
+ for other_key in nodes:
+ if other_key != key:
+ other_id = node_ids[other_key]
+ get_machine(key).succeed(f"garage node connect {other_id.node_id}@{other_id.host}")
+
+ # Provide multiple zones for the nodes.
+ zones = ["nixcon", "nixcon", "paris_meetup", "fosdem"]
+ apply_garage_layout(node1,
+ [
+ f'{ndata.node_id} -z {zones[index]} -c 1'
+ for index, ndata in enumerate(node_ids.values())
+ ])
+ # Now Garage is operational.
+ test_bucket_writes(node1)
+ for node in nodes:
+ test_bucket_over_http(get_machine(node))
+ '';
+})
diff --git a/pkgs/applications/audio/strawberry/default.nix b/pkgs/applications/audio/strawberry/default.nix
index 8d77f661fbd1..13dc80c1dc63 100644
--- a/pkgs/applications/audio/strawberry/default.nix
+++ b/pkgs/applications/audio/strawberry/default.nix
@@ -42,13 +42,13 @@ let
in
stdenv.mkDerivation rec {
pname = "strawberry";
- version = "1.0.9";
+ version = "1.0.10";
src = fetchFromGitHub {
owner = "jonaski";
repo = pname;
rev = version;
- hash = "sha256-l6q9iTC3K7SwD0KfVVtXUGzeyuuR6OxtPkaj85s+qT4=";
+ hash = "sha256-N3jLw2UXLXLpTmFIHihzcMXrxJY0gmvwoawTQ0vRR+w=";
};
# the big strawberry shown in the context menu is *very* much in your face, so use the grey version instead
diff --git a/pkgs/applications/misc/diffuse/default.nix b/pkgs/applications/misc/diffuse/default.nix
index 40d5d5714482..fa6825bf9d62 100644
--- a/pkgs/applications/misc/diffuse/default.nix
+++ b/pkgs/applications/misc/diffuse/default.nix
@@ -9,17 +9,18 @@
, gdk-pixbuf
, python3
, atk
+, gtk3
}:
python3.pkgs.buildPythonApplication rec {
pname = "diffuse";
- version = "0.7.5";
+ version = "0.7.7";
src = fetchFromGitHub {
owner = "MightyCreak";
repo = "diffuse";
rev = "v${version}";
- sha256 = "0nd1fyl40wyc98jclcxv8zlnm744lrr51fahh5h9v4ksk184h4z8";
+ sha256 = "7tidv01znXYYSOKe3cH2+gSBF00aneL9nealcE5avcE=";
};
format = "other";
@@ -33,10 +34,10 @@ python3.pkgs.buildPythonApplication rec {
];
buildInputs = [
- gobject-introspection
pango
gdk-pixbuf
atk
+ gtk3
];
propagatedBuildInputs = with python3.pkgs; [
diff --git a/pkgs/applications/networking/cluster/terraform-providers/providers.json b/pkgs/applications/networking/cluster/terraform-providers/providers.json
index 49da95bd41eb..ec60c11c7987 100644
--- a/pkgs/applications/networking/cluster/terraform-providers/providers.json
+++ b/pkgs/applications/networking/cluster/terraform-providers/providers.json
@@ -651,13 +651,13 @@
"version": "2.14.0"
},
"launchdarkly": {
- "hash": "sha256-yIFR0QvSLWxCuzmq1nd55EmStpAZzf5tTxRUU6jqWvI=",
+ "hash": "sha256-AsFtlCIGvlG8c+PilhMhaMowaea/g1+IXYzEiIIbZ44=",
"owner": "launchdarkly",
"provider-source-address": "registry.terraform.io/launchdarkly/launchdarkly",
"repo": "terraform-provider-launchdarkly",
- "rev": "v2.9.3",
+ "rev": "v2.9.4",
"vendorHash": "sha256-Ef07RvkqXR/7qf8gHayxczBJ/ChHDmxR6+/wzaokkzk=",
- "version": "2.9.3"
+ "version": "2.9.4"
},
"libvirt": {
"hash": "sha256-j5EcxmkCyHwbXzvJ9lfQBRBYa3SbrKc3kbt1KZTm0gY=",
@@ -777,13 +777,13 @@
"version": "0.6.12"
},
"newrelic": {
- "hash": "sha256-tbjb+K2QP8+MFyJLQ3ewS6ALg7MGdpBjxZIaSKSxbiw=",
+ "hash": "sha256-pMHS8sS3qqsHjO0B3oFP/KInomYtmxRp2+4LLx9DI7M=",
"owner": "newrelic",
"provider-source-address": "registry.terraform.io/newrelic/newrelic",
"repo": "terraform-provider-newrelic",
- "rev": "v3.5.2",
+ "rev": "v3.6.0",
"vendorHash": "sha256-lEFcR908CK4RSSO/3kbqQ/wse5HKaqveWUZbzUhUTMI=",
- "version": "3.5.2"
+ "version": "3.6.0"
},
"nomad": {
"hash": "sha256-oHY+jM4JQgLlE1wd+/H9H8H2g0e9ZuxI6OMlz3Izfjg=",
@@ -813,13 +813,13 @@
"version": "3.2.8"
},
"null": {
- "hash": "sha256-OKnlIt+R16d5GOKqM7/+sApQoC1+nv9h5Ty32QIIMuQ=",
+ "hash": "sha256-2YM3btZInUlIwp1VkasuugZZ8FervpRviUlx60vhVak=",
"owner": "hashicorp",
"provider-source-address": "registry.terraform.io/hashicorp/null",
"repo": "terraform-provider-null",
- "rev": "v3.1.1",
- "vendorHash": "sha256-MtVpbcN/GZRYabsli2mhUXyCuRLRR0NEvcX1iLM552c=",
- "version": "3.1.1"
+ "rev": "v3.2.0",
+ "vendorHash": "sha256-rbZ7t5hcHkbbmqy+htYL7Ij8ZNILRsvUgLwwVObnZGg=",
+ "version": "3.2.0"
},
"nutanix": {
"deleteVendor": true,
@@ -868,13 +868,13 @@
"version": "1.0.1"
},
"openstack": {
- "hash": "sha256-I2Rl/Z6KHEkhaoslqMD+ZQ8vOnIwLDDJIP3P/3sTWcw=",
+ "hash": "sha256-k5UyK9jmjZzHw8AwmDRtyCyJgILAcCK+nN+hklJ9VFw=",
"owner": "terraform-provider-openstack",
"provider-source-address": "registry.terraform.io/terraform-provider-openstack/openstack",
"repo": "terraform-provider-openstack",
- "rev": "v1.48.0",
- "vendorHash": "sha256-XB8odOjqSVg/TJApHCZnlReJYTyD89u7axSilMlIALk=",
- "version": "1.48.0"
+ "rev": "v1.49.0",
+ "vendorHash": "sha256-hHwFm+gSMjN4YQEFd/dd50G0uZsxzqi21tHDf4mPBLY=",
+ "version": "1.49.0"
},
"opentelekomcloud": {
"hash": "sha256-oqagD7YK/HyAoeI5WBrHuAmWiLoz/1441zne8vqN3A8=",
@@ -1120,13 +1120,13 @@
"version": "0.13.5"
},
"tencentcloud": {
- "hash": "sha256-PTMgFLChuai8A4Tqo5Y+XHxSU+zV5K3zzzc1JTuuots=",
+ "hash": "sha256-0nPMT5jZxqKbCLQmjBywCBh1T2P2Q1NdghXH12BXaE4=",
"owner": "tencentcloudstack",
"provider-source-address": "registry.terraform.io/tencentcloudstack/tencentcloud",
"repo": "terraform-provider-tencentcloud",
- "rev": "v1.78.5",
+ "rev": "v1.78.6",
"vendorHash": null,
- "version": "1.78.5"
+ "version": "1.78.6"
},
"tfe": {
"hash": "sha256-MDlRwB2iVi/Rv7/UtukI6mIDImz8Gnpm5Qv5R6EDpiU=",
@@ -1202,14 +1202,14 @@
"version": "1.5.0"
},
"vault": {
- "hash": "sha256-v+WhEJ9HsTdOqSVpbV/qVCEICsgY3nEqcIutYHi3aQ8=",
+ "hash": "sha256-r4quQMAbAei8d+hzAOa7JqRIucrFSXqbVHT/VtpzwAU=",
"owner": "hashicorp",
"provider-source-address": "registry.terraform.io/hashicorp/vault",
"proxyVendor": true,
"repo": "terraform-provider-vault",
- "rev": "v3.9.1",
- "vendorHash": "sha256-/ZIGfLHkHq1Yv+AsSO7KueK5ANxnUWFKwLKyZ02q1cY=",
- "version": "3.9.1"
+ "rev": "v3.10.0",
+ "vendorHash": "sha256-EOBNoEW9GI21IgXSiEN93B3skxfCrBkNwLxGXaso1oE=",
+ "version": "3.10.0"
},
"vcd": {
"hash": "sha256-qEElcMl6tCBfOTTTpTFjVYg6E6K9iTXfgmDDozrgNVg=",
diff --git a/pkgs/applications/networking/instant-messengers/signalbackup-tools/default.nix b/pkgs/applications/networking/instant-messengers/signalbackup-tools/default.nix
index a24ac50012d4..34514b5dcd46 100644
--- a/pkgs/applications/networking/instant-messengers/signalbackup-tools/default.nix
+++ b/pkgs/applications/networking/instant-messengers/signalbackup-tools/default.nix
@@ -2,13 +2,13 @@
stdenv.mkDerivation rec {
pname = "signalbackup-tools";
- version = "20220914-1";
+ version = "20221025";
src = fetchFromGitHub {
owner = "bepaald";
repo = pname;
rev = version;
- sha256 = "sha256-6tRIjOs6NZUQy7j5oePJ/9FuvfDhy3+uKq6CSuAi5hU=";
+ sha256 = "sha256-icUyuohJ+nUrmFx/q5+hvjY1My25TwIqh6W6hq1pG4k=";
};
postPatch = ''
diff --git a/pkgs/development/python-modules/pyinfra/default.nix b/pkgs/development/python-modules/pyinfra/default.nix
index 467bc00ba7ad..ff6041c948d9 100644
--- a/pkgs/development/python-modules/pyinfra/default.nix
+++ b/pkgs/development/python-modules/pyinfra/default.nix
@@ -18,7 +18,7 @@
buildPythonPackage rec {
pname = "pyinfra";
- version = "2.4";
+ version = "2.5.1";
format = "setuptools";
disabled = pythonOlder "3.7";
@@ -27,7 +27,7 @@ buildPythonPackage rec {
owner = "Fizzadar";
repo = pname;
rev = "refs/tags/v${version}";
- hash = "sha256-nWH4o6NqyqkZg/HxF6NesnA6ijWo+B94BeohSsP60TY=";
+ hash = "sha256-cN7nyjdnU/ls3HNhC2m1sunRrmZFT5pFZr+kEBcwHkU=";
};
propagatedBuildInputs = [
diff --git a/pkgs/development/tools/parsing/antlr/4.nix b/pkgs/development/tools/parsing/antlr/4.nix
index 85938153862c..8753bb834de5 100644
--- a/pkgs/development/tools/parsing/antlr/4.nix
+++ b/pkgs/development/tools/parsing/antlr/4.nix
@@ -77,7 +77,7 @@ let
pname = "antlr-runtime-cpp";
inherit version;
src = source;
- sourceRoot = "runtime/Cpp";
+ sourceRoot = "source/runtime/Cpp";
outputs = [ "out" "dev" "doc" ];
diff --git a/pkgs/games/legendary-gl/default.nix b/pkgs/games/legendary-gl/default.nix
index 362788b441e1..b0247e8fe7bf 100644
--- a/pkgs/games/legendary-gl/default.nix
+++ b/pkgs/games/legendary-gl/default.nix
@@ -7,13 +7,13 @@
buildPythonApplication rec {
pname = "legendary-gl"; # Name in pypi
- version = "0.20.29";
+ version = "0.20.30";
src = fetchFromGitHub {
owner = "derrod";
repo = "legendary";
rev = "refs/tags/${version}";
- sha256 = "sha256-yocGjPZzuLHvWQ1EuS+kMxb/6ikfPvKqFmvHK+SyE+E=";
+ sha256 = "sha256-LyA8crGm1ApkI4yqVayM92EHtisQLuNmuKiLTyPyFlk=";
};
propagatedBuildInputs = [ requests ];
diff --git a/pkgs/os-specific/linux/cshatag/default.nix b/pkgs/os-specific/linux/cshatag/default.nix
index dc210b017a68..64fb6f4f88ff 100644
--- a/pkgs/os-specific/linux/cshatag/default.nix
+++ b/pkgs/os-specific/linux/cshatag/default.nix
@@ -2,16 +2,16 @@
buildGoModule rec {
pname = "cshatag";
- version = "2.0";
+ version = "2.1.0";
src = fetchFromGitHub {
owner = "rfjakob";
repo = pname;
rev = "v${version}";
- sha256 = "sha256-jSRMNLS+JnA3coZf9zkOL/buxZubhbftXnxDJx0nwuU=";
+ sha256 = "sha256-Ez8zGVX10A7xuggkh3n7w/qzda8f4t6EgSc9l6SPEZQ=";
};
- vendorSha256 = "sha256-BX7jbYhs3+yeOUvPvz08aV2p14bXNGTag4QYkCHr5DQ=";
+ vendorSha256 = "sha256-QTnwltsoyUbH4vob5go1KBrb9gwxaaPNW3S4sxVls3k=";
ldflags = [ "-s" "-w" ];
diff --git a/pkgs/servers/sunshine/default.nix b/pkgs/servers/sunshine/default.nix
new file mode 100644
index 000000000000..583192019d34
--- /dev/null
+++ b/pkgs/servers/sunshine/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, avahi
+, libevdev
+, libpulseaudio
+, xorg
+, libxcb
+, openssl
+, libopus
+, ffmpeg-full
+, boost
+, pkg-config
+, libdrm
+, wayland
+, libffi
+, libcap
+, mesa
+, cudaSupport ? false
+, cudaPackages ? {}
+}:
+
+stdenv.mkDerivation rec {
+ pname = "sunshine";
+ version = "0.14.1";
+
+ src = fetchFromGitHub {
+ owner = "LizardByte";
+ repo = "Sunshine";
+ rev = "v${version}";
+ sha256 = "sha256-SB2DAOYf2izIwwRWEw2wt5L5oCDbb6YOqXw/z/PD1pQ=";
+ fetchSubmodules = true;
+ };
+
+ nativeBuildInputs = [
+ cmake
+ pkg-config
+ ] ++ lib.optionals cudaSupport [
+ cudaPackages.autoAddOpenGLRunpathHook
+ ];
+
+ buildInputs = [
+ avahi
+ ffmpeg-full
+ libevdev
+ libpulseaudio
+ xorg.libX11
+ libxcb
+ xorg.libXfixes
+ xorg.libXrandr
+ xorg.libXtst
+ openssl
+ libopus
+ boost
+ libdrm
+ wayland
+ libffi
+ libevdev
+ libcap
+ libdrm
+ mesa
+ ] ++ lib.optionals cudaSupport [
+ cudaPackages.cudatoolkit
+ ];
+
+ CXXFLAGS = [
+ "-Wno-format-security"
+ ];
+ CFLAGS = [
+ "-Wno-format-security"
+ ];
+
+ cmakeFlags = [
+ "-D" "FFMPEG_LIBRARIES=${ffmpeg-full}/lib"
+ "-D" "FFMPEG_INCLUDE_DIRS=${ffmpeg-full}/include"
+ "-D" "LIBAVCODEC_INCLUDE_DIR=${ffmpeg-full}/include"
+ "-D" "LIBAVCODEC_LIBRARIES=${ffmpeg-full}/lib/libavcodec.so"
+ "-D" "LIBAVDEVICE_INCLUDE_DIR=${ffmpeg-full}/include"
+ "-D" "LIBAVDEVICE_LIBRARIES=${ffmpeg-full}/lib/libavdevice.so"
+ "-D" "LIBAVFORMAT_INCLUDE_DIR=${ffmpeg-full}/include"
+ "-D" "LIBAVFORMAT_LIBRARIES=${ffmpeg-full}/lib/libavformat.so"
+ "-D" "LIBAVUTIL_INCLUDE_DIR=${ffmpeg-full}/include"
+ "-D" "LIBAVUTIL_LIBRARIES=${ffmpeg-full}/lib/libavutil.so"
+ "-D" "LIBSWSCALE_LIBRARIES=${ffmpeg-full}/lib/libswscale.so"
+ "-D" "LIBSWSCALE_INCLUDE_DIR=${ffmpeg-full}/include"
+ ];
+
+ postPatch = ''
+ # Don't force the need for a static boost, fix hardcoded libevdev path
+ substituteInPlace CMakeLists.txt \
+ --replace 'set(Boost_USE_STATIC_LIBS ON)' '# set(Boost_USE_STATIC_LIBS ON)' \
+ --replace '/usr/include/libevdev-1.0' '${libevdev}/include/libevdev-1.0'
+
+ # fix libgbm path
+ substituteInPlace src/platform/linux/graphics.cpp \
+ --replace 'handle = dyn::handle({ "libgbm.so.1", "libgbm.so" });' 'handle = dyn::handle({ "${mesa}/lib/libgbm.so.1", "${mesa}/lib/libgbm.so" });'
+
+ # fix avahi path
+ substituteInPlace src/platform/linux/publish.cpp \
+ --replace 'handle = dyn::handle({ "libavahi-client.so.3", "libavahi-client.so" });' 'handle = dyn::handle({ "${avahi}/lib/libavahi-client.so.3", "${avahi}/lib/libavahi-client.so" });' \
+ --replace 'handle = dyn::handle({ "libavahi-common.so.3", "libavahi-common.so" });' 'handle = dyn::handle({ "${avahi}/lib/libavahi-common.so.3", "${avahi}/lib/libavahi-common.so" });'
+ '';
+
+ meta = with lib; {
+ description = "Sunshine is a Game stream host for Moonlight.";
+ homepage = "https://docs.lizardbyte.dev/projects/sunshine/";
+ license = licenses.gpl3Only;
+ maintainers = with maintainers; [ devusb ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/tools/misc/topgrade/default.nix b/pkgs/tools/misc/topgrade/default.nix
index 5bdca2a0418f..49bf928b410e 100644
--- a/pkgs/tools/misc/topgrade/default.nix
+++ b/pkgs/tools/misc/topgrade/default.nix
@@ -10,16 +10,16 @@
rustPlatform.buildRustPackage rec {
pname = "topgrade";
- version = "9.1.1";
+ version = "10.0.1";
src = fetchFromGitHub {
owner = "topgrade-rs";
repo = "topgrade";
rev = "v${version}";
- sha256 = "sha256-0WI05bfnCKjsUJJyurnouVE/wkCJZ+6DStQMPBNI+Bs=";
+ sha256 = "sha256-mrBcgzlAsikpxkCD8OGKyUPOYkgp7giPCaZPbzCcXg4=";
};
- cargoSha256 = "sha256-EVnH1YT5ivuBhhd54sho/1x4ZPhrdrWjE40FGL9HXRc=";
+ cargoSha256 = "sha256-ImEnGhBjjHtAeoFqyeNKm39Bqs/icPstybFUlouBbFM=";
nativeBuildInputs = [ installShellFiles ];
@@ -28,7 +28,6 @@ rustPlatform.buildRustPackage rec {
NIX_CFLAGS_COMPILE = lib.optionals stdenv.isDarwin [ "-framework" "AppKit" ];
postInstall = ''
- ln -rs $out/bin/topgrade-rs $out/bin/topgrade
installManPage topgrade.8
'';
diff --git a/pkgs/tools/networking/openssh/default.nix b/pkgs/tools/networking/openssh/default.nix
index 7a2be129b8dd..f9ad037d55da 100644
--- a/pkgs/tools/networking/openssh/default.nix
+++ b/pkgs/tools/networking/openssh/default.nix
@@ -19,12 +19,12 @@ in
openssh_hpn = common rec {
pname = "openssh-with-hpn";
- version = "9.0p1";
+ version = "9.1p1";
extraDesc = " with high performance networking patches";
src = fetchurl {
url = "mirror://openbsd/OpenSSH/portable/openssh-${version}.tar.gz";
- sha256 = "12m2f9czvgmi7akp7xah6y7mrrpi280a3ksk47iwr7hy2q1475q3";
+ hash = "sha256-GfhQCcfj4jeH8CNvuxV4OSq01L+fjsX+a8HNfov90og=";
};
extraPatches = [
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index d45529418b64..1cbcc4c037e1 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -16105,6 +16105,7 @@ with pkgs;
inherit (callPackages ../development/tools/parsing/antlr/4.nix { })
antlr4_9
+ antlr4_10
antlr4_11;
antlr4 = antlr4_8;
@@ -37745,6 +37746,8 @@ with pkgs;
stayrtr = callPackage ../servers/stayrtr {};
+ sunshine = callPackage ../servers/sunshine {};
+
sentencepiece = callPackage ../development/libraries/sentencepiece {};
kaf = callPackage ../development/tools/kaf { };