Merge remote-tracking branch 'origin/master' into haskell-updates

This commit is contained in:
(cdep)illabout 2021-05-22 01:54:23 +09:00
commit 885573b94c
No known key found for this signature in database
GPG key ID: 462E0C03D11422F4
288 changed files with 29475 additions and 5820 deletions

View file

@ -23,6 +23,5 @@ Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-
- [ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests)) - [ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests))
- [ ] Tested compilation of all pkgs that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review wip"` - [ ] Tested compilation of all pkgs that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review wip"`
- [ ] Tested execution of all binary files (usually in `./result/bin/`) - [ ] Tested execution of all binary files (usually in `./result/bin/`)
- [ ] Determined the impact on package closure size (by running `nix path-info -S` before and after) - [ ] Added a release notes entry if the change is major or breaking
- [ ] Ensured that relevant documentation is up to date
- [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md). - [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md).

View file

@ -3357,6 +3357,12 @@
githubId = 10799507; githubId = 10799507;
name = "Karl Fischer"; name = "Karl Fischer";
}; };
fitzgibbon = {
name = "Niall FitzGibbon";
email = "fitzgibbon.niall@gmail.com";
github = "fitzgibbon";
githubId = 617048;
};
Flakebi = { Flakebi = {
email = "flakebi@t-online.de"; email = "flakebi@t-online.de";
github = "Flakebi"; github = "Flakebi";
@ -4369,16 +4375,6 @@
githubId = 41924494; githubId = 41924494;
name = "Ivar"; name = "Ivar";
}; };
ivegotasthma = {
email = "ivegotasthma@protonmail.com";
github = "ivegotasthma";
githubId = 2437675;
name = "John Doe";
keys = [{
longkeyid = "rsa4096/09AC52AEA87817A4";
fingerprint = "4008 2A5B 56A4 79B9 83CB 95FD 09AC 52AE A878 17A4";
}];
};
ixmatus = { ixmatus = {
email = "parnell@digitalmentat.com"; email = "parnell@digitalmentat.com";
github = "ixmatus"; github = "ixmatus";
@ -6098,6 +6094,12 @@
githubId = 2914269; githubId = 2914269;
name = "Malo Bourgon"; name = "Malo Bourgon";
}; };
malvo = {
email = "malte@malvo.org";
github = "malte-v";
githubId = 34393802;
name = "Malte Voos";
};
malyn = { malyn = {
email = "malyn@strangeGizmo.com"; email = "malyn@strangeGizmo.com";
github = "malyn"; github = "malyn";
@ -11465,6 +11467,16 @@
github = "pulsation"; github = "pulsation";
githubId = 1838397; githubId = 1838397;
}; };
ydlr = {
name = "ydlr";
email = "ydlr@ydlr.io";
github = "ydlr";
githubId = 58453832;
keys = [{
longkeyid = "rsa4096/0x43AB44130A29AD9D";
fingerprint = "FD0A C425 9EF5 4084 F99F 9B47 2ACC 9749 7C68 FAD4";
}];
};
zane = { zane = {
name = "Zane van Iperen"; name = "Zane van Iperen";
email = "zane@zanevaniperen.com"; email = "zane@zanevaniperen.com";
@ -11475,6 +11487,12 @@
fingerprint = "61AE D40F 368B 6F26 9DAE 3892 6861 6B2D 8AC4 DCC5"; fingerprint = "61AE D40F 368B 6F26 9DAE 3892 6861 6B2D 8AC4 DCC5";
}]; }];
}; };
zeri = {
name = "zeri";
email = "68825133+zeri42@users.noreply.github.com";
github = "zeri42";
githubId = 68825133;
};
zseri = { zseri = {
name = "zseri"; name = "zseri";
email = "zseri.devel@ytrizja.de"; email = "zseri.devel@ytrizja.de";

View file

@ -195,6 +195,12 @@
The <option>security.hideProcessInformation</option> module has been removed. The <option>security.hideProcessInformation</option> module has been removed.
It was broken since the switch to cgroups-v2. It was broken since the switch to cgroups-v2.
</para> </para>
</listitem>
<listitem>
<para>
The <literal>linuxPackages.ati_drivers_x11</literal> kernel modules have been removed.
The drivers only supported kernels prior to 4.2, and thus have become obsolete.
</para>
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
@ -1101,6 +1107,11 @@ environment.systemPackages = [
This prevents NVRAM from filling up, which ensures the latest diagnostic data is always stored and alleviates problems with writing new boot configurations. This prevents NVRAM from filling up, which ensures the latest diagnostic data is always stored and alleviates problems with writing new boot configurations.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Nixpkgs now contains <link xlink:href="https://github.com/NixOS/nixpkgs/pull/118232">automatically packaged GNOME Shell extensions</link> from the <link xlink:href="https://extensions.gnome.org/">GNOME Extensions</link> portal. You can find them, filed by their UUID, under <literal>gnome38Extensions</literal> attribute for GNOME 3.38 and under <literal>gnome40Extensions</literal> for GNOME 40. Finally, the <literal>gnomeExtensions</literal> attribute contains extensions for the latest GNOME Shell version in Nixpkgs, listed under a more human-friendly name. The unqualified attribute scope also contains manually packaged extensions. Note that the automatically packaged extensions are provided for convenience and are not checked or guaranteed to work.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
</section> </section>

View file

@ -36,6 +36,13 @@ rec {
[ ../modules/virtualisation/qemu-vm.nix [ ../modules/virtualisation/qemu-vm.nix
../modules/testing/test-instrumentation.nix # !!! should only get added for automated test runs ../modules/testing/test-instrumentation.nix # !!! should only get added for automated test runs
{ key = "no-manual"; documentation.nixos.enable = false; } { key = "no-manual"; documentation.nixos.enable = false; }
{ key = "no-revision";
# Make the revision metadata constant, in order to avoid needless retesting.
# The human version (e.g. 21.05-pre) is left as is, because it is useful
# for external modules that test with e.g. nixosTest and rely on that
# version number.
config.system.nixos.revision = "constant-nixos-revision";
}
{ key = "nodes"; _module.args.nodes = nodes; } { key = "nodes"; _module.args.nodes = nodes; }
] ++ optional minimal ../modules/testing/minimal-kernel.nix; ] ++ optional minimal ../modules/testing/minimal-kernel.nix;
}; };

View file

@ -3,6 +3,7 @@ from contextlib import contextmanager, _GeneratorContextManager
from queue import Queue, Empty from queue import Queue, Empty
from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable
from xml.sax.saxutils import XMLGenerator from xml.sax.saxutils import XMLGenerator
from colorama import Style
import queue import queue
import io import io
import _thread import _thread
@ -151,6 +152,8 @@ class Logger:
self.xml.startDocument() self.xml.startDocument()
self.xml.startElement("logfile", attrs={}) self.xml.startElement("logfile", attrs={})
self._print_serial_logs = True
def close(self) -> None: def close(self) -> None:
self.xml.endElement("logfile") self.xml.endElement("logfile")
self.xml.endDocument() self.xml.endDocument()
@ -174,15 +177,21 @@ class Logger:
self.drain_log_queue() self.drain_log_queue()
self.log_line(message, attributes) self.log_line(message, attributes)
def enqueue(self, message: Dict[str, str]) -> None: def log_serial(self, message: str, machine: str) -> None:
self.queue.put(message) self.enqueue({"msg": message, "machine": machine, "type": "serial"})
if self._print_serial_logs:
eprint(Style.DIM + "{} # {}".format(machine, message) + Style.RESET_ALL)
def enqueue(self, item: Dict[str, str]) -> None:
self.queue.put(item)
def drain_log_queue(self) -> None: def drain_log_queue(self) -> None:
try: try:
while True: while True:
item = self.queue.get_nowait() item = self.queue.get_nowait()
attributes = {"machine": item["machine"], "type": "serial"} msg = self.sanitise(item["msg"])
self.log_line(self.sanitise(item["msg"]), attributes) del item["msg"]
self.log_line(msg, item)
except Empty: except Empty:
pass pass
@ -307,8 +316,9 @@ class Machine:
start_command += "-cdrom " + args["cdrom"] + " " start_command += "-cdrom " + args["cdrom"] + " "
if "usb" in args: if "usb" in args:
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
start_command += ( start_command += (
"-device piix3-usb-uhci -drive " "-device usb-ehci -drive "
+ "id=usbdisk,file=" + "id=usbdisk,file="
+ args["usb"] + args["usb"]
+ ",if=none,readonly " + ",if=none,readonly "
@ -327,6 +337,9 @@ class Machine:
def log(self, msg: str) -> None: def log(self, msg: str) -> None:
self.logger.log(msg, {"machine": self.name}) self.logger.log(msg, {"machine": self.name})
def log_serial(self, msg: str) -> None:
self.logger.log_serial(msg, self.name)
def nested(self, msg: str, attrs: Dict[str, str] = {}) -> _GeneratorContextManager: def nested(self, msg: str, attrs: Dict[str, str] = {}) -> _GeneratorContextManager:
my_attrs = {"machine": self.name} my_attrs = {"machine": self.name}
my_attrs.update(attrs) my_attrs.update(attrs)
@ -784,8 +797,7 @@ class Machine:
# Ignore undecodable bytes that may occur in boot menus # Ignore undecodable bytes that may occur in boot menus
line = _line.decode(errors="ignore").replace("\r", "").rstrip() line = _line.decode(errors="ignore").replace("\r", "").rstrip()
self.last_lines.put(line) self.last_lines.put(line)
eprint("{} # {}".format(self.name, line)) self.log_serial(line)
self.logger.enqueue({"msg": line, "machine": self.name})
_thread.start_new_thread(process_serial_output, ()) _thread.start_new_thread(process_serial_output, ())
@ -927,6 +939,16 @@ def run_tests() -> None:
machine.execute("sync") machine.execute("sync")
def serial_stdout_on() -> None:
global log
log._print_serial_logs = True
def serial_stdout_off() -> None:
global log
log._print_serial_logs = False
@contextmanager @contextmanager
def subtest(name: str) -> Iterator[None]: def subtest(name: str) -> Iterator[None]:
with log.nested(name): with log.nested(name):

View file

@ -25,7 +25,7 @@ rec {
name = "nixos-test-driver"; name = "nixos-test-driver";
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];
buildInputs = [ (python3.withPackages (p: [ p.ptpython ])) ]; buildInputs = [ (python3.withPackages (p: [ p.ptpython p.colorama ])) ];
checkInputs = with python3Packages; [ pylint black mypy ]; checkInputs = with python3Packages; [ pylint black mypy ];
dontUnpack = true; dontUnpack = true;

View file

@ -63,8 +63,7 @@ in
description = '' description = ''
On 64-bit systems, whether to support Direct Rendering for On 64-bit systems, whether to support Direct Rendering for
32-bit applications (such as Wine). This is currently only 32-bit applications (such as Wine). This is currently only
supported for the <literal>nvidia</literal> and supported for the <literal>nvidia</literal> as well as
<literal>ati_unfree</literal> drivers, as well as
<literal>Mesa</literal>. <literal>Mesa</literal>.
''; '';
}; };

View file

@ -1,40 +0,0 @@
# This module provides the proprietary ATI X11 / OpenGL drivers.
{ config, lib, pkgs, ... }:
with lib;
let
drivers = config.services.xserver.videoDrivers;
enabled = elem "ati_unfree" drivers;
ati_x11 = config.boot.kernelPackages.ati_drivers_x11;
in
{
config = mkIf enabled {
nixpkgs.config.xorg.abiCompat = "1.17";
services.xserver.drivers = singleton
{ name = "fglrx"; modules = [ ati_x11 ]; display = true; };
hardware.opengl.package = ati_x11;
hardware.opengl.package32 = pkgs.pkgsi686Linux.linuxPackages.ati_drivers_x11.override { libsOnly = true; kernel = null; };
hardware.opengl.setLdLibraryPath = true;
environment.systemPackages = [ ati_x11 ];
boot.extraModulePackages = [ ati_x11 ];
boot.blacklistedKernelModules = [ "radeon" ];
environment.etc.ati.source = "${ati_x11}/etc/ati";
};
}

View file

@ -76,7 +76,6 @@
./hardware/wooting.nix ./hardware/wooting.nix
./hardware/uinput.nix ./hardware/uinput.nix
./hardware/video/amdgpu-pro.nix ./hardware/video/amdgpu-pro.nix
./hardware/video/ati.nix
./hardware/video/capture/mwprocapture.nix ./hardware/video/capture/mwprocapture.nix
./hardware/video/bumblebee.nix ./hardware/video/bumblebee.nix
./hardware/video/displaylink.nix ./hardware/video/displaylink.nix
@ -163,6 +162,7 @@
./programs/neovim.nix ./programs/neovim.nix
./programs/nm-applet.nix ./programs/nm-applet.nix
./programs/npm.nix ./programs/npm.nix
./programs/noisetorch.nix
./programs/oblogout.nix ./programs/oblogout.nix
./programs/partition-manager.nix ./programs/partition-manager.nix
./programs/plotinus.nix ./programs/plotinus.nix
@ -689,6 +689,7 @@
./services/networking/gale.nix ./services/networking/gale.nix
./services/networking/gateone.nix ./services/networking/gateone.nix
./services/networking/gdomap.nix ./services/networking/gdomap.nix
./services/networking/ghostunnel.nix
./services/networking/git-daemon.nix ./services/networking/git-daemon.nix
./services/networking/gnunet.nix ./services/networking/gnunet.nix
./services/networking/go-neb.nix ./services/networking/go-neb.nix
@ -804,6 +805,7 @@
./services/networking/smartdns.nix ./services/networking/smartdns.nix
./services/networking/smokeping.nix ./services/networking/smokeping.nix
./services/networking/softether.nix ./services/networking/softether.nix
./services/networking/solanum.nix
./services/networking/spacecookie.nix ./services/networking/spacecookie.nix
./services/networking/spiped.nix ./services/networking/spiped.nix
./services/networking/squid.nix ./services/networking/squid.nix

View file

@ -0,0 +1,25 @@
{ config, pkgs, lib, ... }:
with lib;
let cfg = config.programs.noisetorch;
in {
options.programs.noisetorch = {
enable = mkEnableOption "noisetorch + setcap wrapper";
package = mkOption {
type = types.package;
default = pkgs.noisetorch;
description = ''
The noisetorch package to use.
'';
};
};
config = mkIf cfg.enable {
security.wrappers.noisetorch = {
source = "${cfg.package}/bin/noisetorch";
capabilities = "cap_sys_resource=+ep";
};
};
}

View file

@ -1,16 +1,17 @@
{ config, lib, pkgs, ...}: { config, lib, pkgs, ... }:
with lib; with lib;
let let
cfg = config.services.duplicity; cfg = config.services.duplicity;
stateDirectory = "/var/lib/duplicity"; stateDirectory = "/var/lib/duplicity";
localTarget = if hasPrefix "file://" cfg.targetUrl localTarget =
if hasPrefix "file://" cfg.targetUrl
then removePrefix "file://" cfg.targetUrl else null; then removePrefix "file://" cfg.targetUrl else null;
in { in
{
options.services.duplicity = { options.services.duplicity = {
enable = mkEnableOption "backups with duplicity"; enable = mkEnableOption "backups with duplicity";
@ -24,7 +25,7 @@ in {
include = mkOption { include = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [ ];
example = [ "/home" ]; example = [ "/home" ];
description = '' description = ''
List of paths to include into the backups. See the FILE SELECTION List of paths to include into the backups. See the FILE SELECTION
@ -35,7 +36,7 @@ in {
exclude = mkOption { exclude = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [ ];
description = '' description = ''
List of paths to exclude from backups. See the FILE SELECTION section in List of paths to exclude from backups. See the FILE SELECTION section in
<citerefentry><refentrytitle>duplicity</refentrytitle> <citerefentry><refentrytitle>duplicity</refentrytitle>
@ -82,14 +83,60 @@ in {
extraFlags = mkOption { extraFlags = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [ ];
example = [ "--full-if-older-than" "1M" ]; example = [ "--backend-retry-delay" "100" ];
description = '' description = ''
Extra command-line flags passed to duplicity. See Extra command-line flags passed to duplicity. See
<citerefentry><refentrytitle>duplicity</refentrytitle> <citerefentry><refentrytitle>duplicity</refentrytitle>
<manvolnum>1</manvolnum></citerefentry>. <manvolnum>1</manvolnum></citerefentry>.
''; '';
}; };
fullIfOlderThan = mkOption {
type = types.str;
default = "never";
example = "1M";
description = ''
If <literal>"never"</literal> (the default) always do incremental
backups (the first backup will be a full backup, of course). If
<literal>"always"</literal> always do full backups. Otherwise, this
must be a string representing a duration. Full backups will be made
when the latest full backup is older than this duration. If this is not
the case, an incremental backup is performed.
'';
};
cleanup = {
maxAge = mkOption {
type = types.nullOr types.str;
default = null;
example = "6M";
description = ''
If non-null, delete all backup sets older than the given time. Old backup sets
will not be deleted if backup sets newer than time depend on them.
'';
};
maxFull = mkOption {
type = types.nullOr types.int;
default = null;
example = 2;
description = ''
If non-null, delete all backups sets that are older than the count:th last full
backup (in other words, keep the last count full backups and
associated incremental sets).
'';
};
maxIncr = mkOption {
type = types.nullOr types.int;
default = null;
example = 1;
description = ''
If non-null, delete incremental sets of all backups sets that are
older than the count:th last full backup (in other words, keep only
old full backups and not their increments).
'';
};
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -99,18 +146,26 @@ in {
environment.HOME = stateDirectory; environment.HOME = stateDirectory;
serviceConfig = { script =
ExecStart = '' let
${pkgs.duplicity}/bin/duplicity ${escapeShellArgs ( target = escapeShellArg cfg.targetUrl;
[ extra = escapeShellArgs ([ "--archive-dir" stateDirectory ] ++ cfg.extraFlags);
cfg.root dup = "${pkgs.duplicity}/bin/duplicity";
cfg.targetUrl in
"--archive-dir" stateDirectory ''
] set -x
${dup} cleanup ${target} --force ${extra}
${lib.optionalString (cfg.cleanup.maxAge != null) "${dup} remove-older-than ${lib.escapeShellArg cfg.cleanup.maxAge} ${target} --force ${extra}"}
${lib.optionalString (cfg.cleanup.maxFull != null) "${dup} remove-all-but-n-full ${toString cfg.cleanup.maxFull} ${target} --force ${extra}"}
${lib.optionalString (cfg.cleanup.maxIncr != null) "${dup} remove-all-incr-but-n-full ${toString cfg.cleanup.maxIncr} ${target} --force ${extra}"}
exec ${dup} ${if cfg.fullIfOlderThan == "always" then "full" else "incr"} ${lib.escapeShellArgs (
[ cfg.root cfg.targetUrl ]
++ concatMap (p: [ "--include" p ]) cfg.include ++ concatMap (p: [ "--include" p ]) cfg.include
++ concatMap (p: [ "--exclude" p ]) cfg.exclude ++ concatMap (p: [ "--exclude" p ]) cfg.exclude
++ cfg.extraFlags)} ++ (lib.optionals (cfg.fullIfOlderThan != "never" && cfg.fullIfOlderThan != "always") [ "--full-if-older-than" cfg.fullIfOlderThan ])
)} ${extra}
''; '';
serviceConfig = {
PrivateTmp = true; PrivateTmp = true;
ProtectSystem = "strict"; ProtectSystem = "strict";
ProtectHome = "read-only"; ProtectHome = "read-only";
@ -130,7 +185,7 @@ in {
assertions = singleton { assertions = singleton {
# Duplicity will fail if the last file selection option is an include. It # Duplicity will fail if the last file selection option is an include. It
# is not always possible to detect but this simple case can be caught. # is not always possible to detect but this simple case can be caught.
assertion = cfg.include != [] -> cfg.exclude != [] || cfg.extraFlags != []; assertion = cfg.include != [ ] -> cfg.exclude != [ ] || cfg.extraFlags != [ ];
message = '' message = ''
Duplicity will fail if you only specify included paths ("Because the Duplicity will fail if you only specify included paths ("Because the
default is to include all files, the expression is redundant. Exiting default is to include all files, the expression is redundant. Exiting

View file

@ -111,6 +111,13 @@ in
default = false; default = false;
description = "Disables automatic Universal Plug and Play."; description = "Disables automatic Universal Plug and Play.";
}; };
openFirewall = mkOption {
type = types.bool;
default = false;
description = "Wheter to open ports in the firewall";
};
dataDir = mkOption { dataDir = mkOption {
type = types.str; type = types.str;
default = "/var/lib/terraria"; default = "/var/lib/terraria";
@ -151,5 +158,11 @@ in
${pkgs.coreutils}/bin/chgrp terraria ${cfg.dataDir}/terraria.sock ${pkgs.coreutils}/bin/chgrp terraria ${cfg.dataDir}/terraria.sock
''; '';
}; };
networking.firewall = mkIf cfg.openFirewall {
allowedTCPPorts = [ cfg.port ];
allowedUDPPorts = [ cfg.port ];
};
}; };
} }

View file

@ -31,11 +31,11 @@
<link linkend="opt-services.mailman.enable">enable</link> = true; <link linkend="opt-services.mailman.enable">enable</link> = true;
<link linkend="opt-services.mailman.serve.enable">serve.enable</link> = true; <link linkend="opt-services.mailman.serve.enable">serve.enable</link> = true;
<link linkend="opt-services.mailman.hyperkitty.enable">hyperkitty.enable</link> = true; <link linkend="opt-services.mailman.hyperkitty.enable">hyperkitty.enable</link> = true;
<link linkend="opt-services.mailman.hyperkitty.enable">webHosts</link> = ["lists.example.org"]; <link linkend="opt-services.mailman.webHosts">webHosts</link> = ["lists.example.org"];
<link linkend="opt-services.mailman.hyperkitty.enable">siteOwner</link> = "mailman@example.org"; <link linkend="opt-services.mailman.siteOwner">siteOwner</link> = "mailman@example.org";
}; };
<link linkend="opt-services.nginx.virtualHosts._name_.enableACME">services.nginx.virtualHosts."lists.example.org".enableACME</link> = true; <link linkend="opt-services.nginx.virtualHosts._name_.enableACME">services.nginx.virtualHosts."lists.example.org".enableACME</link> = true;
<link linkend="opt-services.mailman.hyperkitty.enable">networking.firewall.allowedTCPPorts</link> = [ 25 80 443 ]; <link linkend="opt-networking.firewall.allowedTCPPorts">networking.firewall.allowedTCPPorts</link> = [ 25 80 443 ];
}</programlisting> }</programlisting>
</para> </para>
<para> <para>

View file

@ -386,6 +386,10 @@ let
List of relabel configurations. List of relabel configurations.
''; '';
metric_relabel_configs = mkOpt (types.listOf promTypes.relabel_config) ''
List of metric relabel configurations.
'';
sample_limit = mkDefOpt types.int "0" '' sample_limit = mkDefOpt types.int "0" ''
Per-scrape limit on number of scraped samples that will be accepted. Per-scrape limit on number of scraped samples that will be accepted.
If more than this number of samples are present after metric relabelling If more than this number of samples are present after metric relabelling

View file

@ -3,43 +3,10 @@
with lib; with lib;
let let
cfg = config.services.netatalk; cfg = config.services.netatalk;
settingsFormat = pkgs.formats.ini { };
extmapFile = pkgs.writeText "extmap.conf" cfg.extmap; afpConfFile = settingsFormat.generate "afp.conf" cfg.settings;
in {
afpToString = x: if builtins.typeOf x == "bool"
then boolToString x
else toString x;
volumeConfig = name:
let vol = getAttr name cfg.volumes; in
"[${name}]\n " + (toString (
map
(key: "${key} = ${afpToString (getAttr key vol)}\n")
(attrNames vol)
));
afpConf = ''[Global]
extmap file = ${extmapFile}
afp port = ${toString cfg.port}
${cfg.extraConfig}
${if cfg.homes.enable then ''[Homes]
${optionalString (cfg.homes.path != "") "path = ${cfg.homes.path}"}
basedir regex = ${cfg.homes.basedirRegex}
${cfg.homes.extraConfig}
'' else ""}
${toString (map volumeConfig (attrNames cfg.volumes))}
'';
afpConfFile = pkgs.writeText "afp.conf" afpConf;
in
{
options = { options = {
services.netatalk = { services.netatalk = {
@ -51,61 +18,24 @@ in
description = "TCP port to be used for AFP."; description = "TCP port to be used for AFP.";
}; };
extraConfig = mkOption { settings = mkOption {
type = types.lines; inherit (settingsFormat) type;
default = "";
example = "uam list = uams_guest.so";
description = ''
Lines of configuration to add to the <literal>[Global]</literal> section.
See <literal>man apf.conf</literal> for more information.
'';
};
homes = {
enable = mkOption {
type = types.bool;
default = false;
description = "Enable sharing of the UNIX server user home directories.";
};
path = mkOption {
type = types.str;
default = "";
example = "afp-data";
description = "Share not the whole user home but this subdirectory path.";
};
basedirRegex = mkOption {
example = "/home";
type = types.str;
description = "Regex which matches the parent directory of the user homes.";
};
extraConfig = mkOption {
type = types.lines;
default = "";
description = ''
Lines of configuration to add to the <literal>[Homes]</literal> section.
See <literal>man apf.conf</literal> for more information.
'';
};
};
volumes = mkOption {
default = { }; default = { };
type = types.attrsOf (types.attrsOf types.unspecified); example = {
description = Global = { "uam list" = "uams_guest.so"; };
'' Homes = {
Set of AFP volumes to export. path = "afp-data";
See <literal>man apf.conf</literal> for more information. "basedir regex" = "/home";
''; };
example = literalExample '' example-volume = {
{ srv = path = "/srv/volume";
{ path = "/srv"; "read only" = true;
"read only" = true; };
"hosts allow" = "10.1.0.0/16 10.2.1.100 2001:0db8:1234::/48"; };
}; description = ''
} Configuration for Netatalk. See
<citerefentry><refentrytitle>afp.conf</refentrytitle>
<manvolnum>5</manvolnum></citerefentry>.
''; '';
}; };
@ -114,18 +44,33 @@ in
default = ""; default = "";
description = '' description = ''
File name extension mappings. File name extension mappings.
See <literal>man extmap.conf</literal> for more information. See <citerefentry><refentrytitle>extmap.conf</refentrytitle>
<manvolnum>5</manvolnum></citerefentry>. for more information.
''; '';
}; };
}; };
}; };
imports = (map (option:
mkRemovedOptionModule [ "services" "netatalk" option ]
"This option was removed in favor of `services.netatalk.settings`.") [
"extraConfig"
"homes"
"volumes"
]);
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.netatalk.settings.Global = {
"afp port" = toString cfg.port;
"extmap file" = "${pkgs.writeText "extmap.conf" cfg.extmap}";
};
systemd.services.netatalk = { systemd.services.netatalk = {
description = "Netatalk AFP fileserver for Macintosh clients"; description = "Netatalk AFP fileserver for Macintosh clients";
unitConfig.Documentation = "man:afp.conf(5) man:netatalk(8) man:afpd(8) man:cnid_metad(8) man:cnid_dbd(8)"; unitConfig.Documentation =
"man:afp.conf(5) man:netatalk(8) man:afpd(8) man:cnid_metad(8) man:cnid_dbd(8)";
after = [ "network.target" "avahi-daemon.service" ]; after = [ "network.target" "avahi-daemon.service" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
@ -135,12 +80,12 @@ in
Type = "forking"; Type = "forking";
GuessMainPID = "no"; GuessMainPID = "no";
PIDFile = "/run/lock/netatalk"; PIDFile = "/run/lock/netatalk";
ExecStartPre = "${pkgs.coreutils}/bin/mkdir -m 0755 -p /var/lib/netatalk/CNID"; ExecStart = "${pkgs.netatalk}/sbin/netatalk -F ${afpConfFile}";
ExecStart = "${pkgs.netatalk}/sbin/netatalk -F ${afpConfFile}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
ExecStop = "${pkgs.coreutils}/bin/kill -TERM $MAINPID"; ExecStop = "${pkgs.coreutils}/bin/kill -TERM $MAINPID";
Restart = "always"; Restart = "always";
RestartSec = 1; RestartSec = 1;
StateDirectory = [ "netatalk/CNID" ];
}; };
}; };

View file

@ -0,0 +1,242 @@
{ config, lib, pkgs, ... }:
let
inherit (lib)
attrValues
concatMap
concatStringsSep
escapeShellArg
literalExample
mapAttrs'
mkDefault
mkEnableOption
mkIf
mkOption
nameValuePair
optional
types
;
mainCfg = config.services.ghostunnel;
module = { config, name, ... }:
{
options = {
listen = mkOption {
description = ''
Address and port to listen on (can be HOST:PORT, unix:PATH).
'';
type = types.str;
};
target = mkOption {
description = ''
Address to forward connections to (can be HOST:PORT or unix:PATH).
'';
type = types.str;
};
keystore = mkOption {
description = ''
Path to keystore (combined PEM with cert/key, or PKCS12 keystore).
NB: storepass is not supported because it would expose credentials via <code>/proc/*/cmdline</code>.
Specify this or <code>cert</code> and <code>key</code>.
'';
type = types.nullOr types.str;
default = null;
};
cert = mkOption {
description = ''
Path to certificate (PEM with certificate chain).
Not required if <code>keystore</code> is set.
'';
type = types.nullOr types.str;
default = null;
};
key = mkOption {
description = ''
Path to certificate private key (PEM with private key).
Not required if <code>keystore</code> is set.
'';
type = types.nullOr types.str;
default = null;
};
cacert = mkOption {
description = ''
Path to CA bundle file (PEM/X509). Uses system trust store if <code>null</code>.
'';
type = types.nullOr types.str;
};
disableAuthentication = mkOption {
description = ''
Disable client authentication, no client certificate will be required.
'';
type = types.bool;
default = false;
};
allowAll = mkOption {
description = ''
If true, allow all clients, do not check client cert subject.
'';
type = types.bool;
default = false;
};
allowCN = mkOption {
description = ''
Allow client if common name appears in the list.
'';
type = types.listOf types.str;
default = [];
};
allowOU = mkOption {
description = ''
Allow client if organizational unit name appears in the list.
'';
type = types.listOf types.str;
default = [];
};
allowDNS = mkOption {
description = ''
Allow client if DNS subject alternative name appears in the list.
'';
type = types.listOf types.str;
default = [];
};
allowURI = mkOption {
description = ''
Allow client if URI subject alternative name appears in the list.
'';
type = types.listOf types.str;
default = [];
};
extraArguments = mkOption {
description = "Extra arguments to pass to <code>ghostunnel server</code>";
type = types.separatedString " ";
default = "";
};
unsafeTarget = mkOption {
description = ''
If set, does not limit target to localhost, 127.0.0.1, [::1], or UNIX sockets.
This is meant to protect against accidental unencrypted traffic on
untrusted networks.
'';
type = types.bool;
default = false;
};
# Definitions to apply at the root of the NixOS configuration.
atRoot = mkOption {
internal = true;
};
};
# Clients should not be authenticated with the public root certificates
# (afaict, it doesn't make sense), so we only provide that default when
# client cert auth is disabled.
config.cacert = mkIf config.disableAuthentication (mkDefault null);
config.atRoot = {
assertions = [
{ message = ''
services.ghostunnel.servers.${name}: At least one access control flag is required.
Set at least one of:
- services.ghostunnel.servers.${name}.disableAuthentication
- services.ghostunnel.servers.${name}.allowAll
- services.ghostunnel.servers.${name}.allowCN
- services.ghostunnel.servers.${name}.allowOU
- services.ghostunnel.servers.${name}.allowDNS
- services.ghostunnel.servers.${name}.allowURI
'';
assertion = config.disableAuthentication
|| config.allowAll
|| config.allowCN != []
|| config.allowOU != []
|| config.allowDNS != []
|| config.allowURI != []
;
}
];
systemd.services."ghostunnel-server-${name}" = {
after = [ "network.target" ];
wants = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Restart = "always";
AmbientCapabilities = ["CAP_NET_BIND_SERVICE"];
DynamicUser = true;
LoadCredential = optional (config.keystore != null) "keystore:${config.keystore}"
++ optional (config.cert != null) "cert:${config.cert}"
++ optional (config.key != null) "key:${config.key}"
++ optional (config.cacert != null) "cacert:${config.cacert}";
};
script = concatStringsSep " " (
[ "${mainCfg.package}/bin/ghostunnel" ]
++ optional (config.keystore != null) "--keystore=$CREDENTIALS_DIRECTORY/keystore"
++ optional (config.cert != null) "--cert=$CREDENTIALS_DIRECTORY/cert"
++ optional (config.key != null) "--key=$CREDENTIALS_DIRECTORY/key"
++ optional (config.cacert != null) "--cacert=$CREDENTIALS_DIRECTORY/cacert"
++ [
"server"
"--listen ${config.listen}"
"--target ${config.target}"
] ++ optional config.allowAll "--allow-all"
++ map (v: "--allow-cn=${escapeShellArg v}") config.allowCN
++ map (v: "--allow-ou=${escapeShellArg v}") config.allowOU
++ map (v: "--allow-dns=${escapeShellArg v}") config.allowDNS
++ map (v: "--allow-uri=${escapeShellArg v}") config.allowURI
++ optional config.disableAuthentication "--disable-authentication"
++ optional config.unsafeTarget "--unsafe-target"
++ [ config.extraArguments ]
);
};
};
};
in
{
options = {
services.ghostunnel.enable = mkEnableOption "ghostunnel";
services.ghostunnel.package = mkOption {
description = "The ghostunnel package to use.";
type = types.package;
default = pkgs.ghostunnel;
defaultText = literalExample ''pkgs.ghostunnel'';
};
services.ghostunnel.servers = mkOption {
description = ''
Server mode ghostunnels (TLS listener -> plain TCP/UNIX target)
'';
type = types.attrsOf (types.submodule module);
default = {};
};
};
config = mkIf mainCfg.enable {
assertions = lib.mkMerge (map (v: v.atRoot.assertions) (attrValues mainCfg.servers));
systemd = lib.mkMerge (map (v: v.atRoot.systemd) (attrValues mainCfg.servers));
};
meta.maintainers = with lib.maintainers; [
roberth
];
}

View file

@ -1,4 +1,4 @@
#! @shell@ -e #! @runtimeShell@ -e
# skip this if there are no modems at all # skip this if there are no modems at all
if ! stat -t "@spoolAreaPath@"/etc/config.* >/dev/null 2>&1 if ! stat -t "@spoolAreaPath@"/etc/config.* >/dev/null 2>&1

View file

@ -3,7 +3,7 @@
let let
inherit (lib.options) literalExample mkEnableOption mkOption; inherit (lib.options) literalExample mkEnableOption mkOption;
inherit (lib.types) bool enum int lines attrsOf nullOr path str submodule; inherit (lib.types) bool enum ints lines attrsOf nullOr path str submodule;
inherit (lib.modules) mkDefault mkIf mkMerge; inherit (lib.modules) mkDefault mkIf mkMerge;
commonDescr = '' commonDescr = ''
@ -18,7 +18,6 @@ let
''; '';
str1 = lib.types.addCheck str (s: s!=""); # non-empty string str1 = lib.types.addCheck str (s: s!=""); # non-empty string
int1 = lib.types.addCheck int (i: i>0); # positive integer
configAttrType = configAttrType =
# Options in HylaFAX configuration files can be # Options in HylaFAX configuration files can be
@ -27,7 +26,7 @@ let
# This type definition resolves all # This type definition resolves all
# those types into a list of strings. # those types into a list of strings.
let let
inherit (lib.types) attrsOf coercedTo listOf; inherit (lib.types) attrsOf coercedTo int listOf;
innerType = coercedTo bool (x: if x then "Yes" else "No") innerType = coercedTo bool (x: if x then "Yes" else "No")
(coercedTo int (toString) str); (coercedTo int (toString) str);
in in
@ -290,7 +289,7 @@ in
''; '';
}; };
faxcron.infoDays = mkOption { faxcron.infoDays = mkOption {
type = int1; type = ints.positive;
default = 30; default = 30;
description = '' description = ''
Set the expiration time for data in the Set the expiration time for data in the
@ -298,7 +297,7 @@ in
''; '';
}; };
faxcron.logDays = mkOption { faxcron.logDays = mkOption {
type = int1; type = ints.positive;
default = 30; default = 30;
description = '' description = ''
Set the expiration time for Set the expiration time for
@ -306,7 +305,7 @@ in
''; '';
}; };
faxcron.rcvDays = mkOption { faxcron.rcvDays = mkOption {
type = int1; type = ints.positive;
default = 7; default = 7;
description = '' description = ''
Set the expiration time for files in Set the expiration time for files in
@ -343,7 +342,7 @@ in
''; '';
}; };
faxqclean.doneqMinutes = mkOption { faxqclean.doneqMinutes = mkOption {
type = int1; type = ints.positive;
default = 15; default = 15;
example = literalExample "24*60"; example = literalExample "24*60";
description = '' description = ''
@ -353,7 +352,7 @@ in
''; '';
}; };
faxqclean.docqMinutes = mkOption { faxqclean.docqMinutes = mkOption {
type = int1; type = ints.positive;
default = 60; default = 60;
example = literalExample "24*60"; example = literalExample "24*60";
description = '' description = ''

View file

@ -1,4 +1,4 @@
#! @shell@ -e #! @runtimeShell@ -e
# The following lines create/update the HylaFAX spool directory: # The following lines create/update the HylaFAX spool directory:
# Subdirectories/files with persistent data are kept, # Subdirectories/files with persistent data are kept,
@ -80,7 +80,7 @@ touch clientlog faxcron.lastrun xferfaxlog
chown @faxuser@:@faxgroup@ clientlog faxcron.lastrun xferfaxlog chown @faxuser@:@faxgroup@ clientlog faxcron.lastrun xferfaxlog
# create symlinks for frozen directories/files # create symlinks for frozen directories/files
lnsym --target-directory=. "@hylafax@"/spool/{COPYRIGHT,bin,config} lnsym --target-directory=. "@hylafaxplus@"/spool/{COPYRIGHT,bin,config}
# create empty temporary directories # create empty temporary directories
update --mode=0700 -d client dev status update --mode=0700 -d client dev status
@ -93,7 +93,7 @@ install -d "@spoolAreaPath@/etc"
cd "@spoolAreaPath@/etc" cd "@spoolAreaPath@/etc"
# create symlinks to all files in template's etc # create symlinks to all files in template's etc
lnsym --target-directory=. "@hylafax@/spool/etc"/* lnsym --target-directory=. "@hylafaxplus@/spool/etc"/*
# set LOCKDIR in setup.cache # set LOCKDIR in setup.cache
sed --regexp-extended 's|^(UUCP_LOCKDIR=).*$|\1'"'@lockPath@'|g" --in-place setup.cache sed --regexp-extended 's|^(UUCP_LOCKDIR=).*$|\1'"'@lockPath@'|g" --in-place setup.cache

View file

@ -13,11 +13,10 @@ let
# creates hylafax config file, # creates hylafax config file,
# makes sure "Include" is listed *first* # makes sure "Include" is listed *first*
let let
mkLines = conf: mkLines = lib.flip lib.pipe [
(lib.concatLists (lib.mapAttrsToList (key: map (val: "${key}: ${val}")))
(lib.flip lib.mapAttrsToList conf lib.concatLists
(k: map (v: "${k}: ${v}") ];
)));
include = mkLines { Include = conf.Include or []; }; include = mkLines { Include = conf.Include or []; };
other = mkLines ( conf // { Include = []; } ); other = mkLines ( conf // { Include = []; } );
in in
@ -48,13 +47,12 @@ let
name = "hylafax-setup-spool.sh"; name = "hylafax-setup-spool.sh";
src = ./spool.sh; src = ./spool.sh;
isExecutable = true; isExecutable = true;
inherit (pkgs.stdenv) shell;
hylafax = pkgs.hylafaxplus;
faxuser = "uucp"; faxuser = "uucp";
faxgroup = "uucp"; faxgroup = "uucp";
lockPath = "/var/lock"; lockPath = "/var/lock";
inherit globalConfigPath modemConfigPath; inherit globalConfigPath modemConfigPath;
inherit (cfg) sendmailPath spoolAreaPath userAccessFile; inherit (cfg) sendmailPath spoolAreaPath userAccessFile;
inherit (pkgs) hylafaxplus runtimeShell;
}; };
waitFaxqScript = pkgs.substituteAll { waitFaxqScript = pkgs.substituteAll {
@ -64,8 +62,8 @@ let
src = ./faxq-wait.sh; src = ./faxq-wait.sh;
isExecutable = true; isExecutable = true;
timeoutSec = toString 10; timeoutSec = toString 10;
inherit (pkgs.stdenv) shell;
inherit (cfg) spoolAreaPath; inherit (cfg) spoolAreaPath;
inherit (pkgs) runtimeShell;
}; };
sockets.hylafax-hfaxd = { sockets.hylafax-hfaxd = {
@ -108,8 +106,10 @@ let
PrivateDevices = true; # breaks /dev/tty... PrivateDevices = true; # breaks /dev/tty...
PrivateNetwork = true; PrivateNetwork = true;
PrivateTmp = true; PrivateTmp = true;
#ProtectClock = true; # breaks /dev/tty... (why?)
ProtectControlGroups = true; ProtectControlGroups = true;
#ProtectHome = true; # breaks custom spool dirs #ProtectHome = true; # breaks custom spool dirs
ProtectKernelLogs = true;
ProtectKernelModules = true; ProtectKernelModules = true;
ProtectKernelTunables = true; ProtectKernelTunables = true;
#ProtectSystem = "strict"; # breaks custom spool dirs #ProtectSystem = "strict"; # breaks custom spool dirs

View file

@ -20,6 +20,15 @@ let
mkZoneFileName = name: if name == "." then "root" else name; mkZoneFileName = name: if name == "." then "root" else name;
# replaces include: directives for keys with fake keys for nsd-checkconf
injectFakeKeys = keys: concatStrings
(mapAttrsToList
(keyName: keyOptions: ''
fakeKey="$(${pkgs.bind}/bin/tsig-keygen -a ${escapeShellArgs [ keyOptions.algorithm keyName ]} | grep -oP "\s*secret \"\K.*(?=\";)")"
sed "s@^\s*include:\s*\"${stateDir}/private/${keyName}\"\$@secret: $fakeKey@" -i $out/nsd.conf
'')
keys);
nsdEnv = pkgs.buildEnv { nsdEnv = pkgs.buildEnv {
name = "nsd-env"; name = "nsd-env";
@ -34,9 +43,9 @@ let
echo "|- checking zone '$out/zones/$zoneFile'" echo "|- checking zone '$out/zones/$zoneFile'"
${nsdPkg}/sbin/nsd-checkzone "$zoneFile" "$zoneFile" || { ${nsdPkg}/sbin/nsd-checkzone "$zoneFile" "$zoneFile" || {
if grep -q \\\\\\$ "$zoneFile"; then if grep -q \\\\\\$ "$zoneFile"; then
echo zone "$zoneFile" contains escaped dollar signes \\\$ echo zone "$zoneFile" contains escaped dollar signs \\\$
echo Escaping them is not needed any more. Please make shure \ echo Escaping them is not needed any more. Please make sure \
to unescape them where they prefix a variable name to unescape them where they prefix a variable name.
fi fi
exit 1 exit 1
@ -44,7 +53,14 @@ let
done done
echo "checking configuration file" echo "checking configuration file"
# Save original config file including key references...
cp $out/nsd.conf{,.orig}
# ...inject mock keys into config
${injectFakeKeys cfg.keys}
# ...do the checkconf
${nsdPkg}/sbin/nsd-checkconf $out/nsd.conf ${nsdPkg}/sbin/nsd-checkconf $out/nsd.conf
# ... and restore original config file.
mv $out/nsd.conf{.orig,}
''; '';
}; };

View file

@ -0,0 +1,104 @@
{ config, lib, pkgs, ... }:
let
inherit (lib) mkEnableOption mkIf mkOption types;
inherit (pkgs) solanum;
cfg = config.services.solanum;
configFile = pkgs.writeText "solanum.conf" cfg.config;
in
{
###### interface
options = {
services.solanum = {
enable = mkEnableOption "Solanum IRC daemon";
config = mkOption {
type = types.str;
default = ''
serverinfo {
name = "irc.example.com";
sid = "1ix";
description = "irc!";
vhost = "0.0.0.0";
vhost6 = "::";
};
listen {
host = "0.0.0.0";
port = 6667;
};
auth {
user = "*@*";
class = "users";
flags = exceed_limit;
};
channel {
default_split_user_count = 0;
};
'';
description = ''
Solanum IRC daemon configuration file.
check <link xlink:href="https://github.com/solanum-ircd/solanum/blob/main/doc/reference.conf"/> for all options.
'';
};
openFilesLimit = mkOption {
type = types.int;
default = 1024;
description = ''
Maximum number of open files. Limits the clients and server connections.
'';
};
motd = mkOption {
type = types.nullOr types.lines;
default = null;
description = ''
Solanum MOTD text.
Solanum will read its MOTD from <literal>/etc/solanum/ircd.motd</literal>.
If set, the value of this option will be written to this path.
'';
};
};
};
###### implementation
config = mkIf cfg.enable (lib.mkMerge [
{
systemd.services.solanum = {
description = "Solanum IRC daemon";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
BANDB_DBPATH = "/var/lib/solanum/ban.db";
};
serviceConfig = {
ExecStart = "${solanum}/bin/solanum -foreground -logfile /dev/stdout -configfile ${configFile} -pidfile /run/solanum/ircd.pid";
DynamicUser = true;
User = "solanum";
StateDirectory = "solanum";
RuntimeDirectory = "solanum";
LimitNOFILE = "${toString cfg.openFilesLimit}";
};
};
}
(mkIf (cfg.motd != null) {
environment.etc."solanum/ircd.motd".text = cfg.motd;
})
]);
}

View file

@ -299,9 +299,8 @@ in
# Ensure essential files exist. # Ensure essential files exist.
if [[ ! -f ${cfg.dataDir}/configs/znc.conf ]]; then if [[ ! -f ${cfg.dataDir}/configs/znc.conf ]]; then
echo "No znc.conf file found in ${cfg.dataDir}. Creating one now." echo "No znc.conf file found in ${cfg.dataDir}. Creating one now."
cp --no-clobber ${cfg.configFile} ${cfg.dataDir}/configs/znc.conf cp --no-preserve=ownership --no-clobber ${cfg.configFile} ${cfg.dataDir}/configs/znc.conf
chmod u+rw ${cfg.dataDir}/configs/znc.conf chmod u+rw ${cfg.dataDir}/configs/znc.conf
chown ${cfg.user} ${cfg.dataDir}/configs/znc.conf
fi fi
if [[ ! -f ${cfg.dataDir}/znc.pem ]]; then if [[ ! -f ${cfg.dataDir}/znc.pem ]]; then

View file

@ -54,6 +54,7 @@ in
frontendUrl = lib.mkOption { frontendUrl = lib.mkOption {
type = lib.types.str; type = lib.types.str;
apply = x: if lib.hasSuffix "/" x then x else x + "/";
example = "keycloak.example.com/auth"; example = "keycloak.example.com/auth";
description = '' description = ''
The public URL used as base for all frontend requests. Should The public URL used as base for all frontend requests. Should
@ -84,113 +85,128 @@ in
''; '';
}; };
certificatePrivateKeyBundle = lib.mkOption { sslCertificate = lib.mkOption {
type = lib.types.nullOr lib.types.path; type = lib.types.nullOr lib.types.path;
default = null; default = null;
example = "/run/keys/ssl_cert"; example = "/run/keys/ssl_cert";
description = '' description = ''
The path to a PEM formatted bundle of the private key and The path to a PEM formatted certificate to use for TLS/SSL
certificate to use for TLS connections. connections.
This should be a string, not a Nix path, since Nix paths are This should be a string, not a Nix path, since Nix paths are
copied into the world-readable Nix store. copied into the world-readable Nix store.
''; '';
}; };
databaseType = lib.mkOption { sslCertificateKey = lib.mkOption {
type = lib.types.enum [ "mysql" "postgresql" ];
default = "postgresql";
example = "mysql";
description = ''
The type of database Keycloak should connect to.
'';
};
databaseHost = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = ''
Hostname of the database to connect to.
'';
};
databasePort =
let
dbPorts = {
postgresql = 5432;
mysql = 3306;
};
in
lib.mkOption {
type = lib.types.port;
default = dbPorts.${cfg.databaseType};
description = ''
Port of the database to connect to.
'';
};
databaseUseSSL = lib.mkOption {
type = lib.types.bool;
default = cfg.databaseHost != "localhost";
description = ''
Whether the database connection should be secured by SSL /
TLS.
'';
};
databaseCaCert = lib.mkOption {
type = lib.types.nullOr lib.types.path; type = lib.types.nullOr lib.types.path;
default = null; default = null;
example = "/run/keys/ssl_key";
description = '' description = ''
The SSL / TLS CA certificate that verifies the identity of the The path to a PEM formatted private key to use for TLS/SSL
database server. connections.
Required when PostgreSQL is used and SSL is turned on.
For MySQL, if left at <literal>null</literal>, the default
Java keystore is used, which should suffice if the server
certificate is issued by an official CA.
'';
};
databaseCreateLocally = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Whether a database should be automatically created on the
local host. Set this to false if you plan on provisioning a
local database yourself. This has no effect if
services.keycloak.databaseHost is customized.
'';
};
databaseUsername = lib.mkOption {
type = lib.types.str;
default = "keycloak";
description = ''
Username to use when connecting to an external or manually
provisioned database; has no effect when a local database is
automatically provisioned.
To use this with a local database, set <xref
linkend="opt-services.keycloak.databaseCreateLocally" /> to
<literal>false</literal> and create the database and user
manually. The database should be called
<literal>keycloak</literal>.
'';
};
databasePasswordFile = lib.mkOption {
type = lib.types.path;
example = "/run/keys/db_password";
description = ''
File containing the database password.
This should be a string, not a Nix path, since Nix paths are This should be a string, not a Nix path, since Nix paths are
copied into the world-readable Nix store. copied into the world-readable Nix store.
''; '';
}; };
database = {
type = lib.mkOption {
type = lib.types.enum [ "mysql" "postgresql" ];
default = "postgresql";
example = "mysql";
description = ''
The type of database Keycloak should connect to.
'';
};
host = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = ''
Hostname of the database to connect to.
'';
};
port =
let
dbPorts = {
postgresql = 5432;
mysql = 3306;
};
in
lib.mkOption {
type = lib.types.port;
default = dbPorts.${cfg.database.type};
description = ''
Port of the database to connect to.
'';
};
useSSL = lib.mkOption {
type = lib.types.bool;
default = cfg.database.host != "localhost";
description = ''
Whether the database connection should be secured by SSL /
TLS.
'';
};
caCert = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = ''
The SSL / TLS CA certificate that verifies the identity of the
database server.
Required when PostgreSQL is used and SSL is turned on.
For MySQL, if left at <literal>null</literal>, the default
Java keystore is used, which should suffice if the server
certificate is issued by an official CA.
'';
};
createLocally = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Whether a database should be automatically created on the
local host. Set this to false if you plan on provisioning a
local database yourself. This has no effect if
services.keycloak.database.host is customized.
'';
};
username = lib.mkOption {
type = lib.types.str;
default = "keycloak";
description = ''
Username to use when connecting to an external or manually
provisioned database; has no effect when a local database is
automatically provisioned.
To use this with a local database, set <xref
linkend="opt-services.keycloak.database.createLocally" /> to
<literal>false</literal> and create the database and user
manually. The database should be called
<literal>keycloak</literal>.
'';
};
passwordFile = lib.mkOption {
type = lib.types.path;
example = "/run/keys/db_password";
description = ''
File containing the database password.
This should be a string, not a Nix path, since Nix paths are
copied into the world-readable Nix store.
'';
};
};
package = lib.mkOption { package = lib.mkOption {
type = lib.types.package; type = lib.types.package;
default = pkgs.keycloak; default = pkgs.keycloak;
@ -261,12 +277,12 @@ in
config = config =
let let
# We only want to create a database if we're actually going to connect to it. # We only want to create a database if we're actually going to connect to it.
databaseActuallyCreateLocally = cfg.databaseCreateLocally && cfg.databaseHost == "localhost"; databaseActuallyCreateLocally = cfg.database.createLocally && cfg.database.host == "localhost";
createLocalPostgreSQL = databaseActuallyCreateLocally && cfg.databaseType == "postgresql"; createLocalPostgreSQL = databaseActuallyCreateLocally && cfg.database.type == "postgresql";
createLocalMySQL = databaseActuallyCreateLocally && cfg.databaseType == "mysql"; createLocalMySQL = databaseActuallyCreateLocally && cfg.database.type == "mysql";
mySqlCaKeystore = pkgs.runCommandNoCC "mysql-ca-keystore" {} '' mySqlCaKeystore = pkgs.runCommandNoCC "mysql-ca-keystore" {} ''
${pkgs.jre}/bin/keytool -importcert -trustcacerts -alias MySQLCACert -file ${cfg.databaseCaCert} -keystore $out -storepass notsosecretpassword -noprompt ${pkgs.jre}/bin/keytool -importcert -trustcacerts -alias MySQLCACert -file ${cfg.database.caCert} -keystore $out -storepass notsosecretpassword -noprompt
''; '';
keycloakConfig' = builtins.foldl' lib.recursiveUpdate { keycloakConfig' = builtins.foldl' lib.recursiveUpdate {
@ -282,11 +298,11 @@ in
}; };
"subsystem=datasources"."data-source=KeycloakDS" = { "subsystem=datasources"."data-source=KeycloakDS" = {
max-pool-size = "20"; max-pool-size = "20";
user-name = if databaseActuallyCreateLocally then "keycloak" else cfg.databaseUsername; user-name = if databaseActuallyCreateLocally then "keycloak" else cfg.database.username;
password = "@db-password@"; password = "@db-password@";
}; };
} [ } [
(lib.optionalAttrs (cfg.databaseType == "postgresql") { (lib.optionalAttrs (cfg.database.type == "postgresql") {
"subsystem=datasources" = { "subsystem=datasources" = {
"jdbc-driver=postgresql" = { "jdbc-driver=postgresql" = {
driver-module-name = "org.postgresql"; driver-module-name = "org.postgresql";
@ -294,16 +310,16 @@ in
driver-xa-datasource-class-name = "org.postgresql.xa.PGXADataSource"; driver-xa-datasource-class-name = "org.postgresql.xa.PGXADataSource";
}; };
"data-source=KeycloakDS" = { "data-source=KeycloakDS" = {
connection-url = "jdbc:postgresql://${cfg.databaseHost}:${builtins.toString cfg.databasePort}/keycloak"; connection-url = "jdbc:postgresql://${cfg.database.host}:${builtins.toString cfg.database.port}/keycloak";
driver-name = "postgresql"; driver-name = "postgresql";
"connection-properties=ssl".value = lib.boolToString cfg.databaseUseSSL; "connection-properties=ssl".value = lib.boolToString cfg.database.useSSL;
} // (lib.optionalAttrs (cfg.databaseCaCert != null) { } // (lib.optionalAttrs (cfg.database.caCert != null) {
"connection-properties=sslrootcert".value = cfg.databaseCaCert; "connection-properties=sslrootcert".value = cfg.database.caCert;
"connection-properties=sslmode".value = "verify-ca"; "connection-properties=sslmode".value = "verify-ca";
}); });
}; };
}) })
(lib.optionalAttrs (cfg.databaseType == "mysql") { (lib.optionalAttrs (cfg.database.type == "mysql") {
"subsystem=datasources" = { "subsystem=datasources" = {
"jdbc-driver=mysql" = { "jdbc-driver=mysql" = {
driver-module-name = "com.mysql"; driver-module-name = "com.mysql";
@ -311,22 +327,22 @@ in
driver-class-name = "com.mysql.jdbc.Driver"; driver-class-name = "com.mysql.jdbc.Driver";
}; };
"data-source=KeycloakDS" = { "data-source=KeycloakDS" = {
connection-url = "jdbc:mysql://${cfg.databaseHost}:${builtins.toString cfg.databasePort}/keycloak"; connection-url = "jdbc:mysql://${cfg.database.host}:${builtins.toString cfg.database.port}/keycloak";
driver-name = "mysql"; driver-name = "mysql";
"connection-properties=useSSL".value = lib.boolToString cfg.databaseUseSSL; "connection-properties=useSSL".value = lib.boolToString cfg.database.useSSL;
"connection-properties=requireSSL".value = lib.boolToString cfg.databaseUseSSL; "connection-properties=requireSSL".value = lib.boolToString cfg.database.useSSL;
"connection-properties=verifyServerCertificate".value = lib.boolToString cfg.databaseUseSSL; "connection-properties=verifyServerCertificate".value = lib.boolToString cfg.database.useSSL;
"connection-properties=characterEncoding".value = "UTF-8"; "connection-properties=characterEncoding".value = "UTF-8";
valid-connection-checker-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"; valid-connection-checker-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker";
validate-on-match = true; validate-on-match = true;
exception-sorter-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"; exception-sorter-class-name = "org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter";
} // (lib.optionalAttrs (cfg.databaseCaCert != null) { } // (lib.optionalAttrs (cfg.database.caCert != null) {
"connection-properties=trustCertificateKeyStoreUrl".value = "file:${mySqlCaKeystore}"; "connection-properties=trustCertificateKeyStoreUrl".value = "file:${mySqlCaKeystore}";
"connection-properties=trustCertificateKeyStorePassword".value = "notsosecretpassword"; "connection-properties=trustCertificateKeyStorePassword".value = "notsosecretpassword";
}); });
}; };
}) })
(lib.optionalAttrs (cfg.certificatePrivateKeyBundle != null) { (lib.optionalAttrs (cfg.sslCertificate != null && cfg.sslCertificateKey != null) {
"socket-binding-group=standard-sockets"."socket-binding=https".port = cfg.httpsPort; "socket-binding-group=standard-sockets"."socket-binding=https".port = cfg.httpsPort;
"core-service=management"."security-realm=UndertowRealm"."server-identity=ssl" = { "core-service=management"."security-realm=UndertowRealm"."server-identity=ssl" = {
keystore-path = "/run/keycloak/ssl/certificate_private_key_bundle.p12"; keystore-path = "/run/keycloak/ssl/certificate_private_key_bundle.p12";
@ -537,7 +553,9 @@ in
jbossCliScript = pkgs.writeText "jboss-cli-script" (mkJbossScript keycloakConfig'); jbossCliScript = pkgs.writeText "jboss-cli-script" (mkJbossScript keycloakConfig');
keycloakConfig = pkgs.runCommandNoCC "keycloak-config" {} '' keycloakConfig = pkgs.runCommandNoCC "keycloak-config" {
nativeBuildInputs = [ cfg.package ];
} ''
export JBOSS_BASE_DIR="$(pwd -P)"; export JBOSS_BASE_DIR="$(pwd -P)";
export JBOSS_MODULEPATH="${cfg.package}/modules"; export JBOSS_MODULEPATH="${cfg.package}/modules";
export JBOSS_LOG_DIR="$JBOSS_BASE_DIR/log"; export JBOSS_LOG_DIR="$JBOSS_BASE_DIR/log";
@ -547,11 +565,11 @@ in
mkdir -p {deployments,ssl} mkdir -p {deployments,ssl}
"${cfg.package}/bin/standalone.sh"& standalone.sh&
attempt=1 attempt=1
max_attempts=30 max_attempts=30
while ! ${cfg.package}/bin/jboss-cli.sh --connect ':read-attribute(name=server-state)'; do while ! jboss-cli.sh --connect ':read-attribute(name=server-state)'; do
if [[ "$attempt" == "$max_attempts" ]]; then if [[ "$attempt" == "$max_attempts" ]]; then
echo "ERROR: Could not connect to Keycloak after $attempt attempts! Failing.." >&2 echo "ERROR: Could not connect to Keycloak after $attempt attempts! Failing.." >&2
exit 1 exit 1
@ -561,7 +579,7 @@ in
(( attempt++ )) (( attempt++ ))
done done
${cfg.package}/bin/jboss-cli.sh --connect --file=${jbossCliScript} --echo-command jboss-cli.sh --connect --file=${jbossCliScript} --echo-command
cp configuration/standalone.xml $out cp configuration/standalone.xml $out
''; '';
@ -570,8 +588,8 @@ in
assertions = [ assertions = [
{ {
assertion = (cfg.databaseUseSSL && cfg.databaseType == "postgresql") -> (cfg.databaseCaCert != null); assertion = (cfg.database.useSSL && cfg.database.type == "postgresql") -> (cfg.database.caCert != null);
message = "A CA certificate must be specified (in 'services.keycloak.databaseCaCert') when PostgreSQL is used with SSL"; message = "A CA certificate must be specified (in 'services.keycloak.database.caCert') when PostgreSQL is used with SSL";
} }
]; ];
@ -581,6 +599,7 @@ in
after = [ "postgresql.service" ]; after = [ "postgresql.service" ];
before = [ "keycloak.service" ]; before = [ "keycloak.service" ];
bindsTo = [ "postgresql.service" ]; bindsTo = [ "postgresql.service" ];
path = [ config.services.postgresql.package ];
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
RemainAfterExit = true; RemainAfterExit = true;
@ -588,13 +607,15 @@ in
Group = "postgres"; Group = "postgres";
}; };
script = '' script = ''
set -eu set -o errexit -o pipefail -o nounset -o errtrace
shopt -s inherit_errexit
PSQL=${config.services.postgresql.package}/bin/psql create_role="$(mktemp)"
trap 'rm -f "$create_role"' ERR EXIT
db_password="$(<'${cfg.databasePasswordFile}')" echo "CREATE ROLE keycloak WITH LOGIN PASSWORD '$(<'${cfg.database.passwordFile}')' CREATEDB" > "$create_role"
$PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='keycloak'" | grep -q 1 || $PSQL -tAc "CREATE ROLE keycloak WITH LOGIN PASSWORD '$db_password' CREATEDB" psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='keycloak'" | grep -q 1 || psql -tA --file="$create_role"
$PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = 'keycloak'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "keycloak" OWNER "keycloak"' psql -tAc "SELECT 1 FROM pg_database WHERE datname = 'keycloak'" | grep -q 1 || psql -tAc 'CREATE DATABASE "keycloak" OWNER "keycloak"'
''; '';
}; };
@ -602,6 +623,7 @@ in
after = [ "mysql.service" ]; after = [ "mysql.service" ];
before = [ "keycloak.service" ]; before = [ "keycloak.service" ];
bindsTo = [ "mysql.service" ]; bindsTo = [ "mysql.service" ];
path = [ config.services.mysql.package ];
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
RemainAfterExit = true; RemainAfterExit = true;
@ -609,13 +631,14 @@ in
Group = config.services.mysql.group; Group = config.services.mysql.group;
}; };
script = '' script = ''
set -eu set -o errexit -o pipefail -o nounset -o errtrace
shopt -s inherit_errexit
db_password="$(<'${cfg.databasePasswordFile}')" db_password="$(<'${cfg.database.passwordFile}')"
( echo "CREATE USER IF NOT EXISTS 'keycloak'@'localhost' IDENTIFIED BY '$db_password';" ( echo "CREATE USER IF NOT EXISTS 'keycloak'@'localhost' IDENTIFIED BY '$db_password';"
echo "CREATE DATABASE keycloak CHARACTER SET utf8 COLLATE utf8_unicode_ci;" echo "CREATE DATABASE keycloak CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
echo "GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'localhost';" echo "GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'localhost';"
) | ${config.services.mysql.package}/bin/mysql -N ) | mysql -N
''; '';
}; };
@ -634,6 +657,8 @@ in
bindsTo = databaseServices; bindsTo = databaseServices;
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = with pkgs; [ path = with pkgs; [
cfg.package
openssl
replace-secret replace-secret
]; ];
environment = { environment = {
@ -644,14 +669,21 @@ in
serviceConfig = { serviceConfig = {
ExecStartPre = let ExecStartPre = let
startPreFullPrivileges = '' startPreFullPrivileges = ''
set -eu set -o errexit -o pipefail -o nounset -o errtrace
shopt -s inherit_errexit
install -T -m 0400 -o keycloak -g keycloak '${cfg.databasePasswordFile}' /run/keycloak/secrets/db_password umask u=rwx,g=,o=
'' + lib.optionalString (cfg.certificatePrivateKeyBundle != null) ''
install -T -m 0400 -o keycloak -g keycloak '${cfg.certificatePrivateKeyBundle}' /run/keycloak/secrets/ssl_cert_pk_bundle install -T -m 0400 -o keycloak -g keycloak '${cfg.database.passwordFile}' /run/keycloak/secrets/db_password
'' + lib.optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
install -T -m 0400 -o keycloak -g keycloak '${cfg.sslCertificate}' /run/keycloak/secrets/ssl_cert
install -T -m 0400 -o keycloak -g keycloak '${cfg.sslCertificateKey}' /run/keycloak/secrets/ssl_key
''; '';
startPre = '' startPre = ''
set -eu set -o errexit -o pipefail -o nounset -o errtrace
shopt -s inherit_errexit
umask u=rwx,g=,o=
install -m 0600 ${cfg.package}/standalone/configuration/*.properties /run/keycloak/configuration install -m 0600 ${cfg.package}/standalone/configuration/*.properties /run/keycloak/configuration
install -T -m 0600 ${keycloakConfig} /run/keycloak/configuration/standalone.xml install -T -m 0600 ${keycloakConfig} /run/keycloak/configuration/standalone.xml
@ -659,13 +691,16 @@ in
replace-secret '@db-password@' '/run/keycloak/secrets/db_password' /run/keycloak/configuration/standalone.xml replace-secret '@db-password@' '/run/keycloak/secrets/db_password' /run/keycloak/configuration/standalone.xml
export JAVA_OPTS=-Djboss.server.config.user.dir=/run/keycloak/configuration export JAVA_OPTS=-Djboss.server.config.user.dir=/run/keycloak/configuration
${cfg.package}/bin/add-user-keycloak.sh -u admin -p '${cfg.initialAdminPassword}' add-user-keycloak.sh -u admin -p '${cfg.initialAdminPassword}'
'' + lib.optionalString (cfg.certificatePrivateKeyBundle != null) '' '' + lib.optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
pushd /run/keycloak/ssl/ pushd /run/keycloak/ssl/
cat /run/keycloak/secrets/ssl_cert_pk_bundle <(echo) /etc/ssl/certs/ca-certificates.crt > allcerts.pem cat /run/keycloak/secrets/ssl_cert <(echo) \
${pkgs.openssl}/bin/openssl pkcs12 -export -in /run/keycloak/secrets/ssl_cert_pk_bundle -chain \ /run/keycloak/secrets/ssl_key <(echo) \
-name "${cfg.frontendUrl}" -out certificate_private_key_bundle.p12 \ /etc/ssl/certs/ca-certificates.crt \
-CAfile allcerts.pem -passout pass:notsosecretpassword > allcerts.pem
openssl pkcs12 -export -in /run/keycloak/secrets/ssl_cert -inkey /run/keycloak/secrets/ssl_key -chain \
-name "${cfg.frontendUrl}" -out certificate_private_key_bundle.p12 \
-CAfile allcerts.pem -passout pass:notsosecretpassword
popd popd
''; '';
in [ in [
@ -697,4 +732,5 @@ in
}; };
meta.doc = ./keycloak.xml; meta.doc = ./keycloak.xml;
meta.maintainers = [ lib.maintainers.talyz ];
} }

View file

@ -41,31 +41,31 @@
<productname>PostgreSQL</productname> or <productname>PostgreSQL</productname> or
<productname>MySQL</productname>. Which one is used can be <productname>MySQL</productname>. Which one is used can be
configured in <xref configured in <xref
linkend="opt-services.keycloak.databaseType" />. The selected linkend="opt-services.keycloak.database.type" />. The selected
database will automatically be enabled and a database and role database will automatically be enabled and a database and role
created unless <xref created unless <xref
linkend="opt-services.keycloak.databaseHost" /> is changed from linkend="opt-services.keycloak.database.host" /> is changed from
its default of <literal>localhost</literal> or <xref its default of <literal>localhost</literal> or <xref
linkend="opt-services.keycloak.databaseCreateLocally" /> is set linkend="opt-services.keycloak.database.createLocally" /> is set
to <literal>false</literal>. to <literal>false</literal>.
</para> </para>
<para> <para>
External database access can also be configured by setting External database access can also be configured by setting
<xref linkend="opt-services.keycloak.databaseHost" />, <xref <xref linkend="opt-services.keycloak.database.host" />, <xref
linkend="opt-services.keycloak.databaseUsername" />, <xref linkend="opt-services.keycloak.database.username" />, <xref
linkend="opt-services.keycloak.databaseUseSSL" /> and <xref linkend="opt-services.keycloak.database.useSSL" /> and <xref
linkend="opt-services.keycloak.databaseCaCert" /> as linkend="opt-services.keycloak.database.caCert" /> as
appropriate. Note that you need to manually create a database appropriate. Note that you need to manually create a database
called <literal>keycloak</literal> and allow the configured called <literal>keycloak</literal> and allow the configured
database user full access to it. database user full access to it.
</para> </para>
<para> <para>
<xref linkend="opt-services.keycloak.databasePasswordFile" /> <xref linkend="opt-services.keycloak.database.passwordFile" />
must be set to the path to a file containing the password used must be set to the path to a file containing the password used
to log in to the database. If <xref linkend="opt-services.keycloak.databaseHost" /> to log in to the database. If <xref linkend="opt-services.keycloak.database.host" />
and <xref linkend="opt-services.keycloak.databaseCreateLocally" /> and <xref linkend="opt-services.keycloak.database.createLocally" />
are kept at their defaults, the database role are kept at their defaults, the database role
<literal>keycloak</literal> with that password is provisioned <literal>keycloak</literal> with that password is provisioned
on the local database instance. on the local database instance.
@ -115,17 +115,17 @@
</para> </para>
<para> <para>
For HTTPS support, a TLS certificate and private key is HTTPS support requires a TLS/SSL certificate and a private key,
required. They should be <link both <link
xlink:href="https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail">PEM xlink:href="https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail">PEM
formatted</link> and concatenated into a single file. The path formatted</link>. Their paths should be set through <xref
to this file should be configured in linkend="opt-services.keycloak.sslCertificate" /> and <xref
<xref linkend="opt-services.keycloak.certificatePrivateKeyBundle" />. linkend="opt-services.keycloak.sslCertificateKey" />.
</para> </para>
<warning> <warning>
<para> <para>
The path should be provided as a string, not a Nix path, The paths should be provided as a strings, not a Nix paths,
since Nix paths are copied into the world readable Nix store. since Nix paths are copied into the world readable Nix store.
</para> </para>
</warning> </warning>
@ -195,8 +195,9 @@ services.keycloak = {
<link linkend="opt-services.keycloak.initialAdminPassword">initialAdminPassword</link> = "e6Wcm0RrtegMEHl"; # change on first login <link linkend="opt-services.keycloak.initialAdminPassword">initialAdminPassword</link> = "e6Wcm0RrtegMEHl"; # change on first login
<link linkend="opt-services.keycloak.frontendUrl">frontendUrl</link> = "https://keycloak.example.com/auth"; <link linkend="opt-services.keycloak.frontendUrl">frontendUrl</link> = "https://keycloak.example.com/auth";
<link linkend="opt-services.keycloak.forceBackendUrlToFrontendUrl">forceBackendUrlToFrontendUrl</link> = true; <link linkend="opt-services.keycloak.forceBackendUrlToFrontendUrl">forceBackendUrlToFrontendUrl</link> = true;
<link linkend="opt-services.keycloak.certificatePrivateKeyBundle">certificatePrivateKeyBundle</link> = "/run/keys/ssl_cert"; <link linkend="opt-services.keycloak.sslCertificate">sslCertificate</link> = "/run/keys/ssl_cert";
<link linkend="opt-services.keycloak.databasePasswordFile">databasePasswordFile</link> = "/run/keys/db_password"; <link linkend="opt-services.keycloak.sslCertificateKey">sslCertificateKey</link> = "/run/keys/ssl_key";
<link linkend="opt-services.keycloak.database.passwordFile">database.passwordFile</link> = "/run/keys/db_password";
}; };
</programlisting> </programlisting>
</para> </para>

View file

@ -448,10 +448,10 @@ in {
join pg_namespace s on s.oid = c.relnamespace \ join pg_namespace s on s.oid = c.relnamespace \
where s.nspname not in ('pg_catalog', 'pg_toast', 'information_schema') \ where s.nspname not in ('pg_catalog', 'pg_toast', 'information_schema') \
and s.nspname not like 'pg_temp%';" | sed -n 3p` -eq 0 ]; then and s.nspname not like 'pg_temp%';" | sed -n 3p` -eq 0 ]; then
SAFETY_ASSURED=1 rake db:schema:load SAFETY_ASSURED=1 rails db:schema:load
rake db:seed rails db:seed
else else
rake db:migrate rails db:migrate
fi fi
''; '';
path = [ cfg.package pkgs.postgresql ]; path = [ cfg.package pkgs.postgresql ];

