diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 2d6a99ebb426..e9949afe417d 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -2143,6 +2143,12 @@
githubId = 199180;
name = "Claes Wallin";
};
+ cleeyv = {
+ email = "cleeyv@riseup.net";
+ github = "cleeyv";
+ githubId = 71959829;
+ name = "Cleeyv";
+ };
cleverca22 = {
email = "cleverca22@gmail.com";
matrix = "@cleverca22:matrix.org";
diff --git a/maintainers/team-list.nix b/maintainers/team-list.nix
index 4a1ca99a5905..7ae768914c5b 100644
--- a/maintainers/team-list.nix
+++ b/maintainers/team-list.nix
@@ -145,6 +145,7 @@ with lib.maintainers; {
jitsi = {
members = [
+ cleeyv
petabyteboy
ryantm
yuka
diff --git a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
index aa64080f4706..908d2cf7fbe0 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
@@ -136,6 +136,14 @@
services.geoipupdate.
+
+
+ Jibri,
+ a service for recording or streaming a Jitsi Meet conference.
+ Available as
+ services.jibri.
+
+
Kea, ISCs
diff --git a/nixos/doc/manual/release-notes/rl-2111.section.md b/nixos/doc/manual/release-notes/rl-2111.section.md
index 7caa3c9083c0..645bcf6d4770 100644
--- a/nixos/doc/manual/release-notes/rl-2111.section.md
+++ b/nixos/doc/manual/release-notes/rl-2111.section.md
@@ -45,6 +45,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [geoipupdate](https://github.com/maxmind/geoipupdate), a GeoIP database updater from MaxMind. Available as [services.geoipupdate](options.html#opt-services.geoipupdate.enable).
+- [Jibri](https://github.com/jitsi/jibri), a service for recording or streaming a Jitsi Meet conference. Available as [services.jibri](options.html#opt-services.jibri.enable).
+
- [Kea](https://www.isc.org/kea/), ISCs 2nd generation DHCP and DDNS server suite. Available at [services.kea](options.html#opt-services.kea).
- [owncast](https://owncast.online/), self-hosted video live streaming solution. Available at [services.owncast](options.html#opt-services.owncast).
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index d4aaa7ebd221..41a7db17c328 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -756,6 +756,7 @@
./services/networking/iscsi/root-initiator.nix
./services/networking/iscsi/target.nix
./services/networking/iwd.nix
+ ./services/networking/jibri/default.nix
./services/networking/jicofo.nix
./services/networking/jitsi-videobridge.nix
./services/networking/kea.nix
diff --git a/nixos/modules/services/networking/jibri/default.nix b/nixos/modules/services/networking/jibri/default.nix
new file mode 100644
index 000000000000..96832b0eb552
--- /dev/null
+++ b/nixos/modules/services/networking/jibri/default.nix
@@ -0,0 +1,417 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.jibri;
+
+ # Copied from the jitsi-videobridge.nix file.
+ toHOCON = x:
+ if isAttrs x && x ? __hocon_envvar then ("\${" + x.__hocon_envvar + "}")
+ else if isAttrs x then "{${ concatStringsSep "," (mapAttrsToList (k: v: ''"${k}":${toHOCON v}'') x) }}"
+ else if isList x then "[${ concatMapStringsSep "," toHOCON x }]"
+ else builtins.toJSON x;
+
+ # We're passing passwords in environment variables that have names generated
+ # from an attribute name, which may not be a valid bash identifier.
+ toVarName = s: "XMPP_PASSWORD_" + stringAsChars (c: if builtins.match "[A-Za-z0-9]" c != null then c else "_") s;
+
+ defaultJibriConfig = {
+ id = "";
+ single-use-mode = false;
+
+ api = {
+ http.external-api-port = 2222;
+ http.internal-api-port = 3333;
+
+ xmpp.environments = flip mapAttrsToList cfg.xmppEnvironments (name: env: {
+ inherit name;
+
+ xmpp-server-hosts = env.xmppServerHosts;
+ xmpp-domain = env.xmppDomain;
+ control-muc = {
+ domain = env.control.muc.domain;
+ room-name = env.control.muc.roomName;
+ nickname = env.control.muc.nickname;
+ };
+
+ control-login = {
+ domain = env.control.login.domain;
+ username = env.control.login.username;
+ password.__hocon_envvar = toVarName "${name}_control";
+ };
+
+ call-login = {
+ domain = env.call.login.domain;
+ username = env.call.login.username;
+ password.__hocon_envvar = toVarName "${name}_call";
+ };
+
+ strip-from-room-domain = env.stripFromRoomDomain;
+ usage-timeout = env.usageTimeout;
+ trust-all-xmpp-certs = env.disableCertificateVerification;
+ });
+ };
+
+ recording = {
+ recordings-directory = "/tmp/recordings";
+ finalize-script = "${cfg.finalizeScript}";
+ };
+
+ streaming.rtmp-allow-list = [ ".*" ];
+
+ chrome.flags = [
+ "--use-fake-ui-for-media-stream"
+ "--start-maximized"
+ "--kiosk"
+ "--enabled"
+ "--disable-infobars"
+ "--autoplay-policy=no-user-gesture-required"
+ ]
+ ++ lists.optional cfg.ignoreCert
+ "--ignore-certificate-errors";
+
+
+ stats.enable-stats-d = true;
+ webhook.subscribers = [ ];
+
+ jwt-info = { };
+
+ call-status-checks = {
+ no-media-timout = "30 seconds";
+ all-muted-timeout = "10 minutes";
+ default-call-empty-timout = "30 seconds";
+ };
+ };
+ # Allow overriding leaves of the default config despite types.attrs not doing any merging.
+ jibriConfig = recursiveUpdate defaultJibriConfig cfg.config;
+ configFile = pkgs.writeText "jibri.conf" (toHOCON { jibri = jibriConfig; });
+in
+{
+ options.services.jibri = with types; {
+ enable = mkEnableOption "Jitsi BRoadcasting Infrastructure. Currently Jibri must be run on a host that is also running , so for most use cases it will be simpler to run ";
+ config = mkOption {
+ type = attrs;
+ default = { };
+ description = ''
+ Jibri configuration.
+ See
+ for default configuration with comments.
+ '';
+ };
+
+ finalizeScript = mkOption {
+ type = types.path;
+ default = pkgs.writeScript "finalize_recording.sh" ''
+ #!/bin/sh
+
+ RECORDINGS_DIR=$1
+
+ echo "This is a dummy finalize script" > /tmp/finalize.out
+ echo "The script was invoked with recordings directory $RECORDINGS_DIR." >> /tmp/finalize.out
+ echo "You should put any finalize logic (renaming, uploading to a service" >> /tmp/finalize.out
+ echo "or storage provider, etc.) in this script" >> /tmp/finalize.out
+
+ exit 0
+ '';
+ defaultText = literalExpression ''
+ pkgs.writeScript "finalize_recording.sh" ''''''
+ #!/bin/sh
+
+ RECORDINGS_DIR=$1
+
+ echo "This is a dummy finalize script" > /tmp/finalize.out
+ echo "The script was invoked with recordings directory $RECORDINGS_DIR." >> /tmp/finalize.out
+ echo "You should put any finalize logic (renaming, uploading to a service" >> /tmp/finalize.out
+ echo "or storage provider, etc.) in this script" >> /tmp/finalize.out
+
+ exit 0
+ '''''';
+ '';
+ example = literalExpression ''
+ pkgs.writeScript "finalize_recording.sh" ''''''
+ #!/bin/sh
+ RECORDINGS_DIR=$1
+ ${pkgs.rclone}/bin/rclone copy $RECORDINGS_DIR RCLONE_REMOTE:jibri-recordings/ -v --log-file=/var/log/jitsi/jibri/recording-upload.txt
+ exit 0
+ '''''';
+ '';
+ description = ''
+ This script runs when jibri finishes recording a video of a conference.
+ '';
+ };
+
+ ignoreCert = mkOption {
+ type = bool;
+ default = false;
+ example = true;
+ description = ''
+ Whether to enable the flag "--ignore-certificate-errors" for the Chromium browser opened by Jibri.
+ Intended for use in automated tests or anywhere else where using a verified cert for Jitsi-Meet is not possible.
+ '';
+ };
+
+ xmppEnvironments = mkOption {
+ description = ''
+ XMPP servers to connect to.
+ '';
+ example = literalExpression ''
+ "jitsi-meet" = {
+ xmppServerHosts = [ "localhost" ];
+ xmppDomain = config.services.jitsi-meet.hostName;
+
+ control.muc = {
+ domain = "internal.''${config.services.jitsi-meet.hostName}";
+ roomName = "JibriBrewery";
+ nickname = "jibri";
+ };
+
+ control.login = {
+ domain = "auth.''${config.services.jitsi-meet.hostName}";
+ username = "jibri";
+ passwordFile = "/var/lib/jitsi-meet/jibri-auth-secret";
+ };
+
+ call.login = {
+ domain = "recorder.''${config.services.jitsi-meet.hostName}";
+ username = "recorder";
+ passwordFile = "/var/lib/jitsi-meet/jibri-recorder-secret";
+ };
+
+ usageTimeout = "0";
+ disableCertificateVerification = true;
+ stripFromRoomDomain = "conference.";
+ };
+ '';
+ default = { };
+ type = attrsOf (submodule ({ name, ... }: {
+ options = {
+ xmppServerHosts = mkOption {
+ type = listOf str;
+ example = [ "xmpp.example.org" ];
+ description = ''
+ Hostnames of the XMPP servers to connect to.
+ '';
+ };
+ xmppDomain = mkOption {
+ type = str;
+ example = "xmpp.example.org";
+ description = ''
+ The base XMPP domain.
+ '';
+ };
+ control.muc.domain = mkOption {
+ type = str;
+ description = ''
+ The domain part of the MUC to connect to for control.
+ '';
+ };
+ control.muc.roomName = mkOption {
+ type = str;
+ default = "JibriBrewery";
+ description = ''
+ The room name of the MUC to connect to for control.
+ '';
+ };
+ control.muc.nickname = mkOption {
+ type = str;
+ default = "jibri";
+ description = ''
+ The nickname for this Jibri instance in the MUC.
+ '';
+ };
+ control.login.domain = mkOption {
+ type = str;
+ description = ''
+ The domain part of the JID for this Jibri instance.
+ '';
+ };
+ control.login.username = mkOption {
+ type = str;
+ default = "jvb";
+ description = ''
+ User part of the JID.
+ '';
+ };
+ control.login.passwordFile = mkOption {
+ type = str;
+ example = "/run/keys/jibri-xmpp1";
+ description = ''
+ File containing the password for the user.
+ '';
+ };
+
+ call.login.domain = mkOption {
+ type = str;
+ example = "recorder.xmpp.example.org";
+ description = ''
+ The domain part of the JID for the recorder.
+ '';
+ };
+ call.login.username = mkOption {
+ type = str;
+ default = "recorder";
+ description = ''
+ User part of the JID for the recorder.
+ '';
+ };
+ call.login.passwordFile = mkOption {
+ type = str;
+ example = "/run/keys/jibri-recorder-xmpp1";
+ description = ''
+ File containing the password for the user.
+ '';
+ };
+ disableCertificateVerification = mkOption {
+ type = bool;
+ default = false;
+ description = ''
+ Whether to skip validation of the server's certificate.
+ '';
+ };
+
+ stripFromRoomDomain = mkOption {
+ type = str;
+ default = "0";
+ example = "conference.";
+ description = ''
+ The prefix to strip from the room's JID domain to derive the call URL.
+ '';
+ };
+ usageTimeout = mkOption {
+ type = str;
+ default = "0";
+ example = "1 hour";
+ description = ''
+ The duration that the Jibri session can be.
+ A value of zero means indefinitely.
+ '';
+ };
+ };
+
+ config =
+ let
+ nick = mkDefault (builtins.replaceStrings [ "." ] [ "-" ] (
+ config.networking.hostName + optionalString (config.networking.domain != null) ".${config.networking.domain}"
+ ));
+ in
+ {
+ call.login.username = nick;
+ control.muc.nickname = nick;
+ };
+ }));
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.groups.jibri = { };
+ users.groups.plugdev = { };
+ users.users.jibri = {
+ isSystemUser = true;
+ group = "jibri";
+ home = "/var/lib/jibri";
+ extraGroups = [ "jitsi-meet" "adm" "audio" "video" "plugdev" ];
+ };
+
+ systemd.services.jibri-xorg = {
+ description = "Jitsi Xorg Process";
+
+ after = [ "network.target" ];
+ wantedBy = [ "jibri.service" "jibri-icewm.service" ];
+
+ preStart = ''
+ cp --no-preserve=mode,ownership ${pkgs.jibri}/etc/jitsi/jibri/* /var/lib/jibri
+ mv /var/lib/jibri/{,.}asoundrc
+ '';
+
+ environment.DISPLAY = ":0";
+ serviceConfig = {
+ Type = "simple";
+
+ User = "jibri";
+ Group = "jibri";
+ KillMode = "process";
+ Restart = "on-failure";
+ RestartPreventExitStatus = 255;
+
+ StateDirectory = "jibri";
+
+ ExecStart = "${pkgs.xorg.xorgserver}/bin/Xorg -nocursor -noreset +extension RANDR +extension RENDER -config ${pkgs.jibri}/etc/jitsi/jibri/xorg-video-dummy.conf -logfile /dev/null :0";
+ };
+ };
+
+ systemd.services.jibri-icewm = {
+ description = "Jitsi Window Manager";
+
+ requires = [ "jibri-xorg.service" ];
+ after = [ "jibri-xorg.service" ];
+ wantedBy = [ "jibri.service" ];
+
+ environment.DISPLAY = ":0";
+ serviceConfig = {
+ Type = "simple";
+
+ User = "jibri";
+ Group = "jibri";
+ Restart = "on-failure";
+ RestartPreventExitStatus = 255;
+
+ StateDirectory = "jibri";
+
+ ExecStart = "${pkgs.icewm}/bin/icewm-session";
+ };
+ };
+
+ systemd.services.jibri = {
+ description = "Jibri Process";
+
+ requires = [ "jibri-icewm.service" "jibri-xorg.service" ];
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+
+ path = with pkgs; [ chromedriver chromium ffmpeg-full ];
+
+ script = (concatStrings (mapAttrsToList
+ (name: env: ''
+ export ${toVarName "${name}_control"}=$(cat ${env.control.login.passwordFile})
+ export ${toVarName "${name}_call"}=$(cat ${env.call.login.passwordFile})
+ '')
+ cfg.xmppEnvironments))
+ + ''
+ ${pkgs.jre8_headless}/bin/java -Djava.util.logging.config.file=${./logging.properties-journal} -Dconfig.file=${configFile} -jar ${pkgs.jibri}/opt/jitsi/jibri/jibri.jar --config /var/lib/jibri/jibri.json
+ '';
+
+ environment.HOME = "/var/lib/jibri";
+
+ serviceConfig = {
+ Type = "simple";
+
+ User = "jibri";
+ Group = "jibri";
+ Restart = "always";
+ RestartPreventExitStatus = 255;
+
+ StateDirectory = "jibri";
+ };
+ };
+
+ systemd.tmpfiles.rules = [
+ "d /var/log/jitsi/jibri 755 jibri jibri"
+ ];
+
+
+
+ # Configure Chromium to not show the "Chrome is being controlled by automatic test software" message.
+ environment.etc."chromium/policies/managed/managed_policies.json".text = builtins.toJSON { CommandLineFlagSecurityWarningsEnabled = false; };
+ warnings = [ "All security warnings for Chromium have been disabled. This is necessary for Jibri, but it also impacts all other uses of Chromium on this system." ];
+
+ boot = {
+ extraModprobeConfig = ''
+ options snd-aloop enable=1,1,1,1,1,1,1,1
+ '';
+ kernelModules = [ "snd-aloop" ];
+ };
+ };
+
+ meta.maintainers = lib.teams.jitsi.members;
+}
diff --git a/nixos/modules/services/networking/jibri/logging.properties-journal b/nixos/modules/services/networking/jibri/logging.properties-journal
new file mode 100644
index 000000000000..61eadbfddcb3
--- /dev/null
+++ b/nixos/modules/services/networking/jibri/logging.properties-journal
@@ -0,0 +1,32 @@
+handlers = java.util.logging.FileHandler
+
+java.util.logging.FileHandler.level = FINE
+java.util.logging.FileHandler.pattern = /var/log/jitsi/jibri/log.%g.txt
+java.util.logging.FileHandler.formatter = net.java.sip.communicator.util.ScLogFormatter
+java.util.logging.FileHandler.count = 10
+java.util.logging.FileHandler.limit = 10000000
+
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.level = FINE
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.pattern = /var/log/jitsi/jibri/ffmpeg.%g.txt
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.formatter = net.java.sip.communicator.util.ScLogFormatter
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.count = 10
+org.jitsi.jibri.capture.ffmpeg.util.FfmpegFileHandler.limit = 10000000
+
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.level = FINE
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.pattern = /var/log/jitsi/jibri/pjsua.%g.txt
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.formatter = net.java.sip.communicator.util.ScLogFormatter
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.count = 10
+org.jitsi.jibri.sipgateway.pjsua.util.PjsuaFileHandler.limit = 10000000
+
+org.jitsi.jibri.selenium.util.BrowserFileHandler.level = FINE
+org.jitsi.jibri.selenium.util.BrowserFileHandler.pattern = /var/log/jitsi/jibri/browser.%g.txt
+org.jitsi.jibri.selenium.util.BrowserFileHandler.formatter = net.java.sip.communicator.util.ScLogFormatter
+org.jitsi.jibri.selenium.util.BrowserFileHandler.count = 10
+org.jitsi.jibri.selenium.util.BrowserFileHandler.limit = 10000000
+
+org.jitsi.level = FINE
+org.jitsi.jibri.config.level = INFO
+
+org.glassfish.level = INFO
+org.osgi.level = INFO
+org.jitsi.xmpp.level = INFO
diff --git a/nixos/modules/services/web-apps/jitsi-meet.nix b/nixos/modules/services/web-apps/jitsi-meet.nix
index 2eacd87ae6fd..2f1c4acec1e8 100644
--- a/nixos/modules/services/web-apps/jitsi-meet.nix
+++ b/nixos/modules/services/web-apps/jitsi-meet.nix
@@ -38,6 +38,10 @@ let
};
bosh = "//${cfg.hostName}/http-bind";
websocket = "wss://${cfg.hostName}/xmpp-websocket";
+
+ fileRecordingsEnabled = true;
+ liveStreamingEnabled = true;
+ hiddenDomain = "recorder.${cfg.hostName}";
};
in
{
@@ -48,7 +52,7 @@ in
type = str;
example = "meet.example.org";
description = ''
- Hostname of the Jitsi Meet instance.
+ FQDN of the Jitsi Meet instance.
'';
};
@@ -130,6 +134,17 @@ in
'';
};
+ jibri.enable = mkOption {
+ type = bool;
+ default = false;
+ description = ''
+ Whether to enable a Jibri instance and configure it to connect to Prosody.
+
+ Additional configuration is possible with , and
+ is especially useful.
+ '';
+ };
+
nginx.enable = mkOption {
type = bool;
default = true;
@@ -229,6 +244,14 @@ in
key = "/var/lib/jitsi-meet/jitsi-meet.key";
};
};
+ virtualHosts."recorder.${cfg.hostName}" = {
+ enabled = true;
+ domain = "recorder.${cfg.hostName}";
+ extraConfig = ''
+ authentication = "internal_plain"
+ c2s_require_encryption = false
+ '';
+ };
};
systemd.services.prosody.serviceConfig = mkIf cfg.prosody.enable {
EnvironmentFile = [ "/var/lib/jitsi-meet/secrets-env" ];
@@ -243,12 +266,13 @@ in
systemd.services.jitsi-meet-init-secrets = {
wantedBy = [ "multi-user.target" ];
before = [ "jicofo.service" "jitsi-videobridge2.service" ] ++ (optional cfg.prosody.enable "prosody.service");
+ path = [ config.services.prosody.package ];
serviceConfig = {
Type = "oneshot";
};
script = let
- secrets = [ "jicofo-component-secret" "jicofo-user-secret" ] ++ (optional (cfg.videobridge.passwordFile == null) "videobridge-secret");
+ secrets = [ "jicofo-component-secret" "jicofo-user-secret" "jibri-auth-secret" "jibri-recorder-secret" ] ++ (optional (cfg.videobridge.passwordFile == null) "videobridge-secret");
videobridgeSecret = if cfg.videobridge.passwordFile != null then cfg.videobridge.passwordFile else "/var/lib/jitsi-meet/videobridge-secret";
in
''
@@ -267,9 +291,11 @@ in
chmod 640 secrets-env
''
+ optionalString cfg.prosody.enable ''
- ${config.services.prosody.package}/bin/prosodyctl register focus auth.${cfg.hostName} "$(cat /var/lib/jitsi-meet/jicofo-user-secret)"
- ${config.services.prosody.package}/bin/prosodyctl register jvb auth.${cfg.hostName} "$(cat ${videobridgeSecret})"
- ${config.services.prosody.package}/bin/prosodyctl mod_roster_command subscribe focus.${cfg.hostName} focus@auth.${cfg.hostName}
+ prosodyctl register focus auth.${cfg.hostName} "$(cat /var/lib/jitsi-meet/jicofo-user-secret)"
+ prosodyctl register jvb auth.${cfg.hostName} "$(cat ${videobridgeSecret})"
+ prosodyctl mod_roster_command subscribe focus.${cfg.hostName} focus@auth.${cfg.hostName}
+ prosodyctl register jibri auth.${cfg.hostName} "$(cat /var/lib/jitsi-meet/jibri-auth-secret)"
+ prosodyctl register recorder recorder.${cfg.hostName} "$(cat /var/lib/jitsi-meet/jibri-recorder-secret)"
# generate self-signed certificates
if [ ! -f /var/lib/jitsi-meet.crt ]; then
@@ -380,8 +406,43 @@ in
userPasswordFile = "/var/lib/jitsi-meet/jicofo-user-secret";
componentPasswordFile = "/var/lib/jitsi-meet/jicofo-component-secret";
bridgeMuc = "jvbbrewery@internal.${cfg.hostName}";
- config = {
+ config = mkMerge [{
"org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED" = "true";
+ #} (lib.mkIf cfg.jibri.enable {
+ } (lib.mkIf (config.services.jibri.enable || cfg.jibri.enable) {
+ "org.jitsi.jicofo.jibri.BREWERY" = "JibriBrewery@internal.${cfg.hostName}";
+ "org.jitsi.jicofo.jibri.PENDING_TIMEOUT" = "90";
+ })];
+ };
+
+ services.jibri = mkIf cfg.jibri.enable {
+ enable = true;
+
+ xmppEnvironments."jitsi-meet" = {
+ xmppServerHosts = [ "localhost" ];
+ xmppDomain = cfg.hostName;
+
+ control.muc = {
+ domain = "internal.${cfg.hostName}";
+ roomName = "JibriBrewery";
+ nickname = "jibri";
+ };
+
+ control.login = {
+ domain = "auth.${cfg.hostName}";
+ username = "jibri";
+ passwordFile = "/var/lib/jitsi-meet/jibri-auth-secret";
+ };
+
+ call.login = {
+ domain = "recorder.${cfg.hostName}";
+ username = "recorder";
+ passwordFile = "/var/lib/jitsi-meet/jibri-recorder-secret";
+ };
+
+ usageTimeout = "0";
+ disableCertificateVerification = true;
+ stripFromRoomDomain = "conference.";
};
};
};
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index 2b276851644d..b0623896a2da 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -207,6 +207,7 @@ in
jackett = handleTest ./jackett.nix {};
jellyfin = handleTest ./jellyfin.nix {};
jenkins = handleTest ./jenkins.nix {};
+ jibri = handleTest ./jibri.nix {};
jirafeau = handleTest ./jirafeau.nix {};
jitsi-meet = handleTest ./jitsi-meet.nix {};
k3s = handleTest ./k3s.nix {};
diff --git a/nixos/tests/jibri.nix b/nixos/tests/jibri.nix
new file mode 100644
index 000000000000..3dd28e6aac1a
--- /dev/null
+++ b/nixos/tests/jibri.nix
@@ -0,0 +1,69 @@
+import ./make-test-python.nix ({ pkgs, ... }: {
+ name = "jibri";
+ meta = with pkgs.lib; {
+ maintainers = teams.jitsi.members;
+ };
+
+ machine = { config, pkgs, ... }: {
+ virtualisation.memorySize = 5120;
+
+ services.jitsi-meet = {
+ enable = true;
+ hostName = "machine";
+ jibri.enable = true;
+ };
+ services.jibri.ignoreCert = true;
+ services.jitsi-videobridge.openFirewall = true;
+
+ networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+ services.nginx.virtualHosts.machine = {
+ enableACME = true;
+ forceSSL = true;
+ };
+
+ security.acme.email = "me@example.org";
+ security.acme.acceptTerms = true;
+ security.acme.server = "https://example.com"; # self-signed only
+ };
+
+ testScript = ''
+ machine.wait_for_unit("jitsi-videobridge2.service")
+ machine.wait_for_unit("jicofo.service")
+ machine.wait_for_unit("nginx.service")
+ machine.wait_for_unit("prosody.service")
+ machine.wait_for_unit("jibri.service")
+
+ machine.wait_until_succeeds(
+ "journalctl -b -u jitsi-videobridge2 -o cat | grep -q 'Performed a successful health check'", timeout=30
+ )
+ machine.wait_until_succeeds(
+ "journalctl -b -u prosody -o cat | grep -q 'Authenticated as focus@auth.machine'", timeout=31
+ )
+ machine.wait_until_succeeds(
+ "journalctl -b -u prosody -o cat | grep -q 'Authenticated as jvb@auth.machine'", timeout=32
+ )
+ machine.wait_until_succeeds(
+ "journalctl -b -u prosody -o cat | grep -q 'Authenticated as jibri@auth.machine'", timeout=33
+ )
+ machine.wait_until_succeeds(
+ "cat /var/log/jitsi/jibri/log.0.txt | grep -q 'Joined MUC: jibribrewery@internal.machine'", timeout=34
+ )
+
+ assert '"busyStatus":"IDLE","health":{"healthStatus":"HEALTHY"' in machine.succeed(
+ "curl -X GET http://machine:2222/jibri/api/v1.0/health"
+ )
+ machine.succeed(
+ """curl -H "Content-Type: application/json" -X POST http://localhost:2222/jibri/api/v1.0/startService -d '{"sessionId": "RecordTest","callParams":{"callUrlInfo":{"baseUrl": "https://machine","callName": "TestCall"}},"callLoginParams":{"domain": "recorder.machine", "username": "recorder", "password": "'"$(cat /var/lib/jitsi-meet/jibri-recorder-secret)"'" },"sinkType": "file"}'"""
+ )
+ machine.wait_until_succeeds(
+ "cat /var/log/jitsi/jibri/log.0.txt | grep -q 'File recording service transitioning from state Starting up to Running'", timeout=35
+ )
+ machine.succeed(
+ """sleep 15 && curl -H "Content-Type: application/json" -X POST http://localhost:2222/jibri/api/v1.0/stopService -d '{"sessionId": "RecordTest","callParams":{"callUrlInfo":{"baseUrl": "https://machine","callName": "TestCall"}},"callLoginParams":{"domain": "recorder.machine", "username": "recorder", "password": "'"$(cat /var/lib/jitsi-meet/jibri-recorder-secret)"'" },"sinkType": "file"}'"""
+ )
+ machine.wait_until_succeeds(
+ "cat /var/log/jitsi/jibri/log.0.txt | grep -q 'Recording finalize script finished with exit value 0'", timeout=36
+ )
+ '';
+})
diff --git a/pkgs/applications/audio/pocket-casts/default.nix b/pkgs/applications/audio/pocket-casts/default.nix
new file mode 100644
index 000000000000..ab55287f29f3
--- /dev/null
+++ b/pkgs/applications/audio/pocket-casts/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv, fetchurl, dpkg, autoPatchelfHook, makeWrapper, electron_12,
+alsa-lib, gtk3, libXScrnSaver, libXtst, mesa, nss }:
+
+let
+ # Using Electron 12 to solve errors regarding threading
+ electron = electron_12;
+
+in stdenv.mkDerivation rec {
+ pname = "pocket-casts";
+ version = "0.5.0";
+
+ src = fetchurl {
+ url = "https://github.com/felicianotech/pocket-casts-desktop-app/releases/download/v${version}/${pname}_${version}_amd64.deb";
+ sha256 = "sha256-frBtIxwRO/6k6j0itqN10t+9AyNadqXm8vC1YP960ts=";
+ };
+
+ nativeBuildInputs = [
+ dpkg
+ autoPatchelfHook
+ makeWrapper
+ ];
+
+ buildInputs = [ alsa-lib gtk3 libXScrnSaver libXtst mesa nss ];
+
+ dontBuild = true;
+ dontConfigure = true;
+
+ unpackPhase = ''
+ dpkg-deb -x ${src} ./
+ '';
+
+ installPhase = ''
+ runHook preInstall
+
+ mv usr $out
+ mv opt $out
+ mv "$out/opt/Pocket Casts" $out/opt/pocket-casts
+ mv $out/share/icons/hicolor/0x0 $out/share/icons/hicolor/256x256
+
+ runHook postInstall
+ '';
+
+ postFixup = ''
+ substituteInPlace $out/share/applications/pocket-casts.desktop --replace '"/opt/Pocket Casts/pocket-casts"' $out/bin/pocket-casts
+ substituteInPlace $out/share/applications/pocket-casts.desktop --replace '/usr/share/icons/hicolor/0x0/apps/pocket-casts.png' "pocket-casts"
+ makeWrapper ${electron}/bin/electron \
+ $out/bin/pocket-casts \
+ --add-flags $out/opt/pocket-casts/resources/app.asar
+ '';
+
+ meta = with lib; {
+ description = "Pocket Casts webapp, packaged for the Linux Desktop";
+ homepage = "https://github.com/felicianotech/pocket-casts-desktop-app";
+ license = licenses.mit;
+ maintainers = with maintainers; [ wolfangaukang ];
+ platforms = [ "x86_64-linux" ];
+ };
+}
diff --git a/pkgs/applications/audio/strawberry/default.nix b/pkgs/applications/audio/strawberry/default.nix
index 6cc55650220a..fd75a4a8e5d7 100644
--- a/pkgs/applications/audio/strawberry/default.nix
+++ b/pkgs/applications/audio/strawberry/default.nix
@@ -36,13 +36,13 @@
mkDerivation rec {
pname = "strawberry";
- version = "0.9.3";
+ version = "1.0.0";
src = fetchFromGitHub {
owner = "jonaski";
repo = pname;
rev = version;
- sha256 = "sha256-OOdHsii6O4okVHDhrqCNJ7WVB0VKPs8q0AhEY+IvflE=";
+ sha256 = "sha256-m1BB5OIeCIQuJpxEO1xmb/Z8tzeHF31jYg67OpVWWRM=";
};
buildInputs = [
diff --git a/pkgs/applications/graphics/cloudcompare/default.nix b/pkgs/applications/graphics/cloudcompare/default.nix
index 9fbe390f5d83..c120ece8cb4f 100644
--- a/pkgs/applications/graphics/cloudcompare/default.nix
+++ b/pkgs/applications/graphics/cloudcompare/default.nix
@@ -10,6 +10,7 @@
, LASzip
, libLAS
, pdal
+, pcl
, qtbase
, qtsvg
, qttools
@@ -19,30 +20,23 @@
mkDerivation rec {
pname = "cloudcompare";
- version = "2.11.2"; # Remove below patch with the next version bump.
+ # Released version doesn't work with packaged PCL
+ # because it's too new. Considering that a release
+ # is a year ago it's unreasonable to wait for it.
+ version = "unstable-2021-10-14";
src = fetchFromGitHub {
owner = "CloudCompare";
repo = "CloudCompare";
- rev = "v${version}";
- sha256 = "0sb2h08iaf6zrf54sg6ql6wm63q5vq0kpd3gffdm26z8w6j6wv3s";
+ rev = "1f65ba63756e23291ae91ff52d04da468ade8249";
+ sha256 = "x1bDjFjXIl3r+yo1soWvRB+4KGP50/WBoGlrH013JQo=";
# As of writing includes (https://github.com/CloudCompare/CloudCompare/blob/a1c589c006fc325e8b560c77340809b9c7e7247a/.gitmodules):
# * libE57Format
# * PoissonRecon
- # In a future version it will also contain
# * CCCoreLib
fetchSubmodules = true;
};
- patches = [
- # TODO: Remove with next CloudCompare release (see https://github.com/CloudCompare/CloudCompare/pull/1478)
- (fetchpatch {
- name = "CloudCompare-fix-for-PDAL-2.3.0.patch";
- url = "https://github.com/CloudCompare/CloudCompare/commit/f3038dcdeb0491c4a653c2ee6fb017326eb676a3.patch";
- sha256 = "0ca5ry987mcgsdawz5yd4xhbsdb5k44qws30srxymzx2djvamwli";
- })
- ];
-
nativeBuildInputs = [
cmake
eigen # header-only
@@ -55,6 +49,7 @@ mkDerivation rec {
LASzip
libLAS
pdal
+ pcl
qtbase
qtsvg
qttools
@@ -63,15 +58,14 @@ mkDerivation rec {
];
cmakeFlags = [
- # TODO: This will become -DCCCORELIB_USE_TBB=ON in a future version, see
- # https://github.com/CloudCompare/CloudCompare/commit/f5a0c9fd788da26450f3fa488b2cf0e4a08d255f
- "-DCOMPILE_CC_CORE_LIB_WITH_TBB=ON"
+ "-DCCCORELIB_USE_TBB=ON"
"-DOPTION_USE_DXF_LIB=ON"
"-DOPTION_USE_GDAL=ON"
"-DOPTION_USE_SHAPE_LIB=ON"
"-DPLUGIN_GL_QEDL=ON"
"-DPLUGIN_GL_QSSAO=ON"
+
"-DPLUGIN_IO_QADDITIONAL=ON"
"-DPLUGIN_IO_QCORE=ON"
"-DPLUGIN_IO_QCSV_MATRIX=ON"
@@ -80,6 +74,8 @@ mkDerivation rec {
"-DPLUGIN_IO_QPDAL=ON" # required for .las/.laz support
"-DPLUGIN_IO_QPHOTOSCAN=ON"
"-DPLUGIN_IO_QRDB=OFF" # Riegl rdblib is proprietary; not packaged in nixpkgs
+
+ "-DPLUGIN_STANDARD_QPCL=ON" # Adds PCD import and export support
];
meta = with lib; {
diff --git a/pkgs/applications/misc/calibre/default.nix b/pkgs/applications/misc/calibre/default.nix
index e11efa8f8dd2..cabf7fc9bda8 100644
--- a/pkgs/applications/misc/calibre/default.nix
+++ b/pkgs/applications/misc/calibre/default.nix
@@ -27,19 +27,20 @@
mkDerivation rec {
pname = "calibre";
- version = "5.29.0";
+ version = "5.30.0";
src = fetchurl {
url = "https://download.calibre-ebook.com/${version}/${pname}-${version}.tar.xz";
sha256 = "sha256-9ymHEpTHDUM3NAGoeSETzKRLKgJLRY4eEli6N5lbZug=";
};
- # https://sources.debian.org/patches/calibre/5.29.0+dfsg-1
+ # https://sources.debian.org/patches/calibre/5.30.0+dfsg-1
patches = [
# allow for plugin update check, but no calibre version check
(fetchpatch {
name = "0001_only_plugin_update.patch";
- url = "https://sources.debian.org/data/main/c/calibre/5.29.0%2Bdfsg-1/debian/patches/0001-only-plugin-update.patch";
+ url =
+ "https://sources.debian.org/data/main/c/calibre/${version}%2Bdfsg-1/debian/patches/0001-only-plugin-update.patch";
sha256 = "sha256-aGT8rJ/eQKAkmyHBWdY0ouZuWvDwtLVJU5xY6d3hY3k=";
})
]
diff --git a/pkgs/development/libraries/vulkan-headers/default.nix b/pkgs/development/libraries/vulkan-headers/default.nix
index e9b9112c8fd7..3d9bf719adca 100644
--- a/pkgs/development/libraries/vulkan-headers/default.nix
+++ b/pkgs/development/libraries/vulkan-headers/default.nix
@@ -1,7 +1,7 @@
{ lib, stdenv, fetchFromGitHub, cmake }:
stdenv.mkDerivation rec {
pname = "vulkan-headers";
- version = "1.2.182.0";
+ version = "1.2.189.1";
nativeBuildInputs = [ cmake ];
@@ -9,7 +9,7 @@ stdenv.mkDerivation rec {
owner = "KhronosGroup";
repo = "Vulkan-Headers";
rev = "sdk-${version}";
- sha256 = "03j0kzq2qxhy0y82l10m8am26zrms2sjrdb1dcbpv9zh5vkxhcla";
+ sha256 = "1qggc7dv9jr83xr9w2h375wl3pz3rfgrk9hnrjmylkg9gz4p9q03";
};
meta = with lib; {
diff --git a/pkgs/development/libraries/vulkan-loader/default.nix b/pkgs/development/libraries/vulkan-loader/default.nix
index 21239b9b4368..ce3853687721 100644
--- a/pkgs/development/libraries/vulkan-loader/default.nix
+++ b/pkgs/development/libraries/vulkan-loader/default.nix
@@ -3,14 +3,14 @@
stdenv.mkDerivation rec {
pname = "vulkan-loader";
- version = "1.2.182.0";
+ version = "1.2.189.1";
src = (assert version == vulkan-headers.version;
fetchFromGitHub {
owner = "KhronosGroup";
repo = "Vulkan-Loader";
rev = "sdk-${version}";
- sha256 = "0gmr9q3a6s8xvaa74fs9zbi9c305i2b3rx768qvl79nhbdj8nc02";
+ sha256 = "1745fdzi0n5qj2s41q6z1y52cq8pwswvh1a32d3n7kl6bhksagp6";
});
nativeBuildInputs = [ cmake pkg-config ];
diff --git a/pkgs/development/python-modules/shapely/default.nix b/pkgs/development/python-modules/shapely/default.nix
index e8ea874e5ca5..7cf75e12cb54 100644
--- a/pkgs/development/python-modules/shapely/default.nix
+++ b/pkgs/development/python-modules/shapely/default.nix
@@ -13,12 +13,12 @@
buildPythonPackage rec {
pname = "Shapely";
- version = "1.7.1";
- disabled = pythonOlder "3.5";
+ version = "1.8.0";
+ disabled = pythonOlder "3.6";
src = fetchPypi {
inherit pname version;
- sha256 = "0adiz4jwmwxk7k1awqifb1a9bj5x4nx4gglb5dz9liam21674h8n";
+ sha256 = "177g8wxsgnphhhn4634n6ca1qrk462ijqlznpj5ry6d49ghpwc7m";
};
nativeBuildInputs = [
@@ -38,16 +38,6 @@ buildPythonPackage rec {
GEOS_LIBRARY_PATH = "${geos}/lib/libgeos_c${stdenv.hostPlatform.extensions.sharedLibrary}";
patches = [
- # Fix with geos 3.9. This patch will be part of the next release after 1.7.1
- (fetchpatch {
- url = "https://github.com/Toblerity/Shapely/commit/77879a954d24d1596f986d16ba3eff5e13861164.patch";
- sha256 = "1w7ngjqbpf9vnvrfg4nyv34kckim9a60gvx20h6skc79xwihd4m5";
- excludes = [
- "tests/test_create_inconsistent_dimensionality.py"
- "appveyor.yml"
- ".travis.yml"
- ];
- })
# Patch to search form GOES .so/.dylib files in a Nix-aware way
(substituteAll {
src = ./library-paths.patch;
diff --git a/pkgs/development/python-modules/shapely/library-paths.patch b/pkgs/development/python-modules/shapely/library-paths.patch
index 7681fb1d9bb2..d55630be9c10 100644
--- a/pkgs/development/python-modules/shapely/library-paths.patch
+++ b/pkgs/development/python-modules/shapely/library-paths.patch
@@ -1,27 +1,45 @@
diff --git a/shapely/geos.py b/shapely/geos.py
-index d5a67d2..19b7ffc 100644
+index 4619732..1abdb5e 100644
--- a/shapely/geos.py
+++ b/shapely/geos.py
-@@ -61,127 +61,17 @@ def load_dll(libname, fallbacks=None, mode=DEFAULT_MODE):
+@@ -55,148 +55,21 @@ def load_dll(libname, fallbacks=None, mode=DEFAULT_MODE):
"Could not find lib {} or load any of its variants {}.".format(
libname, fallbacks or []))
-_lgeos = None
+ def exists_conda_env():
+ """Does this module exist in a conda environment?"""
+ return os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
+
-
-if sys.platform.startswith('linux'):
-- # Test to see if we have a wheel repaired by 'auditwheel' containing its
-- # own libgeos_c
-- geos_whl_so = glob.glob(os.path.abspath(os.path.join(os.path.dirname(
-- __file__), '.libs/libgeos_c-*.so.*')))
-- if len(geos_whl_so) == 1:
-- _lgeos = CDLL(geos_whl_so[0])
+- # Test to see if we have a wheel repaired by auditwheel which contains its
+- # own libgeos_c. Note: auditwheel 3.1 changed the location of libs.
+- geos_whl_so = glob.glob(
+- os.path.abspath(os.path.join(os.path.dirname(__file__), ".libs/libgeos*.so*"))
+- ) or glob.glob(
+- os.path.abspath(
+- os.path.join(
+- os.path.dirname(__file__), "..", "Shapely.libs", "libgeos*.so*"
+- )
+- )
+- )
+-
+- if len(geos_whl_so) > 0:
+- # We have observed problems with CDLL of libgeos_c not automatically
+- # loading the sibling c++ library since the change made by auditwheel
+- # 3.1, so we explicitly load them both.
+- geos_whl_so = sorted(geos_whl_so)
+- CDLL(geos_whl_so[0])
+- _lgeos = CDLL(geos_whl_so[-1])
- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
+-
- elif hasattr(sys, 'frozen'):
- geos_pyinstaller_so = glob.glob(os.path.join(sys.prefix, 'libgeos_c-*.so.*'))
-- if len(geos_pyinstaller_so) == 1:
+- if len(geos_pyinstaller_so) >= 1:
- _lgeos = CDLL(geos_pyinstaller_so[0])
- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
-- elif os.getenv('CONDA_PREFIX', ''):
+- elif exists_conda_env():
- # conda package.
- _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.so'))
- else:
@@ -30,11 +48,14 @@ index d5a67d2..19b7ffc 100644
- 'libgeos_c.so',
- ]
- _lgeos = load_dll('geos_c', fallbacks=alt_paths)
-- # Necessary for environments with only libc.musl
-- c_alt_paths = [
-- 'libc.musl-x86_64.so.1'
-- ]
-- free = load_dll('c', fallbacks=c_alt_paths).free
+-
++_lgeos = CDLL('@libgeos_c@')
++if sys.platform == 'darwin':
+ # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+ # manpage says, "If filename is NULL, then the returned handle is for the
+ # main program". This way we can let the linker do the work to figure out
+ # which libc Python is actually using.
+ free = CDLL(None).free
- free.argtypes = [c_void_p]
- free.restype = None
-
@@ -52,7 +73,7 @@ index d5a67d2..19b7ffc 100644
- _lgeos = CDLL(geos_whl_dylib)
- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
-
-- elif os.getenv('CONDA_PREFIX', ''):
+- elif exists_conda_env():
- # conda package.
- _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.dylib'))
- else:
@@ -63,9 +84,11 @@ index d5a67d2..19b7ffc 100644
- os.environ['RESOURCEPATH'], '..', 'Frameworks',
- 'libgeos_c.dylib')]
- except KeyError:
-- # binary from pyinstaller
- alt_paths = [
-- os.path.join(sys.executable, 'libgeos_c.dylib')]
+- # binary from pyinstaller
+- os.path.join(sys.executable, 'libgeos_c.dylib'),
+- # .app from cx_Freeze
+- os.path.join(os.path.dirname(sys.executable), 'libgeos_c.1.dylib')]
- if hasattr(sys, '_MEIPASS'):
- alt_paths.append(
- os.path.join(sys._MEIPASS, 'libgeos_c.1.dylib'))
@@ -75,23 +98,22 @@ index d5a67d2..19b7ffc 100644
- "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS",
- # macports
- '/opt/local/lib/libgeos_c.dylib',
-- # homebrew
+- # homebrew Intel
- '/usr/local/lib/libgeos_c.dylib',
+- # homebrew Apple Silicon
+- '/opt/homebrew/lib/libgeos_c.dylib',
- ]
- _lgeos = load_dll('geos_c', fallbacks=alt_paths)
-
-- # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
-- # manpage says, "If filename is NULL, then the returned handle is for the
-- # main program". This way we can let the linker do the work to figure out
-- # which libc Python is actually using.
- free = CDLL(None).free
- free.argtypes = [c_void_p]
- free.restype = None
-
-elif sys.platform == 'win32':
-- if os.getenv('CONDA_PREFIX', ''):
+- _conda_dll_path = os.path.join(sys.prefix, 'Library', 'bin', 'geos_c.dll')
+- if exists_conda_env() and os.path.exists(_conda_dll_path):
- # conda package.
-- _lgeos = CDLL(os.path.join(sys.prefix, 'Library', 'bin', 'geos_c.dll'))
+- _lgeos = CDLL(_conda_dll_path)
- else:
- try:
- egg_dlls = os.path.abspath(
@@ -119,21 +141,15 @@ index d5a67d2..19b7ffc 100644
-
-elif sys.platform == 'sunos5':
- _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
-- free = CDLL('libc.so.1').free
+- free.restype = None
- free.argtypes = [c_void_p]
- free.restype = None
+-
-else: # other *nix systems
- _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
-- free = load_dll('c', fallbacks=['libc.so.6']).free
+- free = CDLL(None).free
- free.argtypes = [c_void_p]
- free.restype = None
-+_lgeos = CDLL('@libgeos_c@')
-+if sys.platform == 'darwin':
-+ # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
-+ # manpage says, "If filename is NULL, then the returned handle is for the
-+ # main program". This way we can let the linker do the work to figure out
-+ # which libc Python is actually using.
-+ free = CDLL(None).free
+else:
+ free = CDLL('@libc@').free
+free.argtypes = [c_void_p]
@@ -142,20 +158,18 @@ index d5a67d2..19b7ffc 100644
def _geos_version():
diff --git a/tests/test_dlls.py b/tests/test_dlls.py
-index 35f9cc2..3dfcaac 100644
+index c71da8e..fae9da6 100644
--- a/tests/test_dlls.py
+++ b/tests/test_dlls.py
-@@ -12,12 +12,7 @@ class LoadingTestCase(unittest.TestCase):
+@@ -12,10 +12,4 @@ class LoadingTestCase(unittest.TestCase):
@unittest.skipIf(sys.platform == "win32", "FIXME: adapt test for win32")
def test_fallbacks(self):
load_dll('geos_c', fallbacks=[
- os.path.join(sys.prefix, "lib", "libgeos_c.dylib"), # anaconda (Mac OS X)
-- '/opt/local/lib/libgeos_c.dylib', # MacPorts
-- '/usr/local/lib/libgeos_c.dylib', # homebrew (Mac OS X)
+- '/opt/local/lib/libgeos_c.dylib', # MacPorts
+- '/usr/local/lib/libgeos_c.dylib', # homebrew (Mac OS X)
+- '/opt/homebrew/lib/libgeos_c.dylib', # homebrew (macOS)
- os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux)
- 'libgeos_c.so.1',
- 'libgeos_c.so'])
+ '@libgeos_c@'])
-
-
- def test_suite():
diff --git a/pkgs/development/tools/vulkan-validation-layers/default.nix b/pkgs/development/tools/vulkan-validation-layers/default.nix
index eac704b4a9c4..9df68c63810b 100644
--- a/pkgs/development/tools/vulkan-validation-layers/default.nix
+++ b/pkgs/development/tools/vulkan-validation-layers/default.nix
@@ -23,8 +23,8 @@ let
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "SPIRV-Headers";
- rev = "dafead1765f6c1a5f9f8a76387dcb2abe4e54acd"; # pin
- sha256 = "1kj6wcx9y7r1xyg8n7ai2pzrg9ira7hbakr45wh5p4zyxh0m45n8";
+ rev = "449bc986ba6f4c5e10e32828783f9daef2a77644"; # pin
+ sha256 = "1249pvk4iz09caxm3kwckzwcx2hbw97cr2h8h770l6c061kb14z5";
};
});
localGlslang = (glslang.override {
@@ -32,8 +32,8 @@ let
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "SPIRV-Tools";
- rev = "dc72924cb31cd9f3dbc3eb47e9d926cf641e3a07"; # pin
- sha256 = "0pxgbq6xapw9hgrzb3rk5cylzgg1y1bkqz5wxzwqls63pwga5912";
+ rev = "1fbed83c8aab8517d821fcb4164c08567951938f"; # pin
+ sha256 = "0faz468bnxpvbg1np13gnbwf35s0hl9ad7r2p9wi9si5k336qjmj";
};
});
argSpirv-headers = localSpirvHeaders;
@@ -41,20 +41,20 @@ let
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "glslang";
- rev = "18eef33bd7a4bf5ad8c69f99cb72022608cf6e73"; # pin
- sha256 = "0wwj7q509pkp8wj7120g1n2ddl4x2r03ljf5czd9794ji6yraidn";
+ rev = "2fb89a0072ae7316af1c856f22663fde4928128a"; # pin
+ sha256 = "04kkmphv0a5mb5javhmkc4kab8r0n107kb7djakj5h238ni2j7q9";
};
});
robin-hood-hashing = fetchFromGitHub {
owner = "martinus";
repo = "robin-hood-hashing";
- rev = "3.11.2"; # pin
- sha256 = "0103mnqpmka1smy0arnrbihlvi7i8xr5im0px8wn4faw4flikkcm";
+ rev = "3.11.3"; # pin
+ sha256 = "1gm3lwjkh6h8m7lfykzd0jzhfqjmjchindkmxc008rwvxafsd1pl";
};
in
stdenv.mkDerivation rec {
pname = "vulkan-validation-layers";
- version = "1.2.182.0";
+ version = "1.2.189.1";
# If we were to use "dev" here instead of headers, the setupHook would be
# placed in that output instead of "out".
@@ -66,7 +66,7 @@ stdenv.mkDerivation rec {
owner = "KhronosGroup";
repo = "Vulkan-ValidationLayers";
rev = "sdk-${version}";
- sha256 = "1fnmb7vbm7y1x67bf1xiwdrpj9j4lkvhk9xhb6hp6x2aryvcyrnc";
+ sha256 = "0a5plvvffidgnqh5ymq315xscl08w298sn9da48b3x2rdbdqgw90";
});
# Include absolute paths to layer libraries in their associated
diff --git a/pkgs/servers/gemini/gmid/default.nix b/pkgs/servers/gemini/gmid/default.nix
new file mode 100644
index 000000000000..f06498d583b5
--- /dev/null
+++ b/pkgs/servers/gemini/gmid/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, bison, libressl, libevent }:
+
+stdenv.mkDerivation rec {
+ pname = "gmid";
+ version = "1.7.5";
+
+ src = fetchFromGitHub {
+ owner = "omar-polo";
+ repo = pname;
+ rev = version;
+ sha256 = "sha256-BBd0AL5jRRslxzDnxcTZRR+8J5D23NAQ7mp9K+leXAQ=";
+ };
+
+ nativeBuildInputs = [ bison ];
+
+ buildInputs = [ libressl libevent ];
+
+ configurePhase = ''
+ runHook preConfigure
+ ./configure PREFIX=$out
+ runHook postConfigure
+ '';
+
+ meta = with lib; {
+ description = "Simple and secure Gemini server";
+ homepage = "https://gmid.omarpolo.com/";
+ license = licenses.isc;
+ maintainers = with maintainers; [ sikmir ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/servers/jibri/default.nix b/pkgs/servers/jibri/default.nix
index 91d6a7ddf040..6a77a448bf7f 100644
--- a/pkgs/servers/jibri/default.nix
+++ b/pkgs/servers/jibri/default.nix
@@ -1,5 +1,16 @@
-{ lib, stdenv, fetchurl, dpkg, jre_headless, makeWrapper }:
+{ lib, stdenv, fetchurl, dpkg, jre8_headless, makeWrapper, writeText, xorg }:
+let
+ xorgModulePaths = writeText "module-paths" ''
+ Section "Files"
+ ModulePath "${xorg.xorgserver}/lib/xorg/modules
+ ModulePath "${xorg.xorgserver}/lib/xorg/extensions
+ ModulePath "${xorg.xorgserver}/lib/xorg/drivers
+ ModulePath "${xorg.xf86videodummy}/lib/xorg/modules/drivers
+ EndSection
+ '';
+
+in
stdenv.mkDerivation rec {
pname = "jibri";
version = "8.0-93-g51fe7a2";
@@ -19,7 +30,9 @@ stdenv.mkDerivation rec {
mv etc/jitsi/jibri/* $out/etc/jitsi/jibri/
mv opt/jitsi/jibri/* $out/opt/jitsi/jibri/
- makeWrapper ${jre_headless}/bin/java $out/bin/jibri --add-flags "-jar $out/opt/jitsi/jibri/jibri.jar"
+ cat '${xorgModulePaths}' >> $out/etc/jitsi/jibri/xorg-video-dummy.conf
+
+ makeWrapper ${jre8_headless}/bin/java $out/bin/jibri --add-flags "-jar $out/opt/jitsi/jibri/jibri.jar"
runHook postInstall
'';
diff --git a/pkgs/tools/graphics/vulkan-extension-layer/default.nix b/pkgs/tools/graphics/vulkan-extension-layer/default.nix
index aa90fced901f..ed7655763262 100644
--- a/pkgs/tools/graphics/vulkan-extension-layer/default.nix
+++ b/pkgs/tools/graphics/vulkan-extension-layer/default.nix
@@ -2,14 +2,14 @@
stdenv.mkDerivation rec {
pname = "vulkan-extension-layer";
- version = "1.2.182.0";
+ version = "1.2.189.1";
src = (assert version == vulkan-headers.version;
fetchFromGitHub {
owner = "KhronosGroup";
repo = "Vulkan-ExtensionLayer";
rev = "sdk-${version}";
- sha256 = "0by2kp48jbd55xk26rmlvc4wm77g1zvidx8czn1587ng2yzi7acr";
+ sha256 = "0qi9ps215pmrh8vgi81wvlzjyxs44bama2x3d43a1bbvcyp9s6kp";
});
nativeBuildInputs = [ cmake jq ];
diff --git a/pkgs/tools/graphics/vulkan-tools-lunarg/default.nix b/pkgs/tools/graphics/vulkan-tools-lunarg/default.nix
index 3b33328485ee..ae9e0e86b252 100644
--- a/pkgs/tools/graphics/vulkan-tools-lunarg/default.nix
+++ b/pkgs/tools/graphics/vulkan-tools-lunarg/default.nix
@@ -23,14 +23,14 @@
stdenv.mkDerivation rec {
pname = "vulkan-tools-lunarg";
# The version must match that in vulkan-headers
- version = "1.2.182.0";
+ version = "1.2.189.1";
src = (assert version == vulkan-headers.version;
fetchFromGitHub {
owner = "LunarG";
repo = "VulkanTools";
rev = "sdk-${version}";
- sha256 = "1b7762fcbakfvj2b2l68qj25pc7pz9jhfabf1x80b9w3q205hl2f";
+ sha256 = "0431dgplv5wiz8bj0ja91mbpc2qhjgdhqhrgaqarvyvjr1f7jw52";
fetchSubmodules = true;
});
diff --git a/pkgs/tools/graphics/vulkan-tools/default.nix b/pkgs/tools/graphics/vulkan-tools/default.nix
index 161384c3ad01..9f9593b2cf70 100644
--- a/pkgs/tools/graphics/vulkan-tools/default.nix
+++ b/pkgs/tools/graphics/vulkan-tools/default.nix
@@ -3,7 +3,7 @@
stdenv.mkDerivation rec {
pname = "vulkan-tools";
- version = "1.2.182.0";
+ version = "1.2.189.1";
# It's not strictly necessary to have matching versions here, however
# since we're using the SDK version we may as well be consistent with
@@ -13,7 +13,7 @@ stdenv.mkDerivation rec {
owner = "KhronosGroup";
repo = "Vulkan-Tools";
rev = "sdk-${version}";
- sha256 = "028l2l7jx4443k8207q8jmjq1mnnm9kgyl2417jrkrvylcbv8ji9";
+ sha256 = "0izmzyj6gb51d71vbdjcgd9qw34aidvbmz0mg4bkc13n48w8s9vj";
});
nativeBuildInputs = [ cmake ];
diff --git a/pkgs/tools/system/htop/default.nix b/pkgs/tools/system/htop/default.nix
index bc8dde743c8e..8a3664b85477 100644
--- a/pkgs/tools/system/htop/default.nix
+++ b/pkgs/tools/system/htop/default.nix
@@ -11,13 +11,13 @@ assert systemdSupport -> stdenv.isLinux;
stdenv.mkDerivation rec {
pname = "htop";
- version = "3.1.0";
+ version = "3.1.1";
src = fetchFromGitHub {
owner = "htop-dev";
repo = pname;
rev = version;
- sha256 = "sha256-/48Ca7JPzhPS4eYsPbwbSVcx9aS1f0LHcqsbNVWL+9k=";
+ sha256 = "JnpuBa09U086wWp0OtsDnStF4aLjhvtEj371u5XFtqc=";
};
nativeBuildInputs = [ autoreconfHook ];
diff --git a/pkgs/tools/text/languagetool/default.nix b/pkgs/tools/text/languagetool/default.nix
index 791d779bf833..3c130162ca15 100644
--- a/pkgs/tools/text/languagetool/default.nix
+++ b/pkgs/tools/text/languagetool/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
pname = "LanguageTool";
- version = "5.4";
+ version = "5.5";
src = fetchzip {
url = "https://www.languagetool.org/download/${pname}-${version}.zip";
- sha256 = "sha256-2khadADfzwkW+J0uafPWJ6xUQRSQDm8seiBHueQGmKI=";
+ sha256 = "sha256-v9p+G1aSzrvuoJLfRqWQXGVJ+2vysxdTgrD+ZUt6Yg4=";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ jre ];
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 1bea663fdf2e..a662fa4afe8f 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -1723,6 +1723,8 @@ with pkgs;
glasgow = with python3Packages; toPythonApplication glasgow;
+ gmid = callPackage ../servers/gemini/gmid { };
+
gmni = callPackage ../applications/networking/browsers/gmni { };
gmnisrv = callPackage ../servers/gemini/gmnisrv { };
@@ -3402,6 +3404,8 @@ with pkgs;
pn = callPackage ../tools/text/pn { };
+ pocket-casts = callPackage ../applications/audio/pocket-casts { };
+
poweralertd = callPackage ../tools/misc/poweralertd { };
ps_mem = callPackage ../tools/system/ps_mem { };