View file

@ -135,6 +135,7 @@ in
fsck = handleTest ./fsck.nix {}; fsck = handleTest ./fsck.nix {};
ft2-clone = handleTest ./ft2-clone.nix {}; ft2-clone = handleTest ./ft2-clone.nix {};
gerrit = handleTest ./gerrit.nix {}; gerrit = handleTest ./gerrit.nix {};
ghostunnel = handleTest ./ghostunnel.nix {};
gitdaemon = handleTest ./gitdaemon.nix {}; gitdaemon = handleTest ./gitdaemon.nix {};
gitea = handleTest ./gitea.nix {}; gitea = handleTest ./gitea.nix {};
gitlab = handleTest ./gitlab.nix {}; gitlab = handleTest ./gitlab.nix {};
@ -383,6 +384,7 @@ in
snapcast = handleTest ./snapcast.nix {}; snapcast = handleTest ./snapcast.nix {};
snapper = handleTest ./snapper.nix {}; snapper = handleTest ./snapper.nix {};
sogo = handleTest ./sogo.nix {}; sogo = handleTest ./sogo.nix {};
solanum = handleTest ./solanum.nix {};
solr = handleTest ./solr.nix {}; solr = handleTest ./solr.nix {};
sonarr = handleTest ./sonarr.nix {}; sonarr = handleTest ./sonarr.nix {};
spacecookie = handleTest ./spacecookie.nix {}; spacecookie = handleTest ./spacecookie.nix {};

104
nixos/tests/ghostunnel.nix Normal file
View file

@ -0,0 +1,104 @@
{ pkgs, ... }: import ./make-test-python.nix {
nodes = {
backend = { pkgs, ... }: {
services.nginx.enable = true;
services.nginx.virtualHosts."backend".root = pkgs.runCommand "webroot" {} ''
mkdir $out
echo hi >$out/hi.txt
'';
networking.firewall.allowedTCPPorts = [ 80 ];
};
service = { ... }: {
services.ghostunnel.enable = true;
services.ghostunnel.servers."plain-old" = {
listen = "0.0.0.0:443";
cert = "/root/service-cert.pem";
key = "/root/service-key.pem";
disableAuthentication = true;
target = "backend:80";
unsafeTarget = true;
};
services.ghostunnel.servers."client-cert" = {
listen = "0.0.0.0:1443";
cert = "/root/service-cert.pem";
key = "/root/service-key.pem";
cacert = "/root/ca.pem";
target = "backend:80";
allowCN = ["client"];
unsafeTarget = true;
};
networking.firewall.allowedTCPPorts = [ 443 1443 ];
};
client = { pkgs, ... }: {
environment.systemPackages = [
pkgs.curl
];
};
};
testScript = ''
# prepare certificates
def cmd(command):
print(f"+{command}")
r = os.system(command)
if r != 0:
raise Exception(f"Command {command} failed with exit code {r}")
# Create CA
cmd("${pkgs.openssl}/bin/openssl genrsa -out ca-key.pem 4096")
cmd("${pkgs.openssl}/bin/openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj '/C=NL/ST=Zuid-Holland/L=The Hague/O=Stevige Balken en Planken B.V./OU=OpSec/CN=Certificate Authority' -out ca.pem")
# Create service
cmd("${pkgs.openssl}/bin/openssl genrsa -out service-key.pem 4096")
cmd("${pkgs.openssl}/bin/openssl req -subj '/CN=service' -sha256 -new -key service-key.pem -out service.csr")
cmd("echo subjectAltName = DNS:service,IP:127.0.0.1 >> extfile.cnf")
cmd("echo extendedKeyUsage = serverAuth >> extfile.cnf")
cmd("${pkgs.openssl}/bin/openssl x509 -req -days 365 -sha256 -in service.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out service-cert.pem -extfile extfile.cnf")
# Create client
cmd("${pkgs.openssl}/bin/openssl genrsa -out client-key.pem 4096")
cmd("${pkgs.openssl}/bin/openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr")
cmd("echo extendedKeyUsage = clientAuth > extfile-client.cnf")
cmd("${pkgs.openssl}/bin/openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile-client.cnf")
cmd("ls -al")
start_all()
# Configuration
service.copy_from_host("ca.pem", "/root/ca.pem")
service.copy_from_host("service-cert.pem", "/root/service-cert.pem")
service.copy_from_host("service-key.pem", "/root/service-key.pem")
client.copy_from_host("ca.pem", "/root/ca.pem")
client.copy_from_host("service-cert.pem", "/root/service-cert.pem")
client.copy_from_host("client-cert.pem", "/root/client-cert.pem")
client.copy_from_host("client-key.pem", "/root/client-key.pem")
backend.wait_for_unit("nginx.service")
service.wait_for_unit("multi-user.target")
service.wait_for_unit("multi-user.target")
client.wait_for_unit("multi-user.target")
# Check assumptions before the real test
client.succeed("bash -c 'diff <(curl -v --no-progress-meter http://backend/hi.txt) <(echo hi)'")
# Plain old simple TLS can connect, ignoring cert
client.succeed("bash -c 'diff <(curl -v --no-progress-meter --insecure https://service/hi.txt) <(echo hi)'")
# Plain old simple TLS provides correct signature with its cert
client.succeed("bash -c 'diff <(curl -v --no-progress-meter --cacert /root/ca.pem https://service/hi.txt) <(echo hi)'")
# Client can authenticate with certificate
client.succeed("bash -c 'diff <(curl -v --no-progress-meter --cert /root/client-cert.pem --key /root/client-key.pem --cacert /root/ca.pem https://service:1443/hi.txt) <(echo hi)'")
# Client must authenticate with certificate
client.fail("bash -c 'diff <(curl -v --no-progress-meter --cacert /root/ca.pem https://service:1443/hi.txt) <(echo hi)'")
'';
meta.maintainers = with pkgs.lib.maintainers; [
roberth
];
}

View file

@ -3,7 +3,8 @@
# client using their Keycloak login. # client using their Keycloak login.
let let
frontendUrl = "http://keycloak/auth"; certs = import ./common/acme/server/snakeoil-certs.nix;
frontendUrl = "https://${certs.domain}/auth";
initialAdminPassword = "h4IhoJFnt2iQIR9"; initialAdminPassword = "h4IhoJFnt2iQIR9";
keycloakTest = import ./make-test-python.nix ( keycloakTest = import ./make-test-python.nix (
@ -17,12 +18,27 @@ let
nodes = { nodes = {
keycloak = { ... }: { keycloak = { ... }: {
virtualisation.memorySize = 1024; virtualisation.memorySize = 1024;
security.pki.certificateFiles = [
certs.ca.cert
];
networking.extraHosts = ''
127.0.0.1 ${certs.domain}
'';
services.keycloak = { services.keycloak = {
enable = true; enable = true;
inherit frontendUrl databaseType initialAdminPassword; inherit frontendUrl initialAdminPassword;
databaseUsername = "bogus"; sslCertificate = certs.${certs.domain}.cert;
databasePasswordFile = pkgs.writeText "dbPassword" "wzf6vOCbPp6cqTH"; sslCertificateKey = certs.${certs.domain}.key;
database = {
type = databaseType;
username = "bogus";
passwordFile = pkgs.writeText "dbPassword" "wzf6vOCbPp6cqTH";
};
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
xmlstarlet xmlstarlet
libtidy libtidy

View file

@ -43,6 +43,10 @@ in import ./make-test-python.nix ({ pkgs, ...} : {
services.nsd.enable = true; services.nsd.enable = true;
services.nsd.rootServer = true; services.nsd.rootServer = true;
services.nsd.interfaces = lib.mkForce []; services.nsd.interfaces = lib.mkForce [];
services.nsd.keys."tsig.example.com." = {
algorithm = "hmac-sha256";
keyFile = pkgs.writeTextFile { name = "tsig.example.com."; text = "aR3FJA92+bxRSyosadsJ8Aeeav5TngQW/H/EF9veXbc="; };
};
services.nsd.zones."example.com.".data = '' services.nsd.zones."example.com.".data = ''
@ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600 @ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600
ipv4 A 1.2.3.4 ipv4 A 1.2.3.4
@ -51,6 +55,7 @@ in import ./make-test-python.nix ({ pkgs, ...} : {
ns A 192.168.0.1 ns A 192.168.0.1
ns AAAA dead:beef::1 ns AAAA dead:beef::1
''; '';
services.nsd.zones."example.com.".provideXFR = [ "0.0.0.0 tsig.example.com." ];
services.nsd.zones."deleg.example.com.".data = '' services.nsd.zones."deleg.example.com.".data = ''
@ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600 @ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600
@ A 9.8.7.6 @ A 9.8.7.6
@ -71,6 +76,10 @@ in import ./make-test-python.nix ({ pkgs, ...} : {
clientv6.wait_for_unit("network.target") clientv6.wait_for_unit("network.target")
server.wait_for_unit("nsd.service") server.wait_for_unit("nsd.service")
with subtest("server tsig.example.com."):
expected_tsig = " secret: \"aR3FJA92+bxRSyosadsJ8Aeeav5TngQW/H/EF9veXbc=\"\n"
tsig=server.succeed("cat /var/lib/nsd/private/tsig.example.com.")
assert expected_tsig == tsig, f"Expected /var/lib/nsd/private/tsig.example.com. to contain '{expected_tsig}', but found '{tsig}'"
def assert_host(type, rr, query, expected): def assert_host(type, rr, query, expected):
self = clientv4 if type == 4 else clientv6 self = clientv4 if type == 4 else clientv6

89
nixos/tests/solanum.nix Normal file
View file

@ -0,0 +1,89 @@
let
clients = [
"ircclient1"
"ircclient2"
];
server = "solanum";
ircPort = 6667;
channel = "nixos-cat";
iiDir = "/tmp/irc";
in
import ./make-test-python.nix ({ pkgs, lib, ... }: {
name = "solanum";
nodes = {
"${server}" = {
networking.firewall.allowedTCPPorts = [ ircPort ];
services.solanum = {
enable = true;
};
};
} // lib.listToAttrs (builtins.map (client: lib.nameValuePair client {
imports = [
./common/user-account.nix
];
systemd.services.ii = {
requires = [ "network.target" ];
wantedBy = [ "default.target" ];
serviceConfig = {
Type = "simple";
ExecPreStartPre = "mkdir -p ${iiDir}";
ExecStart = ''
${lib.getBin pkgs.ii}/bin/ii -n ${client} -s ${server} -i ${iiDir}
'';
User = "alice";
};
};
}) clients);
testScript =
let
msg = client: "Hello, my name is ${client}";
clientScript = client: [
''
${client}.wait_for_unit("network.target")
${client}.systemctl("start ii")
${client}.wait_for_unit("ii")
${client}.wait_for_file("${iiDir}/${server}/out")
''
# wait until first PING from server arrives before joining,
# so we don't try it too early
''
${client}.wait_until_succeeds("grep 'PING' ${iiDir}/${server}/out")
''
# join ${channel}
''
${client}.succeed("echo '/j #${channel}' > ${iiDir}/${server}/in")
${client}.wait_for_file("${iiDir}/${server}/#${channel}/in")
''
# send a greeting
''
${client}.succeed(
"echo '${msg client}' > ${iiDir}/${server}/#${channel}/in"
)
''
# check that all greetings arrived on all clients
] ++ builtins.map (other: ''
${client}.succeed(
"grep '${msg other}$' ${iiDir}/${server}/#${channel}/out"
)
'') clients;
# foldl', but requires a non-empty list instead of a start value
reduce = f: list:
builtins.foldl' f (builtins.head list) (builtins.tail list);
in ''
start_all()
${server}.systemctl("status solanum")
${server}.wait_for_open_port(${toString ircPort})
# run clientScript for all clients so that every list
# entry is executed by every client before advancing
# to the next one.
'' + lib.concatStrings
(reduce
(lib.zipListsWith (cs: c: cs + c))
(builtins.map clientScript clients));
})

View file

@ -3,7 +3,7 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "cava"; pname = "cava";
version = "0.7.3"; version = "0.7.4";
buildInputs = [ buildInputs = [
alsaLib alsaLib
@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
owner = "karlstav"; owner = "karlstav";
repo = "cava"; repo = "cava";
rev = version; rev = version;
sha256 = "04j5hb29hivcbk542sfsx9m57dbnj2s6qpvy9fs488zvgjbgxrai"; sha256 = "sha256-BlHGst34aUgQcXcuQG43VnKUTclCxfQmWRa6iCud8dc=";
}; };
nativeBuildInputs = [ autoreconfHook ]; nativeBuildInputs = [ autoreconfHook ];

View file

@ -1,8 +1,49 @@
{ lib, mkDerivation, fetchFromGitHub, fetchpatch, boost, cmake, chromaprint, gettext, gst_all_1, liblastfm { lib
, qtbase, qtx11extras, qttools , mkDerivation
, taglib, fftw, glew, qjson, sqlite, libgpod, libplist, usbmuxd, libmtp , fetchFromGitHub
, libpulseaudio, gvfs, libcdio, libechonest, libspotify, pcre, projectm, protobuf , fetchpatch
, qca2, pkg-config, sparsehash, config, makeWrapper, gst_plugins }: , boost
, cmake
, chromaprint
, gettext
, gst_all_1
, liblastfm
, qtbase
, qtx11extras
, qttools
, taglib
, fftw
, glew
, qjson
, sqlite
, libgpod
, libplist
, usbmuxd
, libmtp
, libpulseaudio
, gvfs
, libcdio
, libechonest
, libspotify
, pcre
, projectm
, protobuf
, qca2
, pkg-config
, sparsehash
, config
, makeWrapper
, gst_plugins
, util-linux
, libunwind
, libselinux
, elfutils
, libsepol
, orc
, alsaLib
}:
let let
withIpod = config.clementine.ipod or false; withIpod = config.clementine.ipod or false;
@ -22,9 +63,26 @@ let
patches = [ patches = [
./clementine-spotify-blob.patch ./clementine-spotify-blob.patch
(fetchpatch {
# "short-term" fix for execution on wayland (1.4.0rc1-131-g2179027a6)
# for https://github.com/clementine-player/Clementine/issues/6587
url = "https://github.com/clementine-player/Clementine/commit/2179027a6d97530c857e43be873baacd696ff332.patch";
sha256 = "0344bfcyvjim5ph8w4km6zkg96rj5g9ybp9x14qgyw2gkdksimn6";
})
]; ];
nativeBuildInputs = [ cmake pkg-config makeWrapper ]; nativeBuildInputs = [
cmake
pkg-config
makeWrapper
util-linux
libunwind
libselinux
elfutils
libsepol
orc
];
buildInputs = [ buildInputs = [
boost boost
@ -48,11 +106,13 @@ let
qttools qttools
sqlite sqlite
taglib taglib
alsaLib
] ]
++ lib.optionals (withIpod) [libgpod libplist usbmuxd] ++ lib.optionals (withIpod) [ libgpod libplist usbmuxd ]
++ lib.optionals (withMTP) [libmtp] ++ lib.optionals (withMTP) [ libmtp ]
++ lib.optionals (withCD) [libcdio] ++ lib.optionals (withCD) [ libcdio ]
++ lib.optionals (withCloud) [sparsehash]; ++ lib.optionals (withCloud) [ sparsehash ];
postPatch = '' postPatch = ''
sed -i src/CMakeLists.txt \ sed -i src/CMakeLists.txt \
@ -132,4 +192,5 @@ let
}; };
}; };
in free in
free

View file

@ -1,13 +1,13 @@
{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, curl, libnotify, gdk-pixbuf }: { lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, curl, libnotify, gdk-pixbuf }:
stdenv.mkDerivation { stdenv.mkDerivation {
version = "2020-07-23"; version = "2021-05-19";
pname = "cmusfm-unstable"; pname = "cmusfm-unstable";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Arkq"; owner = "Arkq";
repo = "cmusfm"; repo = "cmusfm";
rev = "73df3e64d8aa3b5053b639615b8f81d512420e52"; rev = "a1f9f37c5819ca8a5b48e6185c2ec7ad478b9f1a";
sha256 = "1p9i65v8hda9bsps4hm9m2b7aw9ivk4ncllg8svyp455gn5v8xx6"; sha256 = "19akgvh9gl99xvpmzgqv88w2mnnln7k6290dr5rn3h6a1ihvllaw";
}; };
# building # building
configureFlags = [ "--enable-libnotify" ]; configureFlags = [ "--enable-libnotify" ];
@ -29,7 +29,7 @@ stdenv.mkDerivation {
+ Inside cmus run `:set status_display_program=cmusfm` to set up cmusfm + Inside cmus run `:set status_display_program=cmusfm` to set up cmusfm
''; '';
homepage = "https://github.com/Arkq/cmusfm/"; homepage = "https://github.com/Arkq/cmusfm/";
maintainers = with lib.maintainers; [ CharlesHD ]; maintainers = with lib.maintainers; [ CharlesHD mudri ];
license = licenses.gpl3Plus; license = licenses.gpl3Plus;
platforms = platforms.linux ++ platforms.darwin; platforms = platforms.linux ++ platforms.darwin;
}; };

View file

@ -14,11 +14,10 @@
, musepackSupport ? true, libmpc, libmpcdec, taglib , musepackSupport ? true, libmpc, libmpcdec, taglib
, vorbisSupport ? true, libvorbis , vorbisSupport ? true, libvorbis
, speexSupport ? true, speex , speexSupport ? true, speex
, ffmpegSupport ? true, ffmpeg_3 , ffmpegSupport ? true, ffmpeg
, sndfileSupport ? true, libsndfile , sndfileSupport ? true, libsndfile
, wavpackSupport ? true, wavpack , wavpackSupport ? true, wavpack
# Misc # Misc
, withffmpeg4 ? false, ffmpeg_4
, curlSupport ? true, curl , curlSupport ? true, curl
, samplerateSupport ? true, libsamplerate , samplerateSupport ? true, libsamplerate
, withDebug ? false , withDebug ? false
@ -39,7 +38,7 @@ in stdenv.mkDerivation rec {
}; };
patches = [] patches = []
++ opt withffmpeg4 ./moc-ffmpeg4.patch ++ opt ffmpegSupport ./moc-ffmpeg4.patch
++ opt pulseSupport ./pulseaudio.patch; ++ opt pulseSupport ./pulseaudio.patch;
nativeBuildInputs = [ pkg-config ] nativeBuildInputs = [ pkg-config ]
@ -60,8 +59,7 @@ in stdenv.mkDerivation rec {
++ lib.optionals musepackSupport [ libmpc libmpcdec taglib ] ++ lib.optionals musepackSupport [ libmpc libmpcdec taglib ]
++ opt vorbisSupport libvorbis ++ opt vorbisSupport libvorbis
++ opt speexSupport speex ++ opt speexSupport speex
++ opt (ffmpegSupport && !withffmpeg4) ffmpeg_3 ++ opt ffmpegSupport ffmpeg
++ opt (ffmpegSupport && withffmpeg4) ffmpeg_4
++ opt sndfileSupport libsndfile ++ opt sndfileSupport libsndfile
++ opt wavpackSupport wavpack ++ opt wavpackSupport wavpack
# Misc # Misc

View file

@ -14,16 +14,16 @@ let
in in
rustPlatform.buildRustPackage rec { rustPlatform.buildRustPackage rec {
pname = "ncspot"; pname = "ncspot";
version = "0.7.0"; version = "0.7.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "hrkfdn"; owner = "hrkfdn";
repo = "ncspot"; repo = "ncspot";
rev = "v${version}"; rev = "v${version}";
sha256 = "04ws6xkqs0g5fkl11861vqxh6xr0z6k1z40ln0za7n38ra2mjgh0"; sha256 = "1qhdhybbgnn7ky9qdxwi07flwzjagp22qmlccbz1z3lhznm9a971";
}; };
cargoSha256 = "1ws7qr41pqz99cpcigw4bckiwz7l5kzi0dkfif7203v9zy57mmzi"; cargoSha256 = "1kv37ib0klykmjabm1qyz55frs7djkx225alj4rk4a92xq9m8i9v";
cargoBuildFlags = [ "--no-default-features" "--features" "${lib.concatStringsSep "," features}" ]; cargoBuildFlags = [ "--no-default-features" "--features" "${lib.concatStringsSep "," features}" ];

View file

@ -1,31 +1,35 @@
{ lib, stdenv, fetchFromGitHub, ncurses, portmidi }: { lib, stdenv, fetchgit, ncurses, portmidi }:
stdenv.mkDerivation { stdenv.mkDerivation {
pname = "orca-c"; pname = "orca-c";
version = "git-2020-05-01"; version = "git-2021-02-13";
src = fetchFromGitHub { src = fetchgit {
owner = "hundredrabbits"; url = "https://git.sr.ht/~rabbits/orca";
repo = "Orca-c"; rev = "5ba56ca67baae3db140f8b7a2b2fc46bbac5602f";
rev = "d7a3b169c5ed0b06a9ad0fdb3057704da9a0b6ce"; sha256 = "sha256-bbIH0kyHRTcMGXV3WdBQIH1br0FyIzKKL88wqpGZ0NY=";
sha256 = "101y617a295hzwr98ykvza1sycxlk29kzxn2ybjwc718r0alkbzz";
}; };
buildInputs = [ ncurses portmidi ]; buildInputs = [ ncurses portmidi ];
patchPhase = '' postPatch = ''
patchShebangs tool patchShebangs tool
''; '';
installPhase = '' installPhase = ''
runHook preInstall
mkdir -p $out/bin mkdir -p $out/bin
install build/orca $out/bin/orca install build/orca $out/bin/orca
runHook postInstall
''; '';
meta = with lib; { meta = with lib; {
description = "An esoteric programming language designed to quickly create procedural sequencers"; description = "An esoteric programming language designed to quickly create procedural sequencers";
homepage = "https://github.com/hundredrabbits/Orca-c"; homepage = "https://git.sr.ht/~rabbits/orca";
license = licenses.mit; license = licenses.mit;
platforms = platforms.all; platforms = platforms.all;
maintainers = with maintainers; [ netcrns ];
}; };
} }

View file

@ -19,20 +19,20 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "pika-backup"; pname = "pika-backup";
version = "0.3.0"; version = "0.3.1";
src = fetchFromGitLab { src = fetchFromGitLab {
domain = "gitlab.gnome.org"; domain = "gitlab.gnome.org";
owner = "World"; owner = "World";
repo = "pika-backup"; repo = "pika-backup";
rev = "v${version}"; rev = "v${version}";
sha256 = "sha256-k9kl6cSohWx+MB/9jyVcTgpv02gsVwAk5KDSNqQrmzI="; sha256 = "0cr3axfp15nzwmsqyz6j781qhr2gsn9p69m0jfzy89pl83d6vcz0";
}; };
cargoDeps = rustPlatform.fetchCargoTarball { cargoDeps = rustPlatform.fetchCargoTarball {
inherit src; inherit src;
name = "${pname}-${version}"; name = "${pname}-${version}";
sha256 = "0r6nbffik5j82bi82cmc00b17xv9m7xn3w3sarzwfxz0h43lal8a"; sha256 = "1z0cbrkhxyzwf7vjjsvdppb7zhflpkw4m5cy90a2315nbll3hpbp";
}; };
patches = [ patches = [

View file

@ -7,13 +7,13 @@ with lib;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "bitcoin" + (toString (optional (!withGui) "d")) + "-unlimited-" + version; name = "bitcoin" + (toString (optional (!withGui) "d")) + "-unlimited-" + version;
version = "1.9.0.1"; version = "1.9.1.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "bitcoinunlimited"; owner = "bitcoinunlimited";
repo = "bitcoinunlimited"; repo = "bitcoinunlimited";
rev = "BCHunlimited${version}"; rev = "BCHunlimited${version}";
sha256 = "018a22zbvjqky0whizmgxzscmna0sh2xqgyw02yjk8qj4yi0zp8c"; sha256 = "sha256-K15SI1F/xI4SkX4a41QHLn89YaHCgrlv+wcbkpwGKhI=";
}; };
nativeBuildInputs = [ pkg-config autoreconfHook python3 ] nativeBuildInputs = [ pkg-config autoreconfHook python3 ]

View file

@ -19,13 +19,13 @@ with lib;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "monero-gui"; pname = "monero-gui";
version = "0.17.2.1"; version = "0.17.2.2";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "monero-project"; owner = "monero-project";
repo = "monero-gui"; repo = "monero-gui";
rev = "v${version}"; rev = "v${version}";
sha256 = "1apjvpvn6hg0k0ak6wpg4prcdcslnb6fqhzzg2p4iy846f0ai9ji"; sha256 = "1k3grbd3wydy5gv6d8x35skv1v97lhh6awd9i87im9lz4kn8ywkd";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -4,13 +4,13 @@
let let
pname = "MyCrypto"; pname = "MyCrypto";
version = "1.7.13"; version = "1.7.16";
sha256 = "15m21n68lxnz6fxwf1bb3cxg5qi6nrwcnqymiw8s9wizvv575vj7"; hash = "sha256-fvV/dT9tj8/d/kjM0dVj3IC/O7Y/yG8fscDCzUBwHKI=";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "https://github.com/mycryptohq/mycrypto/releases/download/${version}/linux-x86-64_${version}_MyCrypto.AppImage"; url = "https://github.com/mycryptohq/mycrypto/releases/download/${version}/linux-x86-64_${version}_MyCrypto.AppImage";
inherit sha256; inherit hash;
}; };
appimageContents = appimageTools.extractType2 { appimageContents = appimageTools.extractType2 {

View file

@ -7,16 +7,16 @@
}: }:
rustPlatform.buildRustPackage rec { rustPlatform.buildRustPackage rec {
pname = "polkadot"; pname = "polkadot";
version = "0.9.1"; version = "0.9.2";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "paritytech"; owner = "paritytech";
repo = "polkadot"; repo = "polkadot";
rev = "v${version}"; rev = "v${version}";
sha256 = "sha256-Ryo7Ln9nh6rlla4jnhSgqiIqHciGBTDxAjuRzE7BhDs="; sha256 = "sha256-lxkLRJYdP30JNDHwa7tpugyIObmnjIBQ/HMGw6deElo=";
}; };
cargoSha256 = "sha256-PpFphsSfVTENp1TsnQRuAqKK0hcqFLXp/tDrVSz5mIQ="; cargoSha256 = "0gg42b6h8782wny3dr9gc38wl6bybyf4smashchgrpc649ds6w0a";
nativeBuildInputs = [ clang ]; nativeBuildInputs = [ clang ];

View file

@ -655,10 +655,10 @@
elpaBuild { elpaBuild {
pname = "corfu"; pname = "corfu";
ename = "corfu"; ename = "corfu";
version = "0.6"; version = "0.8";
src = fetchurl { src = fetchurl {
url = "https://elpa.gnu.org/packages/corfu-0.6.tar"; url = "https://elpa.gnu.org/packages/corfu-0.8.tar";
sha256 = "0zl769l3mmy4b0pj70dwjllq0224r2w4l45xvaqbj75qfqclj6cj"; sha256 = "1qrrky1g4k5vw56435dgkwnmnri7i51gkydd76as3l0ixm4pnp05";
}; };
packageRequires = [ emacs ]; packageRequires = [ emacs ];
meta = { meta = {
@ -1738,6 +1738,21 @@
license = lib.licenses.free; license = lib.licenses.free;
}; };
}) {}; }) {};
isearch-mb = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild {
pname = "isearch-mb";
ename = "isearch-mb";
version = "0.2";
src = fetchurl {
url = "https://elpa.gnu.org/packages/isearch-mb-0.2.tar";
sha256 = "1mfjppv33cb5f5f6cc1486msxjxfjnnkryc1yax43k6fgzjr0j4h";
};
packageRequires = [ emacs ];
meta = {
homepage = "https://elpa.gnu.org/packages/isearch-mb.html";
license = lib.licenses.free;
};
}) {};
iterators = callPackage ({ elpaBuild, emacs, fetchurl, lib }: iterators = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
elpaBuild { elpaBuild {
pname = "iterators"; pname = "iterators";
@ -2544,10 +2559,10 @@
elpaBuild { elpaBuild {
pname = "org"; pname = "org";
ename = "org"; ename = "org";
version = "9.4.5"; version = "9.4.6";
src = fetchurl { src = fetchurl {
url = "https://elpa.gnu.org/packages/org-9.4.5.tar"; url = "https://elpa.gnu.org/packages/org-9.4.6.tar";
sha256 = "0h5qhrd984vf17qc227wz68191xfgbpq32dyhw0lcz2d9i0pl3xk"; sha256 = "1k49ymsi77366as2wi4kzv2f1xnbwpb47iw7iw07yxwlhmm7vskq";
}; };
packageRequires = [ emacs ]; packageRequires = [ emacs ];
meta = { meta = {
@ -2829,10 +2844,10 @@
elpaBuild { elpaBuild {
pname = "pyim"; pname = "pyim";
ename = "pyim"; ename = "pyim";
version = "3.7.5"; version = "3.7.6";
src = fetchurl { src = fetchurl {
url = "https://elpa.gnu.org/packages/pyim-3.7.5.tar"; url = "https://elpa.gnu.org/packages/pyim-3.7.6.tar";
sha256 = "09f34wgzckbxgr5xvaqrj0wdcmnfsb31a6m460f5g0acys20ams5"; sha256 = "1crimmvyppjmds9shfvxy9j5zi3mk133bv5av0fgicm7ddkivksr";
}; };
packageRequires = [ async emacs xr ]; packageRequires = [ async emacs xr ];
meta = { meta = {
@ -3955,10 +3970,10 @@
elpaBuild { elpaBuild {
pname = "vertico"; pname = "vertico";
ename = "vertico"; ename = "vertico";
version = "0.8"; version = "0.10";
src = fetchurl { src = fetchurl {
url = "https://elpa.gnu.org/packages/vertico-0.8.tar"; url = "https://elpa.gnu.org/packages/vertico-0.10.tar";
sha256 = "1cdq49csd57vqhrs1nbif79yw4s8c0p2i2ww5n5znzj7rnxwpva4"; sha256 = "07bzhxgp3k6q4wl9ijhx4vg8diinn782xhr8axn790a5vj199j78";
}; };
packageRequires = [ emacs ]; packageRequires = [ emacs ];
meta = { meta = {

View file

@ -5,8 +5,9 @@
To update the list of packages from MELPA, To update the list of packages from MELPA,
1. Run `./update-elpa`. 1. Run `./update-elpa`.
2. Check for evaluation errors: `nix-instantiate ../../../.. -A emacs.pkgs.elpaPackages`. 2. Check for evaluation errors:
3. `git commit -m "elpa-packages $(date -Idate)" -- elpa-generated.nix` `nix-instantiate ../../../../../ -A emacs.pkgs.elpaPackages`.
3. Run `git commit -m "elpa-packages $(date -Idate)" -- elpa-generated.nix`
## Update from overlay ## Update from overlay
@ -15,8 +16,8 @@ Alternatively, run the following command:
./update-from-overlay ./update-from-overlay
It will update both melpa and elpa packages using It will update both melpa and elpa packages using
https://github.com/nix-community/emacs-overlay. It's almost https://github.com/nix-community/emacs-overlay. It's almost instantenous and
instantenous and formats commits for you. formats commits for you.
*/ */
@ -30,7 +31,7 @@ self: let
}); });
}; };
elpaBuild = import ../../../build-support/emacs/elpa.nix { elpaBuild = import ../../../../build-support/emacs/elpa.nix {
inherit lib stdenv texinfo writeText; inherit lib stdenv texinfo writeText;
inherit (self) emacs; inherit (self) emacs;
}; };

View file

@ -1,5 +1,5 @@
let let
pkgs = import ../../../.. { }; pkgs = import ../../../../.. { };
src = pkgs.fetchgit { src = pkgs.fetchgit {
url = "https://github.com/ttuegel/emacs2nix.git"; url = "https://github.com/ttuegel/emacs2nix.git";

View file

@ -211,13 +211,19 @@
# From old emacsPackages (pre emacsPackagesNg) # From old emacsPackages (pre emacsPackagesNg)
cedet = callPackage ./cedet { }; cedet = callPackage ./cedet { };
cedille = callPackage ./cedille { cedille = pkgs.cedille; }; cedille = callPackage ./cedille { cedille = pkgs.cedille; };
colorThemeSolarized = callPackage ./color-theme-solarized { }; color-theme-solarized = callPackage ./color-theme-solarized { };
emacsSessionManagement = callPackage ./session-management-for-emacs { }; session-management-for-emacs = callPackage ./session-management-for-emacs { };
hsc3-mode = callPackage ./hsc3 { }; hsc3-mode = callPackage ./hsc3 { };
ido-ubiquitous = callPackage ./ido-ubiquitous { }; ido-ubiquitous = callPackage ./ido-ubiquitous { };
prolog-mode = callPackage ./prolog { }; prolog-mode = callPackage ./prolog { };
rectMark = callPackage ./rect-mark { }; rect-mark = callPackage ./rect-mark { };
sunriseCommander = callPackage ./sunrise-commander { }; sunrise-commander = callPackage ./sunrise-commander { };
# camelCase aliases for some of the kebab-case expressions above
colorThemeSolarized = color-theme-solarized;
emacsSessionManagement = session-management-for-emacs;
rectMark = rect-mark;
sunriseCommander = sunrise-commander;
# Legacy aliases, these try to mostly map to melpa stable because it's # Legacy aliases, these try to mostly map to melpa stable because it's
# closer to the old outdated package infra. # closer to the old outdated package infra.

View file

@ -4,11 +4,11 @@
To update the list of packages from MELPA, To update the list of packages from MELPA,
1. Run ./update-melpa 1. Run `./update-melpa`
2. Check for evaluation errors: 2. Check for evaluation errors:
env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../ -A emacs.pkgs..melpaStablePackages env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../../ -A emacs.pkgs.melpaStablePackages
env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../ -A emacs.pkgs..melpaPackages env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../../ -A emacs.pkgs.melpaPackages
3. `git commit -m "melpa-packages: $(date -Idate)" recipes-archive-melpa.json` 3. Run `git commit -m "melpa-packages: $(date -Idate)" recipes-archive-melpa.json`
## Update from overlay ## Update from overlay
@ -17,8 +17,8 @@ Alternatively, run the following command:
./update-from-overlay ./update-from-overlay
It will update both melpa and elpa packages using It will update both melpa and elpa packages using
https://github.com/nix-community/emacs-overlay. It's almost https://github.com/nix-community/emacs-overlay. It's almost instantenous and
instantenous and formats commits for you. formats commits for you.
*/ */

View file

@ -4,10 +4,10 @@
elpaBuild { elpaBuild {
pname = "org"; pname = "org";
ename = "org"; ename = "org";
version = "20210510"; version = "20210519";
src = fetchurl { src = fetchurl {
url = "https://orgmode.org/elpa/org-20210510.tar"; url = "https://orgmode.org/elpa/org-20210519.tar";
sha256 = "015c68pk52vksar7kpyb0nkcyjihlczmpq4h5vdv8xayas2qlzc7"; sha256 = "14vchfg69wai1yxv1fzvjk185gnfr7d9qrdijf0qmbbr5znci8rf";
}; };
packageRequires = []; packageRequires = [];
meta = { meta = {
@ -19,10 +19,10 @@
elpaBuild { elpaBuild {
pname = "org-plus-contrib"; pname = "org-plus-contrib";
ename = "org-plus-contrib"; ename = "org-plus-contrib";
version = "20210510"; version = "20210519";
src = fetchurl { src = fetchurl {
url = "https://orgmode.org/elpa/org-plus-contrib-20210510.tar"; url = "https://orgmode.org/elpa/org-plus-contrib-20210519.tar";
sha256 = "0pdwjnpcsk75jv4qs8n4xia6vspwn6dndbdx9z7kq5vqz7w4ykmw"; sha256 = "0g765fsc7ssn779xnhjzrxy1sz5b019h7dk1q26yk2w6i540ybfl";
}; };
packageRequires = []; packageRequires = [];
meta = { meta = {

View file

@ -5,8 +5,8 @@
To update the list of packages from Org (ELPA), To update the list of packages from Org (ELPA),
1. Run `./update-org`. 1. Run `./update-org`.
2. Check for evaluation errors: `nix-instantiate ../../../.. -A emacs.pkgs.orgPackages`. 2. Check for evaluation errors: `nix-instantiate ../../../../.. -A emacs.pkgs.orgPackages`.
3. `git commit -m "org-packages $(date -Idate)" -- org-generated.nix` 3. Run `git commit -m "org-packages $(date -Idate)" -- org-generated.nix`
*/ */

View file

@ -8,14 +8,14 @@ export NIXPKGS_ALLOW_BROKEN=1
# You can use this to avoid running lengthy code generation jobs locally # You can use this to avoid running lengthy code generation jobs locally
curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/elpa/elpa-generated.nix curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/elpa/elpa-generated.nix
nix-instantiate ../../../.. -A emacs.pkgs.elpaPackages --show-trace nix-instantiate ../../../../../ -A emacs.pkgs.elpaPackages --show-trace
git diff --exit-code elpa-generated.nix > /dev/null || git commit -m "emacs.pkgs.elpa-packages: $(date --iso)" -- elpa-generated.nix git diff --exit-code elpa-generated.nix > /dev/null || git commit -m "emacs.pkgs.elpa-packages: $(date --iso)" -- elpa-generated.nix
curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/org/org-generated.nix curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/org/org-generated.nix
nix-instantiate ../../../.. -A emacs.pkgs.orgPackages --show-trace nix-instantiate ../../../../../ -A emacs.pkgs.orgPackages --show-trace
git diff --exit-code org-generated.nix > /dev/null || git commit -m "emacs.pkgs.org-packages: $(date --iso)" -- org-generated.nix git diff --exit-code org-generated.nix > /dev/null || git commit -m "emacs.pkgs.org-packages: $(date --iso)" -- org-generated.nix
curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/melpa/recipes-archive-melpa.json curl -s -O https://raw.githubusercontent.com/nix-community/emacs-overlay/master/repos/melpa/recipes-archive-melpa.json
nix-instantiate --show-trace ../../../../ -A emacs.pkgs.melpaStablePackages nix-instantiate --show-trace ../../../../../ -A emacs.pkgs.melpaStablePackages
nix-instantiate --show-trace ../../../../ -A emacs.pkgs.melpaPackages nix-instantiate --show-trace ../../../../../ -A emacs.pkgs.melpaPackages
git diff --exit-code recipes-archive-melpa.json > /dev/null || git commit -m "emacs.pkgs.melpa-packages: $(date --iso)" -- recipes-archive-melpa.json git diff --exit-code recipes-archive-melpa.json > /dev/null || git commit -m "emacs.pkgs.melpa-packages: $(date --iso)" -- recipes-archive-melpa.json

View file

@ -1,5 +1,5 @@
let let
pkgs = import ../../../.. {}; pkgs = import ../../../../.. {};
emacsEnv = pkgs.emacs.pkgs.withPackages (epkgs: let emacsEnv = pkgs.emacs.pkgs.withPackages (epkgs: let

View file

@ -0,0 +1,117 @@
{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, python3, perl, bison
, texinfo, desktop-file-utils, wrapGAppsHook, docbook2x, docbook-xsl-nons
, inform7, gettext, libossp_uuid, gtk3, gobject-introspection, vala, gtk-doc
, webkitgtk, gtksourceview3, gspell, libxml2, goocanvas2, libplist, glib
, gst_all_1 }:
# Neither gnome-inform7 nor its dependencies ratify and chimara have tagged releases in the GTK3 branch yet.
let
ratify = (stdenv.mkDerivation {
pname = "ratify";
version = "unstable-2021-02-21";
src = fetchFromGitHub {
owner = "ptomato";
repo = "ratify";
rev = "f4d2d60ec73d5588e953650b3879e69a727f30ca";
sha256 = "eRh/9pYvdfbdbdJQ7pYMLq5p91I+rtyb/AqEGfakjKs=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
docbook2x
docbook-xsl-nons
];
buildInputs = [
gtk3
gobject-introspection
vala gtk-doc
wrapGAppsHook
];
});
chimara = (stdenv.mkDerivation {
pname = "chimara";
version = "unstable-2021-04-06";
src = fetchFromGitHub {
owner = "chimara";
repo = "Chimara";
rev = "9934b142af508c75c0f1eed597990f39495b1af4";
sha256 = "aRz1XX8XaSLTBIrMIIMS3QNMm6Msi+slrZ6+KYlyRMo=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
perl
bison
texinfo
python3
glib
wrapGAppsHook
];
buildInputs = [
gtk3
gobject-introspection
vala
gtk-doc
gst_all_1.gstreamer
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
gst_all_1.gst-plugins-bad
glib
];
preConfigure = ''
patchShebangs build-aux/meson_post_install.py
'';
});
in stdenv.mkDerivation {
pname = "gnome-inform7";
version = "unstable-2021-04-06";
src = fetchFromGitHub {
owner = "ptomato";
repo = "gnome-inform7";
# build from revision in the GTK3 branch as mainline requires webkit-1.0
rev = "c37e045c159692aae2e4e79b917e5f96cfefa66a";
sha256 = "Q4xoITs3AYXhvpWaABRAvJaUWTtUl8lYQ1k9zX7FrNw=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
inform7
python3
desktop-file-utils
wrapGAppsHook
];
buildInputs = [
gettext
libossp_uuid
gtk3
gtksourceview3
gspell
webkitgtk
libxml2
goocanvas2
libplist
ratify
chimara
];
preConfigure = ''
cp ${inform7}/libexec/ni ./src/ni
patchShebangs build-aux/* src/generate-resource-xml.{py,sh}
'';
meta = with lib; {
description = "Inform 7 for the Gnome platform";
longDescription = ''
This version of Inform 7 for the Gnome platform was created by Philip Chimento, based on a design by Graham Nelson and Andrew Hunter.
'';
homepage = "https://github.com/ptomato/gnome-inform7";
license = licenses.gpl3Only;
maintainers = [ maintainers.fitzgibbon ];
platforms = platforms.linux;
};
}

View file

@ -1,6 +1,6 @@
{ lib, stdenv, makeDesktopItem, fetchurl, unzip { lib, stdenv, makeDesktopItem, fetchurl, unzip
, gdk-pixbuf, glib, gtk3, atk, at-spi2-atk, pango, cairo, freetype, fontconfig, dbus, nss, nspr, alsaLib, cups, expat, udev, gnome , gdk-pixbuf, glib, gtk3, atk, at-spi2-atk, pango, cairo, freetype, fontconfig, dbus, nss, nspr, alsaLib, cups, expat, udev, gnome
, xorg, mozjpeg, makeWrapper, wrapGAppsHook, libuuid, at-spi2-core, libdrm, mesa , xorg, mozjpeg, makeWrapper, wrapGAppsHook, libuuid, at-spi2-core, libdrm, mesa, libxkbcommon
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
@ -33,6 +33,8 @@ stdenv.mkDerivation rec {
udev udev
libX11 libX11
libxcb libxcb
libxshmfence
libxkbcommon
libXi libXi
libXcursor libXcursor
libXdamage libXdamage

View file

@ -22,6 +22,7 @@
, qtgraphicaleffects , qtgraphicaleffects
, qtmultimedia , qtmultimedia
, qtx11extras , qtx11extras
, breeze-icons
, sshfs , sshfs
}: }:
@ -47,6 +48,8 @@ mkDerivation {
qtgraphicaleffects qtgraphicaleffects
qtmultimedia qtmultimedia
qtx11extras qtx11extras
# otherwise buttons are blank on non-kde
breeze-icons
]; ];
nativeBuildInputs = [ extra-cmake-modules kdoctools makeWrapper ]; nativeBuildInputs = [ extra-cmake-modules kdoctools makeWrapper ];

View file

@ -2,76 +2,112 @@
, stdenv , stdenv
, fetchurl , fetchurl
, makeWrapper , makeWrapper
, electron_11 , alsaLib
, openssl , at-spi2-atk
, at-spi2-core
, atk
, cairo
, cups
, dbus
, expat
, gdk-pixbuf
, glib
, gtk3
, libX11
, libXcomposite
, libXdamage
, libXext
, libXfixes
, libXrandr
, libdrm
, libxcb
, libxkbcommon
, libxshmfence
, mesa
, nspr
, nss
, pango
, systemd
, xdg-utils
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "1password"; pname = "1password";
version = "8.0.33-53.BETA"; version = "8.0.34";
src = fetchurl { src = fetchurl {
url = "https://downloads.1password.com/linux/tar/beta/x86_64/1password-${version}.x64.tar.gz"; url = "https://downloads.1password.com/linux/tar/stable/x86_64/1password-${version}.x64.tar.gz";
hash = "sha256-YUYER+UiM1QEDgGl0P9bIT65YVacUnuGtQVkV91teEU="; sha256 = "0mp119v5vgsva7pnxpsbq4xhh4vbhwv7ga9b5b7f6slx3biy1wmh";
}; };
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];
dontConfigure = true; dontConfigure = true;
dontBuild = true; dontBuild = true;
dontPatchELF = true;
installPhase = let installPhase =
runtimeLibs = [ let rpath = lib.makeLibraryPath [
openssl.out alsaLib
stdenv.cc.cc at-spi2-atk
]; at-spi2-core
in '' atk
mkdir -p $out/bin $out/share/1password cairo
cups
dbus
expat
gdk-pixbuf
glib
gtk3
libX11
libXcomposite
libXdamage
libXext
libXfixes
libXrandr
libdrm
libxcb
libxkbcommon
libxshmfence
mesa
nspr
nss
pango
systemd
] + ":${stdenv.cc.cc.lib}/lib64";
in ''
runHook preInstall
# Applications files. mkdir -p $out/bin $out/share/1password
cp -a {locales,resources} $out/share/${pname} cp -a * $out/share/1password
install -Dm0755 -t $out/share/${pname} {1Password-BrowserSupport,1Password-KeyringHelper}
# Desktop file. # Desktop file
install -Dt $out/share/applications resources/${pname}.desktop install -Dt $out/share/applications resources/${pname}.desktop
substituteInPlace $out/share/applications/${pname}.desktop \ substituteInPlace $out/share/applications/${pname}.desktop \
--replace 'Exec=/opt/1Password/${pname}' 'Exec=${pname}' --replace 'Exec=/opt/1Password/${pname}' 'Exec=${pname}'
# Icons. # Icons
cp -a resources/icons $out/share cp -a resources/icons $out/share
# Wrap the application with Electron. interp="$(cat $NIX_CC/nix-support/dynamic-linker)"
makeWrapper "${electron_11}/bin/electron" "$out/bin/${pname}" \ patchelf --set-interpreter $interp $out/share/1password/{1password,1Password-BrowserSupport,1Password-KeyringHelper}
--add-flags "$out/share/${pname}/resources/app.asar" \ patchelf --set-rpath ${rpath}:$out/share/1password $out/share/1password/{1password,1Password-BrowserSupport,1Password-KeyringHelper}
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}" for file in $(find $out -type f -name \*.so\* ); do
patchelf --set-rpath ${rpath}:$out/share/1password $file
done
# Set the interpreter for the helper binaries and wrap them with makeWrapper $out/share/1password/1password $out/bin/1password \
# the runtime libraries. --prefix PATH : ${xdg-utils}/bin
interp="$(cat $NIX_CC/nix-support/dynamic-linker)"
patchelf --set-interpreter $interp \
$out/share/$pname/{1Password-BrowserSupport,1Password-KeyringHelper}
wrapProgram $out/share/${pname}/1Password-BrowserSupport \ runHook postInstall
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}" '';
wrapProgram $out/share/${pname}/1Password-KeyringHelper \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}"
'';
passthru.updateScript = ./update.sh; passthru.updateScript = ./update.sh;
meta = with lib; { meta = with lib; {
description = "Multi-platform password manager"; description = "Multi-platform password manager";
longDescription = ''
1Password is a multi-platform package manager.
The Linux version is currently a development preview and can
only be used to search, view, and copy items. However items
cannot be created or edited.
'';
homepage = "https://1password.com/"; homepage = "https://1password.com/";
license = licenses.unfree; license = licenses.unfree;
maintainers = with maintainers; [ danieldk timstott ]; maintainers = with maintainers; [ danieldk timstott savannidgerinel ];
platforms = [ "x86_64-linux" ]; platforms = [ "x86_64-linux" ];
}; };
} }

View file

@ -11,13 +11,13 @@ assert x11Support -> xorg != null;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "bemenu"; pname = "bemenu";
version = "0.5.0"; version = "0.6.0";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Cloudef"; owner = "Cloudef";
repo = pname; repo = pname;
rev = version; rev = version;
sha256 = "1ifq5bk7782b9m6bl111x33fn38rpppdrww7hfavqia9a9gi2sl5"; sha256 = "sha256-yhUc1r7HulOUQvH7fLXaoJa0mKxJwyC3y59pnJcHUpk=";
}; };
nativeBuildInputs = [ pkg-config pcre ]; nativeBuildInputs = [ pkg-config pcre ];

View file

@ -3,11 +3,11 @@
mkDerivation rec { mkDerivation rec {
pname = "latte-dock"; pname = "latte-dock";
version = "0.9.11"; version = "0.9.12";
src = fetchurl { src = fetchurl {
url = "https://download.kde.org/stable/${pname}/${pname}-${version}.tar.xz"; url = "https://download.kde.org/stable/${pname}/${pname}-${version}.tar.xz";
sha256 = "0x7a93a7axsa0fzpbkkv1z722k9za4p51xcpzdpnh5ih1zij0csi"; sha256 = "sha256-srivjGnrEizLvph7AP/02dOsnMyTnL3a6f0xm8oGML4=";
name = "${pname}-${version}.tar.xz"; name = "${pname}-${version}.tar.xz";
}; };

View file

@ -2,16 +2,16 @@
buildGoModule rec { buildGoModule rec {
pname = "rmapi"; pname = "rmapi";
version = "0.0.13"; version = "0.0.15";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "juruen"; owner = "juruen";
repo = "rmapi"; repo = "rmapi";
rev = "v${version}"; rev = "v${version}";
sha256 = "0qq8x37p7yxhcp5d5xss3pv5186xgg0hd6lbkqivhy5yjsd54c7b"; sha256 = "sha256-ju54JSd3Zyye5YGLPEOkhY93ONh0b7eDSnvJlIawizE=";
}; };
vendorSha256 = "1pa75rjns1kknl2gmfprdzc3f2z8dk44jkz6dmf8f3prj0z7x88c"; vendorSha256 = "sha256-SE/0a8QUJsWoGwkSiZqYx1eXuOIL3avJujyg8iSdcBU=";
doCheck = false; doCheck = false;
@ -19,7 +19,7 @@ buildGoModule rec {
description = "A Go app that allows access to the ReMarkable Cloud API programmatically"; description = "A Go app that allows access to the ReMarkable Cloud API programmatically";
homepage = "https://github.com/juruen/rmapi"; homepage = "https://github.com/juruen/rmapi";
changelog = "https://github.com/juruen/rmapi/blob/v${version}/CHANGELOG.md"; changelog = "https://github.com/juruen/rmapi/blob/v${version}/CHANGELOG.md";
license = licenses.agpl3; license = licenses.agpl3Only;
maintainers = [ maintainers.nickhu ]; maintainers = [ maintainers.nickhu ];
}; };
} }

View file

@ -18,9 +18,9 @@
} }
}, },
"beta": { "beta": {
"version": "91.0.4472.57", "version": "91.0.4472.69",
"sha256": "1kbd5zyi5ndbln5pibdg3yhv65m84arfwfv4v00js3cbr13pyjzv", "sha256": "0yqc7py5x48wqg5x90j57vp07qfc20w1j0f30rmyxbgl6v346s0z",
"sha256bin64": "1bk30b9kn5bxp4yywdiy3dqd6km5q3rrf2z82kd1qyr9cc45hz8s", "sha256bin64": "1z82i6pq4wbx44d6ij32dkappywdpaxlfp23kl3p7x4x9hv1c0yq",
"deps": { "deps": {
"gn": { "gn": {
"version": "2021-04-06", "version": "2021-04-06",
@ -31,9 +31,9 @@
} }
}, },
"dev": { "dev": {
"version": "92.0.4503.0", "version": "92.0.4512.4",
"sha256": "1fp4xz6x80m3ipcy4myzazyy1yj95qamyl6wf38mk2i6302gi2gb", "sha256": "0ycwr11bz2hlzczs6cajxn5k32m44ndhmqh86iykcbi982dj7jq2",
"sha256bin64": "0fwq8rn3v1dijj9xh6z7jw3xx2ihq0qcyh3bbcdd066w5ny6padm", "sha256bin64": "0wv29rghcbin725qbl8cq20j8w5mlcjmjaqdcr73m753dv3jv8rq",
"deps": { "deps": {
"gn": { "gn": {
"version": "2021-05-07", "version": "2021-05-07",

View file

@ -1,6 +1,6 @@
{ lib, fetchurl, fetchzip, python3 { stdenv, lib, fetchurl, fetchzip, python3
, mkDerivationWith, wrapQtAppsHook, wrapGAppsHook, qtbase, qtwebengine, glib-networking , mkDerivationWith, wrapQtAppsHook, wrapGAppsHook, qtbase, qtwebengine, glib-networking
, asciidoc, docbook_xml_dtd_45, docbook_xsl, libxml2 , asciidoc, docbook_xml_dtd_45, docbook_xsl, libxml2, pipewire_0_2
, libxslt, gst_all_1 ? null , libxslt, gst_all_1 ? null
, withPdfReader ? true , withPdfReader ? true
, withMediaPlayback ? true , withMediaPlayback ? true
@ -31,12 +31,12 @@ let
in mkDerivationWith python3Packages.buildPythonApplication rec { in mkDerivationWith python3Packages.buildPythonApplication rec {
pname = "qutebrowser"; pname = "qutebrowser";
version = "2.2.1"; version = "2.2.2";
# the release tarballs are different from the git checkout! # the release tarballs are different from the git checkout!
src = fetchurl { src = fetchurl {
url = "https://github.com/qutebrowser/qutebrowser/releases/download/v${version}/${pname}-${version}.tar.gz"; url = "https://github.com/qutebrowser/qutebrowser/releases/download/v${version}/${pname}-${version}.tar.gz";
sha256 = "sha256-JHymxnNPdMsVma3TUKCS+iRCe9J7I0A6iISP5OXtJm8="; sha256 = "11vjp20gzmdjj09b7wxzn7ar6viih0bk76y618yqsyqqkffylmbq";
}; };
# Needs tox # Needs tox
@ -112,12 +112,16 @@ in mkDerivationWith python3Packages.buildPythonApplication rec {
done done
''; '';
preFixup = '' preFixup = let
libPath = lib.makeLibraryPath [ pipewire_0_2 ];
in
''
makeWrapperArgs+=( makeWrapperArgs+=(
"''${gappsWrapperArgs[@]}" "''${gappsWrapperArgs[@]}"
"''${qtWrapperArgs[@]}" "''${qtWrapperArgs[@]}"
--add-flags '--backend ${backend}' --add-flags '--backend ${backend}'
--set QUTE_QTWEBENGINE_VERSION_OVERRIDE "${lib.getVersion qtwebengine}" --set QUTE_QTWEBENGINE_VERSION_OVERRIDE "${lib.getVersion qtwebengine}"
${lib.optionalString (!stdenv.isDarwin && backend == "webengine") ''--prefix LD_LIBRARY_PATH : ${libPath}''}
) )
''; '';

View file

@ -2,13 +2,13 @@
buildGoModule rec { buildGoModule rec {
pname = "cloudflared"; pname = "cloudflared";
version = "2021.5.6"; version = "2021.5.9";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "cloudflare"; owner = "cloudflare";
repo = "cloudflared"; repo = "cloudflared";
rev = version; rev = version;
sha256 = "sha256-CwwdU5phnJGcSVXCoea3jZoSa9uoABJKL/Z1BsYUY1g="; sha256 = "sha256-Ojbn4QRNZWkSF9RUtFt7roGbt/6l5SFAqEXBCcTJvRI=";
}; };
vendorSha256 = null; vendorSha256 = null;

View file

@ -2,13 +2,13 @@
buildGoModule rec { buildGoModule rec {
pname = "helmsman"; pname = "helmsman";
version = "3.6.10"; version = "3.6.11";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Praqma"; owner = "Praqma";
repo = "helmsman"; repo = "helmsman";
rev = "v${version}"; rev = "v${version}";
sha256 = "sha256-0Epff1NYfZXza27/5RBuICIj2455K31BGFr6PMLkNVE="; sha256 = "sha256-9G/A6eADt9jP0CZC6MTZnQOmGOItJFI0zTfmC7HXSaI=";
}; };
vendorSha256 = "sha256-icX8mOc8g+DhfAjD1pzneLWTXY17lXyAjdPOWAxkHwI="; vendorSha256 = "sha256-icX8mOc8g+DhfAjD1pzneLWTXY17lXyAjdPOWAxkHwI=";

View file

@ -10,16 +10,16 @@
buildGoModule rec { buildGoModule rec {
pname = "nerdctl"; pname = "nerdctl";
version = "0.8.1"; version = "0.8.2";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "containerd"; owner = "containerd";
repo = pname; repo = pname;
rev = "v${version}"; rev = "v${version}";
sha256 = "sha256-Lu1LJ57jF4lMIfQn/zyT2cc/mkc3RPPlu4gI7qv8blI="; sha256 = "sha256-GPOrC9gL9lPv5SUldFxTS8ZT9YboPoDdqOAfwD0qGBQ=";
}; };
vendorSha256 = "sha256-fEzA/+iKye8lzH4JoXLPqnwjrXPPNuL8gPPbkYJ1glw="; vendorSha256 = "sha256-S3Gp7HkBIZNZ8rkp64XaUQUj1TggGwI9FMrVkyLCQWA=";
nativeBuildInputs = [ makeWrapper installShellFiles ]; nativeBuildInputs = [ makeWrapper installShellFiles ];

View file

@ -6,6 +6,6 @@
callPackage ./generic.nix { callPackage ./generic.nix {
inherit buildGoPackage nvidia_x11 nvidiaGpuSupport; inherit buildGoPackage nvidia_x11 nvidiaGpuSupport;
version = "1.0.5"; version = "1.0.6";
sha256 = "06l56fi4fhplvl8v0i88q18yh1hwwd12fngnrflb91janbyk6p4l"; sha256 = "1nzaw4014bndxv042dkxdj492b21r5v5f06vav2kr1azk4m9sf07";
} }

View file

@ -0,0 +1,11 @@
{ callPackage
, buildGoPackage
, nvidia_x11
, nvidiaGpuSupport
}:
callPackage ./generic.nix {
inherit buildGoPackage nvidia_x11 nvidiaGpuSupport;
version = "1.1.0";
sha256 = "0sz6blyxyxi5iq170s9v4nndb1hpz603z5ps2cxkdkaafal39767";
}

View file

@ -45,7 +45,8 @@ in mkYarnPackage rec {
# executable wrapper # executable wrapper
makeWrapper '${electron}/bin/electron' "$out/bin/${executableName}" \ makeWrapper '${electron}/bin/electron' "$out/bin/${executableName}" \
--add-flags "$out/share/element/electron" --add-flags "$out/share/element/electron" \
--set-default MOZ_DBUS_REMOTE 1
''; '';
# Do not attempt generating a tarball for element-web again. # Do not attempt generating a tarball for element-web again.

View file

@ -10,7 +10,7 @@
, cyrus_sasl , cyrus_sasl
, fetchFromGitLab , fetchFromGitLab
, fetchurl , fetchurl
, ffmpeg_3 , ffmpeg
, gdk-pixbuf , gdk-pixbuf
, glib , glib
, gnused , gnused
@ -87,7 +87,7 @@ mkDerivation rec {
bzrtp bzrtp
cairo cairo
cyrus_sasl cyrus_sasl
ffmpeg_3 ffmpeg
gdk-pixbuf gdk-pixbuf
glib glib
gtk2 gtk2

View file

@ -28,7 +28,7 @@ let
else ""); else "");
in stdenv.mkDerivation rec { in stdenv.mkDerivation rec {
pname = "signal-desktop"; pname = "signal-desktop";
version = "5.1.0"; # Please backport all updates to the stable channel. version = "5.2.0"; # Please backport all updates to the stable channel.
# All releases have a limited lifetime and "expire" 90 days after the release. # All releases have a limited lifetime and "expire" 90 days after the release.
# When releases "expire" the application becomes unusable until an update is # When releases "expire" the application becomes unusable until an update is
# applied. The expiration date for the current release can be extracted with: # applied. The expiration date for the current release can be extracted with:
@ -38,7 +38,7 @@ in stdenv.mkDerivation rec {
src = fetchurl { src = fetchurl {
url = "https://updates.signal.org/desktop/apt/pool/main/s/signal-desktop/signal-desktop_${version}_amd64.deb"; url = "https://updates.signal.org/desktop/apt/pool/main/s/signal-desktop/signal-desktop_${version}_amd64.deb";
sha256 = "1cirnnxy63jfkl98472k25bn1yp5apa7b5s74r42sxhlwzwkplw1"; sha256 = "0jvimpmz1d0pg9zpnyzm7a3g7vzapq62cphmvjhh67dxv5jih37k";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -2,6 +2,7 @@
, python3 , python3
, fetchFromGitHub , fetchFromGitHub
, glibcLocales , glibcLocales
, libnotify
}: }:
python3.pkgs.buildPythonApplication rec { python3.pkgs.buildPythonApplication rec {
@ -39,6 +40,10 @@ python3.pkgs.buildPythonApplication rec {
pytest-mock pytest-mock
]); ]);
makeWrapperArgs = [
"--prefix" "PATH" ":" (lib.makeBinPath [ libnotify ])
];
meta = with lib; { meta = with lib; {
description = "Zulip's official terminal client"; description = "Zulip's official terminal client";
homepage = "https://github.com/zulip/zulip-terminal"; homepage = "https://github.com/zulip/zulip-terminal";

View file

@ -1,665 +1,665 @@
{ {
version = "78.10.1"; version = "78.10.2";
sources = [ sources = [
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/af/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/af/thunderbird-78.10.2.tar.bz2";
locale = "af"; locale = "af";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "123eab708b32d19d703edc4305ef8310da70d3dea85bb679f6186c7a7df961db"; sha256 = "095f6e89aa3f1fcd2b2f92bb56777d10fa997dec6aa3098a3109511e2b07927b";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ar/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ar/thunderbird-78.10.2.tar.bz2";
locale = "ar"; locale = "ar";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "013a3676da9c77bf3d39d04d31c581cf355e60dacc2b10c487e92206ee96ea12"; sha256 = "2a4e1461f291711196ef0cc717824d364ddc35ef24e7fc202b05939c59e8409f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ast/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ast/thunderbird-78.10.2.tar.bz2";
locale = "ast"; locale = "ast";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "65cf0de5a101e071bad16efd1f25e41129e354149392318c7b8ddf0bda8221aa"; sha256 = "361e614c83311619ab64e61b1ade46b3f36093b7ba9c5d3fdd8046bb7e0e7f59";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/be/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/be/thunderbird-78.10.2.tar.bz2";
locale = "be"; locale = "be";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "9b9033cdbed84dc753bf29d1434dd26cdd454f7db37542209181d437e7c8ebf2"; sha256 = "f86b8494488b18c9892daaf6d4c62234bfd060b8313107c4a638862d94ba1950";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/bg/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/bg/thunderbird-78.10.2.tar.bz2";
locale = "bg"; locale = "bg";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "2fd581fddb48b766c5f791241bd62ca4f4ca85127291d05546c061756df7577d"; sha256 = "0f47d29aaa13aa5018f3cb28b10547586f22123f1cabc161610c83c60aa357eb";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/br/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/br/thunderbird-78.10.2.tar.bz2";
locale = "br"; locale = "br";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "92c262484f24580d5bae39f1a31a1ba82e801069b2873ea055853e877b057193"; sha256 = "ada5fba11311e356fc1b016728bb5c229e85f1900c0b102e3a392de4124c8022";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ca/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ca/thunderbird-78.10.2.tar.bz2";
locale = "ca"; locale = "ca";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "0350f707d7a57273ab5f5738f71f58b7b91e0ff5a472896c0684292c6bfd30f4"; sha256 = "6f74a52f34f9449fb1530f308b738b7af2854b1cc9a5301a1f771bf36e0bcbc7";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/cak/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/cak/thunderbird-78.10.2.tar.bz2";
locale = "cak"; locale = "cak";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "30b1cd9b0ca013391e51904a580b3afa6de26c459193c30cd9c812d9e265d9eb"; sha256 = "3fb516dce71d9e44ad509724a61c92f3d45cddf9c82f9fdf0f948fdbc2549583";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/cs/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/cs/thunderbird-78.10.2.tar.bz2";
locale = "cs"; locale = "cs";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "e504c2d8b0ac193f3e61251133ab0986c220cf7246db1798dbe58bd68760bc96"; sha256 = "47b70bdc716049edae3beffacef19dcab5abafc0b2f674f04980983d07ba6acd";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/cy/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/cy/thunderbird-78.10.2.tar.bz2";
locale = "cy"; locale = "cy";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "f315b888b0872dab6eb3bd7911cbe3e5099ad9185aa9af455a452dbf29af771f"; sha256 = "279b9a9190fc7033ee223b72b361d715f5f3ddc701c51bf18bd325b667450a12";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/da/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/da/thunderbird-78.10.2.tar.bz2";
locale = "da"; locale = "da";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "895c54f8471f38f1a2effe32ba3ba13c34c4fb03ff0e62df05d4ad82f7365976"; sha256 = "19340a3dcdec6ba26eb08c0a65cb0790bfa4c0ead09126fa8cdd2aa3cbb692dc";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/de/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/de/thunderbird-78.10.2.tar.bz2";
locale = "de"; locale = "de";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "9a5c84531b9dbc21c9ee8e6b1a136f69eac6f0082d5d5652c299dba62f4ac333"; sha256 = "09fb186c140013906af953729e7c42047c415e57b6a34562b7638f517ed5a03b";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/dsb/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/dsb/thunderbird-78.10.2.tar.bz2";
locale = "dsb"; locale = "dsb";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "c5c3394331c050584592fbb5aeadd50eb263dc06a1860a04e0219a93be1fb269"; sha256 = "12903ffe77c9e678b418ab5cfe76d3babd36aeef286a9976fd85f1051c2a2fd7";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/el/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/el/thunderbird-78.10.2.tar.bz2";
locale = "el"; locale = "el";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "4f2572854aa6b707b590cc89eb47db037e017dc10abcdd3117cc3b89f4a1ed0b"; sha256 = "74ac5f4175a6cacbcb9643761b022fe52cff03afe9754acb53effc1a5735cb7f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/en-CA/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/en-CA/thunderbird-78.10.2.tar.bz2";
locale = "en-CA"; locale = "en-CA";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "35e264330b4bd0ac78003ae7ef2636b24d6d0e88634d83d61df8eab379770795"; sha256 = "5a1be335a0a4534308bc6b3c8bee8c592475b7b2b65a070412c7cf44de0e183f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/en-GB/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/en-GB/thunderbird-78.10.2.tar.bz2";
locale = "en-GB"; locale = "en-GB";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "a9be984f78f892a4c79734108191277d5c4cf32672942d60bfb5a239a2d693c3"; sha256 = "da6b0e21275e49202cbbab6a85e4601550ba21b8de5535ef0e252df6d693a2c2";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/en-US/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/en-US/thunderbird-78.10.2.tar.bz2";
locale = "en-US"; locale = "en-US";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "0b16625e49f5f8bad3d3a01da8b2a3517ae8dbe6e6e91cac39d4f16bc7e11026"; sha256 = "3f35551b1bf9b588c7e16810312fe8274bd06283974913e881ca5e7b6035666d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/es-AR/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/es-AR/thunderbird-78.10.2.tar.bz2";
locale = "es-AR"; locale = "es-AR";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "25998ad4b812e092d940e7cfc18feb20f631d50d3e87319906324ccc701dbac7"; sha256 = "22e962bbd6d38f4eec50d31638bb7d895f2a7be1c626b42605bffb071328a468";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/es-ES/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/es-ES/thunderbird-78.10.2.tar.bz2";
locale = "es-ES"; locale = "es-ES";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "0330198edcae1661a5e02c6439ca3a4a02f0edfc7315b357c8f727050054324d"; sha256 = "2237c69f5b2bb8e0b975be18ec5413c46aacf6a8910120d90707909acd7b1e26";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/et/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/et/thunderbird-78.10.2.tar.bz2";
locale = "et"; locale = "et";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "5f85ddffa2116e7037a27cfd92dbd0ab97dbe33c82b821e02b5acedec44c1b72"; sha256 = "630f76686314f7214cc672a7b2f9d501cf34350dd5da5c8e03564e1debc1ff63";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/eu/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/eu/thunderbird-78.10.2.tar.bz2";
locale = "eu"; locale = "eu";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "00c53932fda84f5d73bc3b93f2f5ddc9c1aa9c40a1e5e6871195d5048d7106a8"; sha256 = "63c62c592f00c35f2489ca7806dd2861fd1179ad367ac14529dfe117b3050bae";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/fa/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/fa/thunderbird-78.10.2.tar.bz2";
locale = "fa"; locale = "fa";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "b978d8859b2c3b9f5094ceafc4dc2b910f8df49742a37fe7415b7357bf6efb58"; sha256 = "b750c02dfff907d6d530d4e7b481fbd9115c02fcd5eb22da6d76f163f2f66cf3";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/fi/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/fi/thunderbird-78.10.2.tar.bz2";
locale = "fi"; locale = "fi";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "bade37aaa4afaf883cb6d54aa4105cbfa722e1a6ec9e95841e97ee3c03466ea3"; sha256 = "fd385a85a1e28b75730ca8ca73181c5571a3ebbb51ae1c095bea8f174db3f37f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/fr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/fr/thunderbird-78.10.2.tar.bz2";
locale = "fr"; locale = "fr";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "881b2ab00ce556c2b9bd2b5f5f534e114dee48af09c3d1866a1c3291d9d2bf8f"; sha256 = "f0b8be6aa87f221262725785eee2a06b4bb0e191f2ce9350f40c6f62014272c9";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/fy-NL/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/fy-NL/thunderbird-78.10.2.tar.bz2";
locale = "fy-NL"; locale = "fy-NL";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "a8018a23a21eede12a935e13216803e334ae3c0c8479869dfcb601643ed64be7"; sha256 = "242760433a15d6509bcd617f82a2a3b2a27c34197420fafb02cc8bca17d0163b";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ga-IE/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ga-IE/thunderbird-78.10.2.tar.bz2";
locale = "ga-IE"; locale = "ga-IE";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "e51ba276a9a04a8e01cc181150af081f505327a480ce5c07ec73a3a5abaee38e"; sha256 = "5b21caf17170642158945dfaa383729226ace99f789b7ed7babb08ea98bdaf8d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/gd/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/gd/thunderbird-78.10.2.tar.bz2";
locale = "gd"; locale = "gd";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "29269a33a12b97c2e1fc61c91d2bd1023fcd928e1d468a47541eef01225d6bcc"; sha256 = "21b2d8d9107bcc4e4d0a453f9eace739e349c31d556672114fcc9ef7bc81e0ea";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/gl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/gl/thunderbird-78.10.2.tar.bz2";
locale = "gl"; locale = "gl";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "6f52cfa9d62815ab734912ff1af54339fc9e1301ef7176c147c2aa671b32f826"; sha256 = "32329f7d8f0256c0012ffd0d5a88f7abeff22d89adb6d1ffdaca05cb74a6a9e4";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/he/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/he/thunderbird-78.10.2.tar.bz2";
locale = "he"; locale = "he";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "9e244b035d8a029c71e974ac1c687c3a7677b647ea4640ab54e213d438785d13"; sha256 = "453f0348607ef24799f190ecae102ee35cf21212c3ee978ac275457177c5d91a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/hr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/hr/thunderbird-78.10.2.tar.bz2";
locale = "hr"; locale = "hr";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "948974ab152750153d8024f218c413e3a5544cc6c4ab34ba8cdc680020b2831c"; sha256 = "845dcc473833cc306dea211448a9719ab72daa57bf952e8260e28d5df616cd92";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/hsb/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/hsb/thunderbird-78.10.2.tar.bz2";
locale = "hsb"; locale = "hsb";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "24c89004b45ff5258ab156f61af0bba6e218a7f38bd2ba51816788684979995c"; sha256 = "179e106128bda04f3109e76023031e8441e174bacf4fc4f8976c7bce4be291f9";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/hu/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/hu/thunderbird-78.10.2.tar.bz2";
locale = "hu"; locale = "hu";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "f6f74ef48c55c86c8c06a785b8c9be8212ec6fd8d63e6e2f158c3b91c4ac04c0"; sha256 = "59901e6396d16776c281c83f3cace029b8b1f9171ce58918d9af86144ffbb576";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/hy-AM/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/hy-AM/thunderbird-78.10.2.tar.bz2";
locale = "hy-AM"; locale = "hy-AM";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "65cb2d13740ec0b46cd61292c065c76f82bb178f2ff016c7033c318bd72d5e66"; sha256 = "5bcde77ed1459713d8a33ccb34a003f3e863f53a6f4fe853d8a5982eca3d0cef";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/id/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/id/thunderbird-78.10.2.tar.bz2";
locale = "id"; locale = "id";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "d6a717a463ac5c46f4f094355e4eaff4068c9dcc05af2e2cbac2ebb33eb55643"; sha256 = "994e5971a0e269bb392f5b54b79ee58c42f222eb593c72a0515df5a12784a423";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/is/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/is/thunderbird-78.10.2.tar.bz2";
locale = "is"; locale = "is";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "c7d568cf58b980ac6fa59f5fa737fa18749318ee8c6c4d865bf4af6b277152e1"; sha256 = "725b7dc0b9528b868794cd94e1c845c2f9816825b8e3f8f6de466e84ddf02447";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/it/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/it/thunderbird-78.10.2.tar.bz2";
locale = "it"; locale = "it";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "2e38bf9742410212de3664e9eaa0f754e46b717666ca74bbdbb80e6b784948aa"; sha256 = "036516a7978eb98407e6ce97cbcb5c4269f0fe72ae2955dfab925812912be28d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ja/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ja/thunderbird-78.10.2.tar.bz2";
locale = "ja"; locale = "ja";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "472040ae9dc91d67c0a77f6470e450f964fdc125e4ebb66c90d3c68f31e45a06"; sha256 = "c9c05bb9423e4f72ef782322da54d5d6e2f751e3dea812dced5956cfbfe4f494";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ka/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ka/thunderbird-78.10.2.tar.bz2";
locale = "ka"; locale = "ka";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "7228703d3daf25bb665b9feb30d0410f856538f5b2e5728fcbaedff752bc1041"; sha256 = "75f096a651b8538f6565dc67158a9398d5c97799da708f12e7ad781c99aa458a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/kab/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/kab/thunderbird-78.10.2.tar.bz2";
locale = "kab"; locale = "kab";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "e111e139da66ad100c8206e028fbc02052cee95d26fc81b3d430735427f6d2ba"; sha256 = "edfe5788049f41860e958bc3f04c4b61c5199a1c1c969338d09218813e6dbbbf";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/kk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/kk/thunderbird-78.10.2.tar.bz2";
locale = "kk"; locale = "kk";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "db67cbc4e12f07447e66e84b1da7f0acddeafead130d584292057363497b5a8c"; sha256 = "e838db372ca7e93c69261883b0803baf076109192c0524fd7d159d4111eec76a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ko/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ko/thunderbird-78.10.2.tar.bz2";
locale = "ko"; locale = "ko";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "deeb43fe286b1d9138598bd2ed69566ac6c7f741392728619a6aba3d4792fecc"; sha256 = "b3245edbcd50e24f81804eef56246bc00112d7d2303633777ab29e4560ef7595";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/lt/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/lt/thunderbird-78.10.2.tar.bz2";
locale = "lt"; locale = "lt";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "edc1a1ea3767a305ca7cbcc5df371782af0f2f8776afbda8ac922d4ac34161c1"; sha256 = "60a8d3e6b634277c41bcc89287e2034ba41cf251d354209d2f7bfe01f7042258";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ms/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ms/thunderbird-78.10.2.tar.bz2";
locale = "ms"; locale = "ms";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "f18e4f2af944b153b853bd2cb7a2607ce1f0d32f3186e6afcbf837edd5335f57"; sha256 = "c39efc74560d6eab6183b4af517d6eb538a4e17b2a943e59b4d1760bf31f8259";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/nb-NO/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/nb-NO/thunderbird-78.10.2.tar.bz2";
locale = "nb-NO"; locale = "nb-NO";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "398743239797d93e611a6778ca9943eab1386f0e06256041554a4f63dc8d753d"; sha256 = "f663e884cad7ded824f03952a8c563e317dd5768962fb13e3e484cfdf2061e42";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/nl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/nl/thunderbird-78.10.2.tar.bz2";
locale = "nl"; locale = "nl";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "7c4af7dedabed5ecb598864df4c7a15ca7c0c3af39e11a8a4b02d502d40bc23b"; sha256 = "e4a48f5b5d3ea2310b0236f030086defb6c3e07c0cc21a1123979c31b5a7020e";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/nn-NO/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/nn-NO/thunderbird-78.10.2.tar.bz2";
locale = "nn-NO"; locale = "nn-NO";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "8f8aac240e51916491be8538fb9e3428b7e0e3248e4eea7be37da302930860e9"; sha256 = "5724f509e78558ba4f81b695e8ede6530ed11c355544a717791f21de2e9bd13a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/pa-IN/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/pa-IN/thunderbird-78.10.2.tar.bz2";
locale = "pa-IN"; locale = "pa-IN";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "0a5fb5d304ffecb3bae49c5e9fc5bed1015cae52f10395f7ccc98bf66b537f3b"; sha256 = "d0c0b1f7fdf8096f2b68361a2d0d50b96b763f4b06b59ad83299cd3a50fb64f4";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/pl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/pl/thunderbird-78.10.2.tar.bz2";
locale = "pl"; locale = "pl";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "491f72dc04af30e1218a0ec739685ba759935aaeb82001493725e46aceb374aa"; sha256 = "a6960122b0a16afb23151039da5b815e3fa49924459a7e2977c5a6ed757456a2";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/pt-BR/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/pt-BR/thunderbird-78.10.2.tar.bz2";
locale = "pt-BR"; locale = "pt-BR";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "fc5d479cf49b560199d0bcee2991cf49d291facda232ed062f2d5d7c38ffab8e"; sha256 = "8cda6290381759cf776d0d3d8ce5df1fb5e9eb646fb0d2c6d294e04bc11548ba";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/pt-PT/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/pt-PT/thunderbird-78.10.2.tar.bz2";
locale = "pt-PT"; locale = "pt-PT";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "46dc8b9f65cce9b85fc7c5069f190ba880b82ddeaabab841d69b7eb2aba01b9a"; sha256 = "ee722a15adc1091789655fbd1acfb73bc607853ccb9eeb19c02aa1a0af7c27fc";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/rm/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/rm/thunderbird-78.10.2.tar.bz2";
locale = "rm"; locale = "rm";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "03a978808d1d8e9a2672e62d68e5d0fb31ed0813e7e7535f406c81f680998a4b"; sha256 = "b9995a75cf4b874060974e8418f26ff2bdc6c5e620d55d36ff856a3b0415a9ae";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ro/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ro/thunderbird-78.10.2.tar.bz2";
locale = "ro"; locale = "ro";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "4b499349e7a4fedf1338725055aaf2a6b92b371bf6c578da600d066ff3abcd3b"; sha256 = "078033f2d95dbf736d1f52da07c8b373b8d9f76cb1054495f9c2b9b39da56b4e";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/ru/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/ru/thunderbird-78.10.2.tar.bz2";
locale = "ru"; locale = "ru";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "a32b65ce9e3d8fd3b9081db3a5c809f3605789b44d816870556ce2916b33c28e"; sha256 = "1c29d7ef67161430f392ed02e3344e136ca16199cef14df75af472c096e94f4a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/si/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/si/thunderbird-78.10.2.tar.bz2";
locale = "si"; locale = "si";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "8fb707bb227df1e1ffc50c2ec49bc594c553a62184a2cbf9adc1a33f6662721c"; sha256 = "67829f91431cbfb1213fb9c7e70b4dcd25b4c2e0b3b433e466684ae582e583b5";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/sk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/sk/thunderbird-78.10.2.tar.bz2";
locale = "sk"; locale = "sk";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "fc16b583acc017e9f15ec62679a224c6e00b4050579ed152ceeaccfc167fa2ee"; sha256 = "73d935c1b4f8e353a3aaffedbbe91a34c3ef09e10de8526fb1aeb857640bfb4f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/sl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/sl/thunderbird-78.10.2.tar.bz2";
locale = "sl"; locale = "sl";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "15b18b2e66e4a32784b9b995f33c37d776ee6c2600c8f435412f29a684b8cf4c"; sha256 = "0686fcf2458572e3be774b1a18400d649bb8618910b3d92ea20a0111a2373dc3";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/sq/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/sq/thunderbird-78.10.2.tar.bz2";
locale = "sq"; locale = "sq";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "1d2803e42b7f06c93f39eda2fd4a5d1852daacdf4def8c931d831686b7ef2d80"; sha256 = "b3245baa380a84916021643cba7dedaf8c4b030df87ad358b03f245478cc3a84";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/sr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/sr/thunderbird-78.10.2.tar.bz2";
locale = "sr"; locale = "sr";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "d79178b3cf04f47a036d59dda8b651a557a410570f8fbd4de960ac57897e9495"; sha256 = "8436ecac0bbac402c24fe75ee94272d8cef563f31dbf52027bb6c429df3d52c9";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/sv-SE/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/sv-SE/thunderbird-78.10.2.tar.bz2";
locale = "sv-SE"; locale = "sv-SE";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "041dd7b59f7f348fca03f03916b5597130f7aa7d4bb58d4653c95865bf4bec9f"; sha256 = "288ccc7ba5040126801af4fc9a19a44e6498a034fbc483ae8bd626b8c11e0fa1";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/th/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/th/thunderbird-78.10.2.tar.bz2";
locale = "th"; locale = "th";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "cb0ac45cd8dbe4764d2b8bed8e9b142bedd65e8af37d7d2920321999b93af80f"; sha256 = "c59e1b0cddf5b65690acbcbf7a23c08db290bf953eafc0cc7c1a8f6ed6da5312";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/tr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/tr/thunderbird-78.10.2.tar.bz2";
locale = "tr"; locale = "tr";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "d60998502a3281a3a483f122406b7c01361e9a3a6d006e435e120ee766f19e31"; sha256 = "a0c894db24906ce1b4386acf404feb212103ae5d1ddab7c2e2b77a0903a133c8";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/uk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/uk/thunderbird-78.10.2.tar.bz2";
locale = "uk"; locale = "uk";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "0d41350382c75c0da6bd0644eee39808ed88b1b23dfd476be9cd8a122ab1e1f4"; sha256 = "4ed5efc42866fe755a62a84a74a6f7535e50561fe3ab6d54b9765b0da93229a6";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/uz/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/uz/thunderbird-78.10.2.tar.bz2";
locale = "uz"; locale = "uz";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "8b82aae5f995b378a107a252f13256b13c0d4aeafa4ce0c8fc7d7b104c1212be"; sha256 = "690a6d3b774be3f4cdb8468e191de18fcc1ffce06046c32f25207732d16da1b5";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/vi/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/vi/thunderbird-78.10.2.tar.bz2";
locale = "vi"; locale = "vi";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "240b29a8101fafc4ecbd11f26986a65aa1192fe030a39669e4f422b239d7165d"; sha256 = "30971dab3bf4e13665d779d83bff7ee0ca9bc126d57f446f7472c8bd5ba490ee";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/zh-CN/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/zh-CN/thunderbird-78.10.2.tar.bz2";
locale = "zh-CN"; locale = "zh-CN";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "fe8a09d310b2a96936e7f9594dccddd557bdacca7bfba1d7dc4d273c9ceccd0c"; sha256 = "00cba2ab030699fe429d138dd572fcad5c4aaf6236f5e6ff8659fe577c27aff3";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-x86_64/zh-TW/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-x86_64/zh-TW/thunderbird-78.10.2.tar.bz2";
locale = "zh-TW"; locale = "zh-TW";
arch = "linux-x86_64"; arch = "linux-x86_64";
sha256 = "c1d555e2f2ffa1239151eed66c8b5d58d822814933b7a3577c2e03883535c950"; sha256 = "4eb969ea56666f12804dd7c63f5872be4c0194d10335a52dbbb041c5c18d3e53";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/af/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/af/thunderbird-78.10.2.tar.bz2";
locale = "af"; locale = "af";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "dfe40c9c111c48cd4d8a832ec6a6922325bf0ebb0384e9457df3f7e55be0deaf"; sha256 = "8484971834097887f0b2f61286fcb14fa1f60bbd25d4d54f6ef5b390a9eedd64";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ar/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ar/thunderbird-78.10.2.tar.bz2";
locale = "ar"; locale = "ar";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "7c49064bb7c8f20e6594b2925ff3bb09a33da65fde53684d314292433caa735a"; sha256 = "345546bf8da50e507c8205cdd9e933e1bec524080f9c4c439c26a1e55ba8e22f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ast/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ast/thunderbird-78.10.2.tar.bz2";
locale = "ast"; locale = "ast";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "b41a2cf4592a25398e8f82dad92c302e56cf1cac9fcd0bd7144d9ffc7fc6a8da"; sha256 = "d11e78aa384af2e11a6ecb41d82f0fbc1d1b4b19d137ff9ac15f8858dfa0a3f9";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/be/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/be/thunderbird-78.10.2.tar.bz2";
locale = "be"; locale = "be";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "2e5085779f3daba1c6c49c00eb0a507c7f4142b151cb3dd8a7802aba38e2bb5e"; sha256 = "c99b7cb728432c4d8d5281206e7a72757621066d2403fe9d2305ce9f40635a46";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/bg/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/bg/thunderbird-78.10.2.tar.bz2";
locale = "bg"; locale = "bg";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "a5f0d0971dcf689b1b2bec001f431dc04a506236323eeb8196d03a5738c8a663"; sha256 = "e8a6e2e53757a27954728c87a23f1631148d9391118d16cde1a8eef31c641317";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/br/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/br/thunderbird-78.10.2.tar.bz2";
locale = "br"; locale = "br";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "2b499965f20ca7177220c089d531f3222d26b3bdf46d551eb69402632e185976"; sha256 = "65c138cc97aa673c8a44f7faadf3f31524ea71a1e5b8ad9d5cad7c0c9fcb39f7";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ca/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ca/thunderbird-78.10.2.tar.bz2";
locale = "ca"; locale = "ca";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "126afa2a6bb7dd5241421ef5d7459ae711e897be7f92b205d06028bb7c81a5f3"; sha256 = "0eaffda4000d85a5f369c3be6edc9561c54047def9d8790af0195bf3fa7f85da";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/cak/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/cak/thunderbird-78.10.2.tar.bz2";
locale = "cak"; locale = "cak";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "ebc6e8bafc188374705aaee27bbef9af62dbf2dcdbf0439871c87ab152be4914"; sha256 = "0765345951e7a3c4604ba633f7e029cbad2af783e72325147c4a1e48a5cb65bf";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/cs/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/cs/thunderbird-78.10.2.tar.bz2";
locale = "cs"; locale = "cs";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "b5f2e43c78a65d841e3d393b9d6353d01aee585ea02537ef97f0e49d83f6b620"; sha256 = "2c254e630288415de40276ef6e4d59bdd677568a4f24629136e36938fd03563c";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/cy/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/cy/thunderbird-78.10.2.tar.bz2";
locale = "cy"; locale = "cy";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "15e48422ea4ed918aefc843aba0508e8bc5089b18eed1af09ad318877f487d0d"; sha256 = "ce71a9c112876c4ff47c09e5feb39dbb3ed2c002c79abef8383735e9d74c5c9c";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/da/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/da/thunderbird-78.10.2.tar.bz2";
locale = "da"; locale = "da";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "8b535597f724ad521b6e0fed9cabf24b1eaa6a4fbf133ddf2f6f8445ebf96461"; sha256 = "644d65f2245f51c0ec992554e87223db813d121973c76141f6b0a121b9a278e2";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/de/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/de/thunderbird-78.10.2.tar.bz2";
locale = "de"; locale = "de";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "079236278b9ee50fc7ecf709c6fa8d918f2b0e7b5523bc0fc40796fe346d583d"; sha256 = "422274c487c76579600ab0c00b815e079a0225a6e87b2a8c9b2e2e93f252e080";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/dsb/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/dsb/thunderbird-78.10.2.tar.bz2";
locale = "dsb"; locale = "dsb";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "6e2e527b72a4e957cea44f02cac6dcca3d1ed98477c658d0cfad201eacf789ca"; sha256 = "5c3676f8ce30fe42f0dcfb0ef8d793929527bef0d62e5014e48116ec583670ac";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/el/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/el/thunderbird-78.10.2.tar.bz2";
locale = "el"; locale = "el";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "737ec7a65bf6e97463d755852de041b26836b521d498b6f1245a8349991d336d"; sha256 = "94a3af4bc068b7bd7d3ef8e649dcd95a5db30aa4906b0702911ffb837b02ba23";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/en-CA/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/en-CA/thunderbird-78.10.2.tar.bz2";
locale = "en-CA"; locale = "en-CA";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "57609382e4a11251305cbeee549cddb87ba6f6fdc57e75733a1114b431e085dd"; sha256 = "8be631960ed39fdfb5d97f550a1be0d0de2bd237ad80162dc580cac17c79d190";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/en-GB/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/en-GB/thunderbird-78.10.2.tar.bz2";
locale = "en-GB"; locale = "en-GB";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "6c61127aced3bf35f205a9b22f9b4ef4bcbf7dbc0f63becda8538275e12fcbc9"; sha256 = "991b14eb38814c70170e3404d5e659c00504c4792ed104d86097a71542ad0f0d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/en-US/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/en-US/thunderbird-78.10.2.tar.bz2";
locale = "en-US"; locale = "en-US";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "e05836a368c62f24d42d0c2c35e1f6364a1f21fe61031f8e71c5801e75294190"; sha256 = "ab8487bfd03b26dea36db6da1e59294322392365da9cd6f13e2b454b07f9d77d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/es-AR/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/es-AR/thunderbird-78.10.2.tar.bz2";
locale = "es-AR"; locale = "es-AR";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "0a8b878de32ccc4e5af0eff23ded1b59c655c3e982df99fb6ae053ed62ce82b0"; sha256 = "4e7c1248cdaf72d98a41738dee2e1c95b7e1be68beaee0eb41b0184cda8f75c2";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/es-ES/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/es-ES/thunderbird-78.10.2.tar.bz2";
locale = "es-ES"; locale = "es-ES";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "0e0ee036ebc21f67ce574b810f9a0a903eb987b8290848cb44fb0bdf33d316c4"; sha256 = "af2c06a28cf1272d692f0a7d652716cc7419f92c069b828c3ceaae0b6e9cbbee";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/et/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/et/thunderbird-78.10.2.tar.bz2";
locale = "et"; locale = "et";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "cb2e2f08c56b47acfb3a47c5d05878cdd22734e158644bf0501cff6b9871bcb0"; sha256 = "1e8bb2945185187e5e3a21f66f0ef94f9431945f51f1d13fbd36d1b67a2e6e3b";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/eu/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/eu/thunderbird-78.10.2.tar.bz2";
locale = "eu"; locale = "eu";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "3b3ea74ee478a5541062d3d185f829e14b4470001c8562fb29d2b3705ce017fd"; sha256 = "be969ada044ade28a438b35d8b65e4a14995e24341f15a06b08dd6da7b5ef7df";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/fa/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/fa/thunderbird-78.10.2.tar.bz2";
locale = "fa"; locale = "fa";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "f9ea779fca1c2e817103d0fc3e0cea65b3d93a624641ce7e6a5f2c0e85cf485d"; sha256 = "8dedd020f9d7d0869c2d394f7f643cb6c95be59ce5e7a63a736493b66108154e";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/fi/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/fi/thunderbird-78.10.2.tar.bz2";
locale = "fi"; locale = "fi";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "222e9db844504a99b5f4b6fa030a1ee64b45a55fa05208ea8c94237405f07eb7"; sha256 = "5d1fba8f83af7f02359b7469c036cc8438dc1284aa1c68676245966faa7aef81";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/fr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/fr/thunderbird-78.10.2.tar.bz2";
locale = "fr"; locale = "fr";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "65ba942bf95b0a5055f08805ee4e75eb907fa33ef38b0d7b5a72ef8f805e9366"; sha256 = "49b23d9fae7f132908b8d3498fb5f17321c25037bf300188dd2916ac947f0086";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/fy-NL/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/fy-NL/thunderbird-78.10.2.tar.bz2";
locale = "fy-NL"; locale = "fy-NL";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "50dbebc2f748bef3da8f4a1901ab10ed5d152f683232c22addfab62e8b8110df"; sha256 = "7a4c4e6a7801805685b062b402c36d9c53e69864fad37d7e7da08270528caf74";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ga-IE/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ga-IE/thunderbird-78.10.2.tar.bz2";
locale = "ga-IE"; locale = "ga-IE";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "d79d2f46bb160f727576cacfae15845200223781abeae8499c2ded4e1f87f220"; sha256 = "ff396a9fd281a954c4f8fb7d244f4d38f525e6b4a2b60e6be349c77dfdc0cc08";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/gd/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/gd/thunderbird-78.10.2.tar.bz2";
locale = "gd"; locale = "gd";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "97b974a42b8592ee01512294a8f87313017fc48dafb75c43ba90bd8556d9e8aa"; sha256 = "c7d41e9cfd5fc3b3f2b7500cb0c3825c54ae1b5a0ac43de81e7bd1d89e7d2937";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/gl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/gl/thunderbird-78.10.2.tar.bz2";
locale = "gl"; locale = "gl";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "64fad7d82e2e41dbf069c9d53eef21480b70ce2f0a2979e4f32f1bdbd864ffd9"; sha256 = "b029af91843cceeba4b0cb8f65290c7d8ae847b0e297bf16c9f596416fb7d973";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/he/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/he/thunderbird-78.10.2.tar.bz2";
locale = "he"; locale = "he";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "1f3095ad3522080a42b3f4a2a90a96342f1c8ace53ebc4a78aa9af7276b1957c"; sha256 = "0378df8e3e79fbdc85bee602d2215a088f9f9bffaa65ea66808fe27efd38ef3f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/hr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/hr/thunderbird-78.10.2.tar.bz2";
locale = "hr"; locale = "hr";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "d96902f4f4be4be9740f1d96c68c6621a9ad9d349146eaac7b81927eeefc6fc6"; sha256 = "1d4c9f9ff3d78d049769404088bc2cc8e7c45480aca2da53974f3388d0f156a0";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/hsb/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/hsb/thunderbird-78.10.2.tar.bz2";
locale = "hsb"; locale = "hsb";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "80892068dbbbaf6a63b3a5970d3d1a4833f81a2c610c09ac1ff4ce52bcb90a03"; sha256 = "8a0bc3d8b5c58b44f299243c7ac9e0166b530c26e6c7c71a2eacb7b6e2b9d9c0";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/hu/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/hu/thunderbird-78.10.2.tar.bz2";
locale = "hu"; locale = "hu";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "9c013c1b3e9d713e538a30eae94d394bdc9afcdbd1bdf690dbdb16213a706475"; sha256 = "6ea2a35507444301cc1a7dd970a69b21a350254cc5de676406b09c55596e146c";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/hy-AM/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/hy-AM/thunderbird-78.10.2.tar.bz2";
locale = "hy-AM"; locale = "hy-AM";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "afd694d0c333b2964b13e15e025054fc947721c309ae3723d3999a87abe53fd6"; sha256 = "f6f744b1ecdff58e0bf1ef315705f8e0dc17bb3fab3db3d6a54004632eb5e037";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/id/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/id/thunderbird-78.10.2.tar.bz2";
locale = "id"; locale = "id";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "463ceb756f31d5fbd84e849de560608050c3b758cf6a3e27785fbbac4d7b04b4"; sha256 = "6cc9fec045a8ba154203fa597e4c67335e4461dc2026d27cc7675b9ebef03f8c";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/is/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/is/thunderbird-78.10.2.tar.bz2";
locale = "is"; locale = "is";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "6b3a0f5fc40c279c34e9176899fe352e96f5d5fdece8349191723b104496e834"; sha256 = "c2e9b5fba27f077833c49910dc82922d80fa3d34b954aa5440626030e103a6c6";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/it/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/it/thunderbird-78.10.2.tar.bz2";
locale = "it"; locale = "it";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "45c9f4d035f49543ed83b98513c743053401938924c83e9f9d3006bc70a1a55f"; sha256 = "62c7ba5135cd6c4cf3e079dc91699574328146d1b7258b609d8e6374be5a1596";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ja/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ja/thunderbird-78.10.2.tar.bz2";
locale = "ja"; locale = "ja";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "1c1acb2c670b54863110857c2df5ba504c8f70015cb061dcacf0ca9fd62f14fc"; sha256 = "3cf3692667897274da887fd7b055f9b3887cdd62d840fef44b83a9b991ae6a77";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ka/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ka/thunderbird-78.10.2.tar.bz2";
locale = "ka"; locale = "ka";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "45a04e6fdfce419a1dac9433ecab93918dae7a3577cd77c5db653beea29d1539"; sha256 = "5f06a74d0b4aa431648424fd0c074f192914da9d28bbd54b8303372aba1201ec";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/kab/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/kab/thunderbird-78.10.2.tar.bz2";
locale = "kab"; locale = "kab";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "59ab2d0f4e2ba2dc9bd57f4d838dac05e266293fa1b9b90b442e6506507574dc"; sha256 = "42540cb34f2f32eb713dec1609ac708b176110a09e6be5723fad3f1d1175d251";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/kk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/kk/thunderbird-78.10.2.tar.bz2";
locale = "kk"; locale = "kk";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "3be2ec6152f3b853217093cfade25373c70e58591cd1f6b172e5f2cdf9cbd805"; sha256 = "6aad09c45d90c39b2b3b81b26888de00e1e8593fc53304d87fec5b6caeee2459";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ko/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ko/thunderbird-78.10.2.tar.bz2";
locale = "ko"; locale = "ko";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "bfdde85ee9605537237f5eb4bb4986b048796e57d1b93aca3c52cc34143721a7"; sha256 = "94291ef5626c5d56b7923648ccaf0723bb0588a9898dc8b28f227949c138b325";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/lt/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/lt/thunderbird-78.10.2.tar.bz2";
locale = "lt"; locale = "lt";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "fb891f7e71b73963e59bd60fecaa681b179558476d15221d4309fb4ff7f0998e"; sha256 = "10bc645a6577fd310f0bcd85f686d6e43a2c58eaf910e3d084a97fbca3d3c4b3";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ms/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ms/thunderbird-78.10.2.tar.bz2";
locale = "ms"; locale = "ms";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "d1b7bc7fa6083999ce11331ef96e47e5203ee94f73156db9b7057b2d358994e1"; sha256 = "f64aac07837b287cfc55b30ef30989b91b1536ee3823087deb4ecd5e5dc35d08";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/nb-NO/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/nb-NO/thunderbird-78.10.2.tar.bz2";
locale = "nb-NO"; locale = "nb-NO";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "e005186c779dba7820be0feefc9f4fcc20315fca89557d392219f3111f21454a"; sha256 = "250be8abfa2e95e89d01cce787f210db2ead934f58f426c8fef6b0807bdc37a7";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/nl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/nl/thunderbird-78.10.2.tar.bz2";
locale = "nl"; locale = "nl";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "dba086d711796270d66bf911198d3a3df0c959c54a0050c6ac2840971f2bcaa1"; sha256 = "50d4354bef2bffdfc7f51f0d855aa27f1c2c4798d623b50f8517fb29e6055e95";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/nn-NO/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/nn-NO/thunderbird-78.10.2.tar.bz2";
locale = "nn-NO"; locale = "nn-NO";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "bc2a68b6c46b7fa6cf9389b6294b9e3adc1da0c3e580b58e0ea034aaf102b9ad"; sha256 = "6eaaf29fece0729b40e05b79d7c3875862eabd8c87fb992a1c36334437501dbb";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/pa-IN/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/pa-IN/thunderbird-78.10.2.tar.bz2";
locale = "pa-IN"; locale = "pa-IN";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "2707b607a5cf9cb6cd1d6d8e69ee424db9ef0f77ae3453ffe833473c185f8ffd"; sha256 = "36a2de0519ab3edbbdff6e6ed00fb29be936c1db8083780e441832647a939ac7";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/pl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/pl/thunderbird-78.10.2.tar.bz2";
locale = "pl"; locale = "pl";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "c59eb3a7ba63202fc64b91ac85921a02673ae8039ea6f8c0ff032c73bcb06f86"; sha256 = "5f7289ff86b91e62365c0fee423e1823bf8642ac18e0377bb12f0a352df3e675";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/pt-BR/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/pt-BR/thunderbird-78.10.2.tar.bz2";
locale = "pt-BR"; locale = "pt-BR";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "e7031469d68b27c0339df23598cc5173b7c159073cf6100b6a6b4e77c7361f55"; sha256 = "e3107e2fbaaaa2be0bc1f54c837a26052f407d08cc0f6a9225045c295323b339";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/pt-PT/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/pt-PT/thunderbird-78.10.2.tar.bz2";
locale = "pt-PT"; locale = "pt-PT";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "975d6e0f3dcfc68fc1d385cbe8dd66a5e9de65a6493caa21151d77a610f87f41"; sha256 = "76a119289c6fd93531945945ea9061b0e243a23b050cc6d4b65e50c84f32d631";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/rm/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/rm/thunderbird-78.10.2.tar.bz2";
locale = "rm"; locale = "rm";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "f5743464987a2176ca424aea7e187a952611b4f4c6531c0ff98363ccb38a0ea8"; sha256 = "db6109fc701fd86068e2bfd28619f7ff3e8984dc2dd527b15069a636caff72de";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ro/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ro/thunderbird-78.10.2.tar.bz2";
locale = "ro"; locale = "ro";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "bd64faa96869fd60ef8b11d1051cea616a139542f8bd95deff9f5cfcb106c215"; sha256 = "6ebd451d5dea498c610aa8fcf64033768dc63b1c5b3d911a078b885005387a43";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/ru/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/ru/thunderbird-78.10.2.tar.bz2";
locale = "ru"; locale = "ru";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "d894d4588ae78da76c2893bd151f734b50b946921bf73cd14e045163392ece52"; sha256 = "fcbfbce5906a720982e1a38043afa9ad24af5dee56594846fcafe1d18f8f6788";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/si/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/si/thunderbird-78.10.2.tar.bz2";
locale = "si"; locale = "si";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "be0a4fcf8683db260876fa45c71de96edc8cbaac5dc2f2ccc4592665e2f07b54"; sha256 = "acd5bf205178b62a8f3c867d1eb9b25e8e5f9227e342375521f06474fae90618";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/sk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/sk/thunderbird-78.10.2.tar.bz2";
locale = "sk"; locale = "sk";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "4c3eb810bf695ca98058c1fd803af0c9ddbd08ce303797b3c87a00dd62d248e5"; sha256 = "021f126842a7320463b4eef88134d63b29cc8658351c140a1c25854dc4aec83e";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/sl/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/sl/thunderbird-78.10.2.tar.bz2";
locale = "sl"; locale = "sl";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "165d1759756e5e4efc632129d3307364a43f4884157dd2d7572f476ffde945fc"; sha256 = "cdee34a796c4a4d4c879fd93a08781784afe5d0f7795d3d0c8c26783500a26d3";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/sq/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/sq/thunderbird-78.10.2.tar.bz2";
locale = "sq"; locale = "sq";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "e3a74c10d298786bdbe40e2ffde2e88d8d25d2c148a8da290df59bab15915c5a"; sha256 = "17c18f91b9152438ec0b12ee9d99a64d7a90cd4f8db5eed909b11df5b9fdad49";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/sr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/sr/thunderbird-78.10.2.tar.bz2";
locale = "sr"; locale = "sr";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "4d512b45886767f730da41aba422efad7698ebaf685cf5337b95b63b5f362d60"; sha256 = "7c471edbeda0ecee64bcee08a703e3726f8bd3dd9f2579295abd080d53afcb73";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/sv-SE/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/sv-SE/thunderbird-78.10.2.tar.bz2";
locale = "sv-SE"; locale = "sv-SE";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "b647da4076d5feb4d80c7d323eb45d20f1385a8959cddf29481eca92a68386c9"; sha256 = "eef3af1ef0969cffbe960d420bf121293dc90aab7e45a4c3f601f8167a5ec58a";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/th/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/th/thunderbird-78.10.2.tar.bz2";
locale = "th"; locale = "th";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "89dbad50fcb5e7ce8baa4a9a3f929fb0ada505a2ff4059973fe6ba163e061fad"; sha256 = "94ae0ccfbee17713cfd91f18e2c3a1f7d8bc9ecb717ba0707845b2f0c36ab47c";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/tr/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/tr/thunderbird-78.10.2.tar.bz2";
locale = "tr"; locale = "tr";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "b09b328001662c40d5138751d26c2c818ff9d3fc2fc4fbbcd7fea9c015b0496b"; sha256 = "c699ea9c567eee815530db25183a98db0cc96d244ec3dec151979b8ab1974748";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/uk/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/uk/thunderbird-78.10.2.tar.bz2";
locale = "uk"; locale = "uk";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "109c90943e64fc325ebd5051268bfd899200377cd58a2f2eba9339bbebfd5ebd"; sha256 = "8b4ec008865b5114b2451464a7d9c518a084d0517dc54e58d9ed4fa568a9745d";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/uz/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/uz/thunderbird-78.10.2.tar.bz2";
locale = "uz"; locale = "uz";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "83148f68ae6ecba4e8c7f897cdab760813ce3dc58b8827fe3539b7c7ddf160a0"; sha256 = "3a8864594a11e514a52e50b0188054b56d245a5737ec4465c6ff0f5d5678216f";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/vi/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/vi/thunderbird-78.10.2.tar.bz2";
locale = "vi"; locale = "vi";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "f8f4bb6120f39d2cf9a9b51e30d67bea0e2e9432086aef96a3b6e00afe6ea75e"; sha256 = "51991f70a7876b6dd07861446e9adf0939fd636396ff9588594638f644447530";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/zh-CN/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/zh-CN/thunderbird-78.10.2.tar.bz2";
locale = "zh-CN"; locale = "zh-CN";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "cce65dd262920032cca92753709afa28a9c3d6b3aaeb8c64c697d668cb43a6f7"; sha256 = "b185bdd74b03343dacffd4564cef1c0434b3a18614f1942325bd1c2230c64db5";
} }
{ url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.1/linux-i686/zh-TW/thunderbird-78.10.1.tar.bz2"; { url = "http://archive.mozilla.org/pub/thunderbird/releases/78.10.2/linux-i686/zh-TW/thunderbird-78.10.2.tar.bz2";
locale = "zh-TW"; locale = "zh-TW";
arch = "linux-i686"; arch = "linux-i686";
sha256 = "1781baf8aa36350d3e6a5aec22dcd24af3c8133c5a7ac0ffd2cf213a34746a13"; sha256 = "e26ac3909969514959e7b6bf60a453ecd2b555eac7ca7b798f3d38376b183207";
} }
]; ];
} }

View file

@ -73,13 +73,13 @@ assert waylandSupport -> gtk3Support == true;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "thunderbird"; pname = "thunderbird";
version = "78.10.1"; version = "78.10.2";
src = fetchurl { src = fetchurl {
url = url =
"mirror://mozilla/thunderbird/releases/${version}/source/thunderbird-${version}.source.tar.xz"; "mirror://mozilla/thunderbird/releases/${version}/source/thunderbird-${version}.source.tar.xz";
sha512 = sha512 =
"3dy8db83sw7kvv0pqqzrnidpa0s6j4vl32f08pgka68pgaldxbr9ay4m1amvjafykz4mpk161v35g4dzb1xf7sxdfl38621yayf9ypz"; "3sc6n3n9bqnsq9qn9myanvxpgdx20c803prla3p236hwidz7snmyp2097ggn42xp765km55n11drxalnslsxdypgjikbfdqal05hf5r";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -20,13 +20,13 @@
mkDerivation rec { mkDerivation rec {
pname = "nextcloud-client"; pname = "nextcloud-client";
version = "3.2.0"; version = "3.2.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "nextcloud"; owner = "nextcloud";
repo = "desktop"; repo = "desktop";
rev = "v${version}"; rev = "v${version}";
sha256 = "1nklsa2lx9ayjp8rk1mycjysqqmnq47djig0wygzna5mycl3ji06"; sha256 = "sha256-I31w79GDZxSGlT6YPKSpq0aiyGnJiJBVdTyWI+DUoz4=";
}; };
patches = [ patches = [

View file

@ -1,59 +0,0 @@
{ lib, stdenv, fetchFromGitHub, libupnp, gpgme, gnome, glib, libssh, pkg-config, protobuf, bzip2
, libXScrnSaver, speex, curl, libxml2, libxslt, sqlcipher, libmicrohttpd, opencv, qmake, ffmpeg_3
, qtmultimedia, qtx11extras, qttools }:
stdenv.mkDerivation rec {
pname = "retroshare";
version = "0.6.2";
src = fetchFromGitHub {
owner = "RetroShare";
repo = "RetroShare";
rev = "v${version}";
sha256 = "0hly2x87wdvqzzwf3wjzi7092bj8fk4xs6302rkm8gp9bkkmiiw8";
};
# NIX_CFLAGS_COMPILE = [ "-I${glib.dev}/include/glib-2.0" "-I${glib.dev}/lib/glib-2.0/include" "-I${libxml2.dev}/include/libxml2" "-I${sqlcipher}/include/sqlcipher" ];
patchPhase = ''
# Fix build error
sed -i 's/UpnpString_get_String(es_event->PublisherUrl)/es_event->PublisherUrl/' \
libretroshare/src/upnp/UPnPBase.cpp
'';
nativeBuildInputs = [ pkg-config qmake ];
buildInputs = [
speex libupnp gpgme gnome.libgnome-keyring glib libssh qtmultimedia qtx11extras qttools
protobuf bzip2 libXScrnSaver curl libxml2 libxslt sqlcipher libmicrohttpd opencv ffmpeg_3
];
preConfigure = ''
qmakeFlags="$qmakeFlags DESTDIR=$out"
'';
# gui/settings/PluginsPage.h:25:28: fatal error: ui_PluginsPage.h: No such file or directory
enableParallelBuilding = false;
postInstall = ''
mkdir -p $out/bin
mv $out/RetroShare06-nogui $out/bin/RetroShare-nogui
mv $out/RetroShare06 $out/bin/Retroshare
ln -s $out/bin/RetroShare-nogui $out/bin/retroshare-nogui
# plugins
mkdir -p $out/share/retroshare
mv $out/lib* $out/share/retroshare
# BT DHT bootstrap
cp libbitdht/src/bitdht/bdboot.txt $out/share/retroshare
'';
meta = with lib; {
description = "";
homepage = "http://retroshare.sourceforge.net/";
license = licenses.gpl2Plus;
platforms = platforms.linux;
maintainers = [ ];
broken = true; # broken by libupnp: 1.6.21 -> 1.8.3 (#41684)
};
}

Some files were not shown because too many files have changed in this diff Show more