Merge remote-tracking branch 'origin/master' into staging

This commit is contained in:
Matthew Bauer 2019-02-09 12:14:06 -05:00
commit 5c09d977c7
478 changed files with 13633 additions and 4732 deletions

View File

@ -68,6 +68,11 @@
github = "abbradar"; github = "abbradar";
name = "Nikolay Amiantov"; name = "Nikolay Amiantov";
}; };
abhi18av = {
email = "abhi18av@gmail.com";
github = "abhi18av";
name = "Abhinav Sharma";
};
abigailbuccaneer = { abigailbuccaneer = {
email = "abigailbuccaneer@gmail.com"; email = "abigailbuccaneer@gmail.com";
github = "abigailbuccaneer"; github = "abigailbuccaneer";
@ -236,6 +241,11 @@
email = "nix-commits@lists.science.uu.nl"; email = "nix-commits@lists.science.uu.nl";
name = "Nix Committers"; name = "Nix Committers";
}; };
allonsy = {
email = "linuxbash8@gmail.com";
github = "allonsy";
name = "Alec Snyder";
};
alunduil = { alunduil = {
email = "alunduil@gmail.com"; email = "alunduil@gmail.com";
github = "alunduil"; github = "alunduil";
@ -1270,6 +1280,11 @@
github = "eadwu"; github = "eadwu";
name = "Edmund Wu"; name = "Edmund Wu";
}; };
eamsden = {
email = "edward@blackriversoft.com";
github = "eamsden";
name = "Edward Amsden";
};
earldouglas = { earldouglas = {
email = "james@earldouglas.com"; email = "james@earldouglas.com";
github = "earldouglas"; github = "earldouglas";
@ -1295,6 +1310,11 @@
github = "edef1c"; github = "edef1c";
name = "edef"; name = "edef";
}; };
embr = {
email = "hi@liclac.eu";
github = "liclac";
name = "embr";
};
ederoyd46 = { ederoyd46 = {
email = "matt@ederoyd.co.uk"; email = "matt@ederoyd.co.uk";
github = "ederoyd46"; github = "ederoyd46";
@ -1495,6 +1515,11 @@
github = "expipiplus1"; github = "expipiplus1";
name = "Joe Hermaszewski"; name = "Joe Hermaszewski";
}; };
eyjhb = {
email = "eyjhbb@gmail.com";
github = "eyJhb";
name = "eyJhb";
};
f--t = { f--t = {
email = "git@f-t.me"; email = "git@f-t.me";
github = "f--t"; github = "f--t";
@ -3480,6 +3505,11 @@
github = "pesterhazy"; github = "pesterhazy";
name = "Paulus Esterhazy"; name = "Paulus Esterhazy";
}; };
petabyteboy = {
email = "me@pbb.lc";
github = "petabyteboy";
name = "Milan Pässler";
};
peterhoeg = { peterhoeg = {
email = "peter@hoeg.com"; email = "peter@hoeg.com";
github = "peterhoeg"; github = "peterhoeg";
@ -4156,6 +4186,11 @@
github = "shlevy"; github = "shlevy";
name = "Shea Levy"; name = "Shea Levy";
}; };
shou = {
email = "x+g@shou.io";
github = "Shou";
name = "Benedict Aas";
};
siddharthist = { siddharthist = {
email = "langston.barrett@gmail.com"; email = "langston.barrett@gmail.com";
github = "siddharthist"; github = "siddharthist";
@ -4677,7 +4712,7 @@
name = "Thomas Tuegel"; name = "Thomas Tuegel";
}; };
tv = { tv = {
email = "tv@shackspace.de"; email = "tv@krebsco.de";
github = "4z3"; github = "4z3";
name = "Tomislav Viljetić"; name = "Tomislav Viljetić";
}; };
@ -5151,4 +5186,9 @@
github = "mredaelli"; github = "mredaelli";
name = "Massimo Redaelli"; name = "Massimo Redaelli";
}; };
shmish111 = {
email = "shmish111@gmail.com";
github = "shmish111";
name = "David Smith";
};
} }

View File

@ -0,0 +1,22 @@
ansicolors,
argparse,
dkjson
inspect
lrexlib-gnu,
lrexlib-posix,
ltermbox,
lua-cmsgpack,
lua_cliargs,
lua-term,
luaffi,http://luarocks.org/dev,
luuid,
penlight,
say,
luv,
luasystem,
mediator_lua,http://luarocks.org/manifests/teto
mpack,http://luarocks.org/manifests/teto
nvim-client,http://luarocks.org/manifests/teto
busted,http://luarocks.org/manifests/teto
luassert,http://luarocks.org/manifests/teto
coxpcall,https://luarocks.org/manifests/hisham,1.17.0-1
1 ansicolors,
2 argparse,
3 dkjson
4 inspect
5 lrexlib-gnu,
6 lrexlib-posix,
7 ltermbox,
8 lua-cmsgpack,
9 lua_cliargs,
10 lua-term,
11 luaffi,http://luarocks.org/dev,
12 luuid,
13 penlight,
14 say,
15 luv,
16 luasystem,
17 mediator_lua,http://luarocks.org/manifests/teto
18 mpack,http://luarocks.org/manifests/teto
19 nvim-client,http://luarocks.org/manifests/teto
20 busted,http://luarocks.org/manifests/teto
21 luassert,http://luarocks.org/manifests/teto
22 coxpcall,https://luarocks.org/manifests/hisham,1.17.0-1

View File

@ -0,0 +1,112 @@
#!/usr/bin/env nix-shell
#!nix-shell -p nix-prefetch-scripts luarocks-nix -i bash
# You'll likely want to use
# ``
# nixpkgs $ maintainers/scripts/update-luarocks-packages pkgs/development/lua-modules/generated-packages.nix
# ``
# to update all libraries in that folder.
# to debug, redirect stderr to stdout with 2>&1
# stop the script upon C-C
set -eu -o pipefail
if [ $# -lt 1 ]; then
print_help
exit 1
fi
CSV_FILE="maintainers/scripts/luarocks-packages.csv"
TMP_FILE="$(mktemp)"
exit_trap()
{
local lc="$BASH_COMMAND" rc=$?
test $rc -eq 0 || echo -e "*** error $rc: $lc.\nGenerated temporary file in $TMP_FILE" >&2
}
trap exit_trap EXIT
print_help() {
echo "Usage: $0 <GENERATED_FILE>"
echo "(most likely pkgs/development/lua-modules/generated-packages.nix)"
echo ""
echo " -c <CSV_FILE> to set the list of luarocks package to generate"
exit 1
}
while getopts ":hc:" opt; do
case $opt in
h)
print_help
;;
c)
echo "Loading package list from $OPTARG !" >&2
CSV_FILE="$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
shift $((OPTIND-1))
done
GENERATED_NIXFILE="$1"
HEADER="
/* ${GENERATED_NIXFILE} is an auto-generated file -- DO NOT EDIT!
Regenerate it with:
nixpkgs$ ${0} ${GENERATED_NIXFILE}
These packages are manually refined in lua-overrides.nix
*/
{ self, lua, stdenv, fetchurl, fetchgit, pkgs, ... } @ args:
self: super:
with self;
{
"
FOOTER="
}
/* GENERATED */
"
function convert_pkg () {
pkg="$1"
server=""
if [ ! -z "$2" ]; then
server=" --server=$2"
fi
version="${3:-}"
echo "looking at $pkg (version $version) from server [$server]" >&2
cmd="luarocks nix $server $pkg $version"
drv="$($cmd)"
if [ $? -ne 0 ]; then
echo "Failed to convert $pkg" >&2
echo "$drv" >&2
else
echo "$drv" | tee -a "$TMP_FILE"
fi
}
# params needed when called via callPackage
echo "$HEADER" | tee "$TMP_FILE"
# list of packages with format
# name,server,version
while IFS=, read -r pkg_name server version
do
if [ -z "$pkg_name" ]; then
echo "Skipping empty package name" >&2
fi
convert_pkg "$pkg_name" "$server" "$version"
done < "$CSV_FILE"
# close the set
echo "$FOOTER" | tee -a "$TMP_FILE"
cp "$TMP_FILE" "$GENERATED_NIXFILE"

View File

@ -265,6 +265,7 @@ in rec {
xsltproc \ xsltproc \
${manualXsltprocOptions} \ ${manualXsltprocOptions} \
--stringparam target.database.document "${olinkDB}/olinkdb.xml" \ --stringparam target.database.document "${olinkDB}/olinkdb.xml" \
--stringparam id.warnings "1" \
--nonet --output $dst/ \ --nonet --output $dst/ \
${docbook_xsl_ns}/xml/xsl/docbook/xhtml/chunktoc.xsl \ ${docbook_xsl_ns}/xml/xsl/docbook/xhtml/chunktoc.xsl \
${manual-combined}/manual-combined.xml ${manual-combined}/manual-combined.xml

View File

@ -410,6 +410,23 @@
(<link xlink:href="https://github.com/NixOS/nixpkgs/pull/54637">#54637</link>) (<link xlink:href="https://github.com/NixOS/nixpkgs/pull/54637">#54637</link>)
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<literal>matrix-synapse</literal> has been updated to version 0.99. It will
<link xlink:href="https://github.com/matrix-org/synapse/pull/4509">no longer generate a self-signed certificate on first launch</link>
and will be <link xlink:href="https://matrix.org/blog/2019/02/05/synapse-0-99-0/">the last version to accept self-signed certificates</link>.
As such, it is now recommended to use a proper certificate verified by a
root CA (for example Let's Encrypt).
</para>
</listitem>
<listitem>
<para>
<literal>mailutils</literal> now works by default when
<literal>sendmail</literal> is not in a setuid wrapper. As a consequence,
the <literal>sendmailPath</literal> argument, having lost its main use, has
been removed.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
@ -462,6 +479,11 @@
of maintainers. of maintainers.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The astah-community package was removed from nixpkgs due to it being discontinued and the downloads not being available anymore.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The httpd service now saves log files with a .log file extension by default for The httpd service now saves log files with a .log file extension by default for
@ -503,6 +525,28 @@
</para> </para>
</note> </note>
</listitem> </listitem>
<listitem>
<para>
The <link xlink:href="https://github.com/DanielAdolfsson/ndppd"><literal>ndppd</literal></link> module
now supports <link linkend="opt-services.ndppd.enable">all config options</link> provided by the current
upstream version as service options. Additionally the <literal>ndppd</literal> package doesn't contain
the systemd unit configuration from upstream anymore, the unit is completely configured by the NixOS module now.
</para>
</listitem>
<listitem>
<para>
New installs of NixOS will default to the Redmine 4.x series unless otherwise specified in
<literal>services.redmine.package</literal> while existing installs of NixOS will default to
the Redmine 3.x series.
</para>
</listitem>
<listitem>
<para>
The <link linkend="opt-services.grafana.enable">Grafana module</link> now supports declarative
<link xlink:href="http://docs.grafana.org/administration/provisioning/">datasource and dashboard</link>
provisioning.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
</section> </section>

View File

@ -3,7 +3,7 @@
# Use a minimal kernel? # Use a minimal kernel?
, minimal ? false , minimal ? false
# Ignored # Ignored
, config ? null , config ? {}
# Modules to add to each VM # Modules to add to each VM
, extraConfigurations ? [] }: , extraConfigurations ? [] }:

View File

@ -339,11 +339,11 @@ let
# dates (cp -p, touch, mcopy -m, faketime for label), IDs (mkfs.vfat -i) # dates (cp -p, touch, mcopy -m, faketime for label), IDs (mkfs.vfat -i)
'' ''
mkdir ./contents && cd ./contents mkdir ./contents && cd ./contents
cp -rp "${efiDir}"/* . cp -rp "${efiDir}"/EFI .
mkdir ./boot mkdir ./boot
cp -p "${config.boot.kernelPackages.kernel}/${config.system.boot.loader.kernelFile}" \ cp -p "${config.boot.kernelPackages.kernel}/${config.system.boot.loader.kernelFile}" \
"${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}" ./boot/ "${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}" ./boot/
touch --date=@0 ./* touch --date=@0 ./EFI ./boot
usage_size=$(du -sb --apparent-size . | tr -cd '[:digit:]') usage_size=$(du -sb --apparent-size . | tr -cd '[:digit:]')
# Make the image 110% as big as the files need to make up for FAT overhead # Make the image 110% as big as the files need to make up for FAT overhead
@ -355,7 +355,7 @@ let
echo "Image size: $image_size" echo "Image size: $image_size"
truncate --size=$image_size "$out" truncate --size=$image_size "$out"
${pkgs.libfaketime}/bin/faketime "2000-01-01 00:00:00" ${pkgs.dosfstools}/sbin/mkfs.vfat -i 12345678 -n EFIBOOT "$out" ${pkgs.libfaketime}/bin/faketime "2000-01-01 00:00:00" ${pkgs.dosfstools}/sbin/mkfs.vfat -i 12345678 -n EFIBOOT "$out"
mcopy -psvm -i "$out" ./* :: mcopy -psvm -i "$out" ./EFI ./boot ::
# Verify the FAT partition. # Verify the FAT partition.
${pkgs.dosfstools}/sbin/fsck.vfat -vn "$out" ${pkgs.dosfstools}/sbin/fsck.vfat -vn "$out"
''; # */ ''; # */

View File

@ -340,6 +340,8 @@ foreach my $fs (read_file("/proc/self/mountinfo")) {
chomp $fs; chomp $fs;
my @fields = split / /, $fs; my @fields = split / /, $fs;
my $mountPoint = $fields[4]; my $mountPoint = $fields[4];
$mountPoint =~ s/\\040/ /g; # account for mount points with spaces in the name (\040 is the escape character)
$mountPoint =~ s/\\011/\t/g; # account for mount points with tabs in the name (\011 is the escape character)
next unless -d $mountPoint; next unless -d $mountPoint;
my @mountOptions = split /,/, $fields[5]; my @mountOptions = split /,/, $fields[5];
@ -355,6 +357,8 @@ foreach my $fs (read_file("/proc/self/mountinfo")) {
my $fsType = $fields[$n]; my $fsType = $fields[$n];
my $device = $fields[$n + 1]; my $device = $fields[$n + 1];
my @superOptions = split /,/, $fields[$n + 2]; my @superOptions = split /,/, $fields[$n + 2];
$device =~ s/\\040/ /g; # account for devices with spaces in the name (\040 is the escape character)
$device =~ s/\\011/\t/g; # account for mount points with tabs in the name (\011 is the escape character)
# Skip the read-only bind-mount on /nix/store. # Skip the read-only bind-mount on /nix/store.
next if $mountPoint eq "/nix/store" && (grep { $_ eq "rw" } @superOptions) && (grep { $_ eq "ro" } @mountOptions); next if $mountPoint eq "/nix/store" && (grep { $_ eq "rw" } @superOptions) && (grep { $_ eq "ro" } @mountOptions);

View File

@ -101,6 +101,7 @@
./programs/gnupg.nix ./programs/gnupg.nix
./programs/gphoto2.nix ./programs/gphoto2.nix
./programs/iftop.nix ./programs/iftop.nix
./programs/iotop.nix
./programs/java.nix ./programs/java.nix
./programs/kbdlight.nix ./programs/kbdlight.nix
./programs/less.nix ./programs/less.nix

View File

@ -0,0 +1,17 @@
{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.programs.iotop;
in {
options = {
programs.iotop.enable = mkEnableOption "iotop + setcap wrapper";
};
config = mkIf cfg.enable {
security.wrappers.iotop = {
source = "${pkgs.iotop}/bin/iotop";
capabilities = "cap_net_admin+p";
};
};
}

View File

@ -60,10 +60,11 @@ in {
extraPackages = mkOption { extraPackages = mkOption {
type = with types; listOf package; type = with types; listOf package;
default = with pkgs; [ default = with pkgs; [
swaylock swayidle
xwayland rxvt_unicode dmenu xwayland rxvt_unicode dmenu
]; ];
defaultText = literalExample '' defaultText = literalExample ''
with pkgs; [ xwayland rxvt_unicode dmenu ]; with pkgs; [ swaylock swayidle xwayland rxvt_unicode dmenu ];
''; '';
example = literalExample '' example = literalExample ''
with pkgs; [ with pkgs; [

View File

@ -4,8 +4,41 @@ with lib;
let let
cfg = config.services.minecraft-server; cfg = config.services.minecraft-server;
in
{ # We don't allow eula=false anyways
eulaFile = builtins.toFile "eula.txt" ''
# eula.txt managed by NixOS Configuration
eula=true
'';
whitelistFile = pkgs.writeText "whitelist.json"
(builtins.toJSON
(mapAttrsToList (n: v: { name = n; uuid = v; }) cfg.whitelist));
cfgToString = v: if builtins.isBool v then boolToString v else toString v;
serverPropertiesFile = pkgs.writeText "server.properties" (''
# server.properties managed by NixOS configuration
'' + concatStringsSep "\n" (mapAttrsToList
(n: v: "${n}=${cfgToString v}") cfg.serverProperties));
# To be able to open the firewall, we need to read out port values in the
# server properties, but fall back to the defaults when those don't exist.
# These defaults are from https://minecraft.gamepedia.com/Server.properties#Java_Edition_3
defaultServerPort = 25565;
serverPort = cfg.serverProperties.server-port or defaultServerPort;
rconPort = if cfg.serverProperties.enable-rcon or false
then cfg.serverProperties."rcon.port" or 25575
else null;
queryPort = if cfg.serverProperties.enable-query or false
then cfg.serverProperties."query.port" or 25565
else null;
in {
options = { options = {
services.minecraft-server = { services.minecraft-server = {
@ -13,10 +46,32 @@ in
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = ''
If enabled, start a Minecraft Server. The listening port for If enabled, start a Minecraft Server. The server
the server is always <literal>25565</literal>. The server
data will be loaded from and saved to data will be loaded from and saved to
<literal>${cfg.dataDir}</literal>. <option>services.minecraft-server.dataDir</option>.
'';
};
declarative = mkOption {
type = types.bool;
default = false;
description = ''
Whether to use a declarative Minecraft server configuration.
Only if set to <literal>true</literal>, the options
<option>services.minecraft-server.whitelist</option> and
<option>services.minecraft-server.serverProperties</option> will be
applied.
'';
};
eula = mkOption {
type = types.bool;
default = false;
description = ''
Whether you agree to
<link xlink:href="https://account.mojang.com/documents/minecraft_eula">
Mojangs EULA</link>. This option must be set to
<literal>true</literal> to run Minecraft server.
''; '';
}; };
@ -24,7 +79,7 @@ in
type = types.path; type = types.path;
default = "/var/lib/minecraft"; default = "/var/lib/minecraft";
description = '' description = ''
Directory to store minecraft database and other state/data files. Directory to store Minecraft database and other state/data files.
''; '';
}; };
@ -32,21 +87,84 @@ in
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = ''
Whether to open ports in the firewall (if enabled) for the server. Whether to open ports in the firewall for the server.
''; '';
}; };
whitelist = mkOption {
type = let
minecraftUUID = types.strMatching
"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" // {
description = "Minecraft UUID";
};
in types.attrsOf minecraftUUID;
default = {};
description = ''
Whitelisted players, only has an effect when
<option>services.minecraft-server.declarative</option> is
<literal>true</literal> and the whitelist is enabled
via <option>services.minecraft-server.serverProperties</option> by
setting <literal>white-list</literal> to <literal>true</literal>.
This is a mapping from Minecraft usernames to UUIDs.
You can use <link xlink:href="https://mcuuid.net/"/> to get a
Minecraft UUID for a username.
'';
example = literalExample ''
{
username1 = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
username2 = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy";
};
'';
};
serverProperties = mkOption {
type = with types; attrsOf (either bool (either int str));
default = {};
example = literalExample ''
{
server-port = 43000;
difficulty = 3;
gamemode = 1;
max-players = 5;
motd = "NixOS Minecraft server!";
white-list = true;
enable-rcon = true;
"rcon.password" = "hunter2";
}
'';
description = ''
Minecraft server properties for the server.properties file. Only has
an effect when <option>services.minecraft-server.declarative</option>
is set to <literal>true</literal>. See
<link xlink:href="https://minecraft.gamepedia.com/Server.properties#Java_Edition_3"/>
for documentation on these values.
'';
};
package = mkOption {
type = types.package;
default = pkgs.minecraft-server;
defaultText = "pkgs.minecraft-server";
example = literalExample "pkgs.minecraft-server_1_12_2";
description = "Version of minecraft-server to run.";
};
jvmOpts = mkOption { jvmOpts = mkOption {
type = types.str; type = types.separatedString " ";
default = "-Xmx2048M -Xms2048M"; default = "-Xmx2048M -Xms2048M";
description = "JVM options for the Minecraft Service."; # Example options from https://minecraft.gamepedia.com/Tutorials/Server_startup_script
example = "-Xmx2048M -Xms4092M -XX:+UseG1GC -XX:+CMSIncrementalPacing "
+ "-XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 "
+ "-XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10";
description = "JVM options for the Minecraft server.";
}; };
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
users.users.minecraft = { users.users.minecraft = {
description = "Minecraft Server Service user"; description = "Minecraft server service user";
home = cfg.dataDir; home = cfg.dataDir;
createHome = true; createHome = true;
uid = config.ids.uids.minecraft; uid = config.ids.uids.minecraft;
@ -57,17 +175,60 @@ in
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
after = [ "network.target" ]; after = [ "network.target" ];
serviceConfig.Restart = "always"; serviceConfig = {
serviceConfig.User = "minecraft"; ExecStart = "${cfg.package}/bin/minecraft-server ${cfg.jvmOpts}";
script = '' Restart = "always";
cd ${cfg.dataDir} User = "minecraft";
exec ${pkgs.minecraft-server}/bin/minecraft-server ${cfg.jvmOpts} WorkingDirectory = cfg.dataDir;
''; };
preStart = ''
ln -sf ${eulaFile} eula.txt
'' + (if cfg.declarative then ''
if [ -e .declarative ]; then
# Was declarative before, no need to back up anything
ln -sf ${whitelistFile} whitelist.json
cp -f ${serverPropertiesFile} server.properties
else
# Declarative for the first time, backup stateful files
ln -sb --suffix=.stateful ${whitelistFile} whitelist.json
cp -b --suffix=.stateful ${serverPropertiesFile} server.properties
# server.properties must have write permissions, because every time
# the server starts it first parses the file and then regenerates it..
chmod +w server.properties
echo "Autogenerated file that signifies that this server configuration is managed declaratively by NixOS" \
> .declarative
fi
'' else ''
if [ -e .declarative ]; then
rm .declarative
fi
'');
}; };
networking.firewall = mkIf cfg.openFirewall { networking.firewall = mkIf cfg.openFirewall (if cfg.declarative then {
allowedUDPPorts = [ 25565 ]; allowedUDPPorts = [ serverPort ];
allowedTCPPorts = [ 25565 ]; allowedTCPPorts = [ serverPort ]
}; ++ optional (! isNull queryPort) queryPort
++ optional (! isNull rconPort) rconPort;
} else {
allowedUDPPorts = [ defaultServerPort ];
allowedTCPPorts = [ defaultServerPort ];
});
assertions = [
{ assertion = cfg.eula;
message = "You must agree to Mojangs EULA to run minecraft-server."
+ " Read https://account.mojang.com/documents/minecraft_eula and"
+ " set `services.minecraft-server.eula` to `true` if you agree.";
}
];
}; };
} }

View File

@ -25,6 +25,20 @@ in
description = "Hostname to use for the nginx vhost"; description = "Hostname to use for the nginx vhost";
}; };
package = mkOption {
type = types.package;
default = pkgs.roundcube;
example = literalExample ''
roundcube.withPlugins (plugins: [ plugins.persistent_login ])
'';
description = ''
The package which contains roundcube's sources. Can be overriden to create
an environment which contains roundcube and third-party plugins.
'';
};
database = { database = {
username = mkOption { username = mkOption {
type = types.str; type = types.str;
@ -86,7 +100,7 @@ in
forceSSL = mkDefault true; forceSSL = mkDefault true;
enableACME = mkDefault true; enableACME = mkDefault true;
locations."/" = { locations."/" = {
root = pkgs.roundcube; root = cfg.package;
index = "index.php"; index = "index.php";
extraConfig = '' extraConfig = ''
location ~* \.php$ { location ~* \.php$ {
@ -140,12 +154,12 @@ in
${pkgs.sudo}/bin/sudo -u ${pgSuperUser} psql postgres -c "create database ${cfg.database.dbname} with owner ${cfg.database.username}"; ${pkgs.sudo}/bin/sudo -u ${pgSuperUser} psql postgres -c "create database ${cfg.database.dbname} with owner ${cfg.database.username}";
fi fi
PGPASSWORD=${cfg.database.password} ${pkgs.postgresql}/bin/psql -U ${cfg.database.username} \ PGPASSWORD=${cfg.database.password} ${pkgs.postgresql}/bin/psql -U ${cfg.database.username} \
-f ${pkgs.roundcube}/SQL/postgres.initial.sql \ -f ${cfg.package}/SQL/postgres.initial.sql \
-h ${cfg.database.host} ${cfg.database.dbname} -h ${cfg.database.host} ${cfg.database.dbname}
touch /var/lib/roundcube/db-created touch /var/lib/roundcube/db-created
fi fi
${pkgs.php}/bin/php ${pkgs.roundcube}/bin/update.sh ${pkgs.php}/bin/php ${cfg.package}/bin/update.sh
''; '';
serviceConfig.Type = "oneshot"; serviceConfig.Type = "oneshot";
}; };

View File

@ -18,7 +18,7 @@ let
delete.enabled = cfg.enableDelete; delete.enabled = cfg.enableDelete;
}; };
http = { http = {
addr = ":${builtins.toString cfg.port}"; addr = "${cfg.listenAddress}:${builtins.toString cfg.port}";
headers.X-Content-Type-Options = ["nosniff"]; headers.X-Content-Type-Options = ["nosniff"];
}; };
health.storagedriver = { health.storagedriver = {

View File

@ -497,7 +497,12 @@ in {
systemd.services.gitaly = { systemd.services.gitaly = {
after = [ "network.target" ]; after = [ "network.target" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = with pkgs; [ gitAndTools.git cfg.packages.gitaly.rubyEnv cfg.packages.gitaly.rubyEnv.wrappedRuby ]; path = with pkgs; [
openssh
gitAndTools.git
cfg.packages.gitaly.rubyEnv
cfg.packages.gitaly.rubyEnv.wrappedRuby
];
serviceConfig = { serviceConfig = {
Type = "simple"; Type = "simple";
User = cfg.user; User = cfg.user;

View File

@ -6,9 +6,18 @@ let
cfg = config.services.home-assistant; cfg = config.services.home-assistant;
# cfg.config != null can be assumed here # cfg.config != null can be assumed here
configFile = pkgs.writeText "configuration.json" configJSON = pkgs.writeText "configuration.json"
(builtins.toJSON (if cfg.applyDefaultConfig then (builtins.toJSON (if cfg.applyDefaultConfig then
(lib.recursiveUpdate defaultConfig cfg.config) else cfg.config)); (recursiveUpdate defaultConfig cfg.config) else cfg.config));
configFile = pkgs.runCommand "configuration.yaml" { } ''
${pkgs.remarshal}/bin/json2yaml -i ${configJSON} -o $out
'';
lovelaceConfigJSON = pkgs.writeText "ui-lovelace.json"
(builtins.toJSON cfg.lovelaceConfig);
lovelaceConfigFile = pkgs.runCommand "ui-lovelace.yaml" { } ''
${pkgs.remarshal}/bin/json2yaml -i ${lovelaceConfigJSON} -o $out
'';
availableComponents = pkgs.home-assistant.availableComponents; availableComponents = pkgs.home-assistant.availableComponents;
@ -44,7 +53,9 @@ let
# If you are changing this, please update the description in applyDefaultConfig # If you are changing this, please update the description in applyDefaultConfig
defaultConfig = { defaultConfig = {
homeassistant.time_zone = config.time.timeZone; homeassistant.time_zone = config.time.timeZone;
http.server_port = (toString cfg.port); http.server_port = cfg.port;
} // optionalAttrs (cfg.lovelaceConfig != null) {
lovelace.mode = "yaml";
}; };
in { in {
@ -99,6 +110,53 @@ in {
''; '';
}; };
configWritable = mkOption {
default = false;
type = types.bool;
description = ''
Whether to make <filename>configuration.yaml</filename> writable.
This only has an effect if <option>config</option> is set.
This will allow you to edit it from Home Assistant's web interface.
However, bear in mind that it will be overwritten at every start of the service.
'';
};
lovelaceConfig = mkOption {
default = null;
type = with types; nullOr attrs;
# from https://www.home-assistant.io/lovelace/yaml-mode/
example = literalExample ''
{
title = "My Awesome Home";
views = [ {
title = "Example";
cards = [ {
type = "markdown";
title = "Lovelace";
content = "Welcome to your **Lovelace UI**.";
} ];
} ];
}
'';
description = ''
Your <filename>ui-lovelace.yaml</filename> as a Nix attribute set.
Setting this option will automatically add
<literal>lovelace.mode = "yaml";</literal> to your <option>config</option>.
Beware that setting this option will delete your previous <filename>ui-lovelace.yaml</filename>
'';
};
lovelaceConfigWritable = mkOption {
default = false;
type = types.bool;
description = ''
Whether to make <filename>ui-lovelace.yaml</filename> writable.
This only has an effect if <option>lovelaceConfig</option> is set.
This will allow you to edit it from Home Assistant's web interface.
However, bear in mind that it will be overwritten at every start of the service.
'';
};
package = mkOption { package = mkOption {
default = pkgs.home-assistant; default = pkgs.home-assistant;
defaultText = "pkgs.home-assistant"; defaultText = "pkgs.home-assistant";
@ -144,12 +202,17 @@ in {
systemd.services.home-assistant = { systemd.services.home-assistant = {
description = "Home Assistant"; description = "Home Assistant";
after = [ "network.target" ]; after = [ "network.target" ];
preStart = lib.optionalString (cfg.config != null) '' preStart = optionalString (cfg.config != null) (if cfg.configWritable then ''
config=${cfg.configDir}/configuration.yaml cp --no-preserve=mode ${configFile} "${cfg.configDir}/configuration.yaml"
rm -f $config '' else ''
${pkgs.remarshal}/bin/json2yaml -i ${configFile} -o $config rm -f "${cfg.configDir}/configuration.yaml"
chmod 444 $config ln -s ${configFile} "${cfg.configDir}/configuration.yaml"
''; '') + optionalString (cfg.lovelaceConfig != null) (if cfg.lovelaceConfigWritable then ''
cp --no-preserve=mode ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
'' else ''
rm -f "${cfg.configDir}/ui-lovelace.yaml"
ln -s ${lovelaceConfigFile} "${cfg.configDir}/ui-lovelace.yaml"
'');
serviceConfig = { serviceConfig = {
ExecStart = "${package}/bin/hass --config '${cfg.configDir}'"; ExecStart = "${package}/bin/hass --config '${cfg.configDir}'";
User = "hass"; User = "hass";

View File

@ -651,12 +651,16 @@ in {
services.postgresql.enable = mkIf usePostgresql (mkDefault true); services.postgresql.enable = mkIf usePostgresql (mkDefault true);
systemd.services.matrix-synapse = { systemd.services.matrix-synapse =
let
python = (pkgs.python3.withPackages (ps: with ps; [ (ps.toPythonModule cfg.package) ]));
in
{
description = "Synapse Matrix homeserver"; description = "Synapse Matrix homeserver";
after = [ "network.target" "postgresql.service" ]; after = [ "network.target" "postgresql.service" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
preStart = '' preStart = ''
${cfg.package}/bin/homeserver \ ${python.interpreter} -m synapse.app.homeserver \
--config-path ${configFile} \ --config-path ${configFile} \
--keys-directory ${cfg.dataDir} \ --keys-directory ${cfg.dataDir} \
--generate-keys --generate-keys
@ -687,10 +691,11 @@ in {
WorkingDirectory = cfg.dataDir; WorkingDirectory = cfg.dataDir;
PermissionsStartOnly = true; PermissionsStartOnly = true;
ExecStart = '' ExecStart = ''
${cfg.package}/bin/homeserver \ ${python.interpreter} -m synapse.app.homeserver \
${ concatMapStringsSep "\n " (x: "--config-path ${x} \\") ([ configFile ] ++ cfg.extraConfigFiles) } ${ concatMapStringsSep "\n " (x: "--config-path ${x} \\") ([ configFile ] ++ cfg.extraConfigFiles) }
--keys-directory ${cfg.dataDir} --keys-directory ${cfg.dataDir}
''; '';
ExecReload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID";
Restart = "on-failure"; Restart = "on-failure";
}; };
}; };

View File

@ -30,6 +30,13 @@ let
${cfg.extraConfig} ${cfg.extraConfig}
''; '';
additionalEnvironment = pkgs.writeText "additional_environment.rb" ''
config.logger = Logger.new("${cfg.stateDir}/log/production.log", 14, 1048576)
config.logger.level = Logger::INFO
${cfg.extraEnv}
'';
unpackTheme = unpack "theme"; unpackTheme = unpack "theme";
unpackPlugin = unpack "plugin"; unpackPlugin = unpack "plugin";
unpack = id: (name: source: unpack = id: (name: source:
@ -54,12 +61,20 @@ in
description = "Enable the Redmine service."; description = "Enable the Redmine service.";
}; };
# default to the 4.x series not forcing major version upgrade of those on the 3.x series
package = mkOption { package = mkOption {
type = types.package; type = types.package;
default = pkgs.redmine; default = if versionAtLeast config.system.stateVersion "19.03"
then pkgs.redmine_4
else pkgs.redmine
;
defaultText = "pkgs.redmine"; defaultText = "pkgs.redmine";
description = "Which Redmine package to use."; description = ''
example = "pkgs.redmine.override { ruby = pkgs.ruby_2_3; }"; Which Redmine package to use. This defaults to version 3.x if
<literal>system.stateVersion &lt; 19.03</literal> and version 4.x
otherwise.
'';
example = "pkgs.redmine_4.override { ruby = pkgs.ruby_2_4; }";
}; };
user = mkOption { user = mkOption {
@ -103,6 +118,19 @@ in
''; '';
}; };
extraEnv = mkOption {
type = types.lines;
default = "";
description = ''
Extra configuration in additional_environment.rb.
See https://svn.redmine.org/redmine/trunk/config/additional_environment.rb.example
'';
example = literalExample ''
config.logger.level = Logger::DEBUG
'';
};
themes = mkOption { themes = mkOption {
type = types.attrsOf types.path; type = types.attrsOf types.path;
default = {}; default = {};
@ -249,6 +277,9 @@ in
# link in the application configuration # link in the application configuration
ln -fs ${configurationYml} "${cfg.stateDir}/config/configuration.yml" ln -fs ${configurationYml} "${cfg.stateDir}/config/configuration.yml"
# link in the additional environment configuration
ln -fs ${additionalEnvironment} "${cfg.stateDir}/config/additional_environment.rb"
# link in all user specified themes # link in all user specified themes
rm -rf "${cfg.stateDir}/public/themes/"* rm -rf "${cfg.stateDir}/public/themes/"*

View File

@ -8,7 +8,7 @@
<link xlink:href="https://weechat.org/">WeeChat</link> is a fast and <link xlink:href="https://weechat.org/">WeeChat</link> is a fast and
extensible IRC client. extensible IRC client.
</para> </para>
<section> <section xml:id="module-services-weechat-basic-usage">
<title>Basic Usage</title> <title>Basic Usage</title>
<para> <para>
@ -35,7 +35,7 @@
in the state directory <literal>/var/lib/weechat</literal>. in the state directory <literal>/var/lib/weechat</literal>.
</para> </para>
</section> </section>
<section> <section xml:id="module-services-weechat-reattach">
<title>Re-attaching to WeeChat</title> <title>Re-attaching to WeeChat</title>
<para> <para>

View File

@ -50,6 +50,158 @@ let
SMTP_FROM_ADDRESS = cfg.smtp.fromAddress; SMTP_FROM_ADDRESS = cfg.smtp.fromAddress;
} // cfg.extraOptions; } // cfg.extraOptions;
datasourceConfiguration = {
apiVersion = 1;
datasources = cfg.provision.datasources;
};
datasourceFile = pkgs.writeText "datasource.yaml" (builtins.toJSON datasourceConfiguration);
dashboardConfiguration = {
apiVersion = 1;
providers = cfg.provision.dashboards;
};
dashboardFile = pkgs.writeText "dashboard.yaml" (builtins.toJSON dashboardConfiguration);
provisionConfDir = pkgs.runCommand "grafana-provisioning" { } ''
mkdir -p $out/{datasources,dashboards}
ln -sf ${datasourceFile} $out/datasources/datasource.yaml
ln -sf ${dashboardFile} $out/dashboards/dashboard.yaml
'';
# Get a submodule without any embedded metadata:
_filter = x: filterAttrs (k: v: k != "_module") x;
# http://docs.grafana.org/administration/provisioning/#datasources
grafanaTypes.datasourceConfig = types.submodule {
options = {
name = mkOption {
type = types.str;
description = "Name of the datasource. Required";
};
type = mkOption {
type = types.enum ["graphite" "prometheus" "cloudwatch" "elasticsearch" "influxdb" "opentsdb" "mysql" "mssql" "postgres" "loki"];
description = "Datasource type. Required";
};
access = mkOption {
type = types.enum ["proxy" "direct"];
default = "proxy";
description = "Access mode. proxy or direct (Server or Browser in the UI). Required";
};
orgId = mkOption {
type = types.int;
default = 1;
description = "Org id. will default to orgId 1 if not specified";
};
url = mkOption {
type = types.str;
description = "Url of the datasource";
};
password = mkOption {
type = types.nullOr types.str;
default = null;
description = "Database password, if used";
};
user = mkOption {
type = types.nullOr types.str;
default = null;
description = "Database user, if used";
};
database = mkOption {
type = types.nullOr types.str;
default = null;
description = "Database name, if used";
};
basicAuth = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Enable/disable basic auth";
};
basicAuthUser = mkOption {
type = types.nullOr types.str;
default = null;
description = "Basic auth username";
};
basicAuthPassword = mkOption {
type = types.nullOr types.str;
default = null;
description = "Basic auth password";
};
withCredentials = mkOption {
type = types.bool;
default = false;
description = "Enable/disable with credentials headers";
};
isDefault = mkOption {
type = types.bool;
default = false;
description = "Mark as default datasource. Max one per org";
};
jsonData = mkOption {
type = types.nullOr types.attrs;
default = null;
description = "Datasource specific configuration";
};
secureJsonData = mkOption {
type = types.nullOr types.attrs;
default = null;
description = "Datasource specific secure configuration";
};
version = mkOption {
type = types.int;
default = 1;
description = "Version";
};
editable = mkOption {
type = types.bool;
default = false;
description = "Allow users to edit datasources from the UI.";
};
};
};
# http://docs.grafana.org/administration/provisioning/#dashboards
grafanaTypes.dashboardConfig = types.submodule {
options = {
name = mkOption {
type = types.str;
default = "default";
description = "Provider name";
};
orgId = mkOption {
type = types.int;
default = 1;
description = "Organization ID";
};
folder = mkOption {
type = types.str;
default = "";
description = "Add dashboards to the speciied folder";
};
type = mkOption {
type = types.str;
default = "file";
description = "Dashboard provider type";
};
disableDeletion = mkOption {
type = types.bool;
default = false;
description = "Disable deletion when JSON file is removed";
};
updateIntervalSeconds = mkOption {
type = types.int;
default = 10;
description = "How often Grafana will scan for changed dashboards";
};
options = {
path = mkOption {
type = types.path;
description = "Path grafana will watch for dashboards";
};
};
};
};
in { in {
options.services.grafana = { options.services.grafana = {
enable = mkEnableOption "grafana"; enable = mkEnableOption "grafana";
@ -175,6 +327,22 @@ in {
}; };
}; };
provision = {
enable = mkEnableOption "provision";
datasources = mkOption {
description = "Grafana datasources configuration";
default = [];
type = types.listOf grafanaTypes.datasourceConfig;
apply = x: map _filter x;
};
dashboards = mkOption {
description = "Grafana dashboard configuration";
default = [];
type = types.listOf grafanaTypes.dashboardConfig;
apply = x: map _filter x;
};
};
security = { security = {
adminUser = mkOption { adminUser = mkOption {
description = "Default admin username."; description = "Default admin username.";
@ -313,10 +481,15 @@ in {
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
warnings = optional ( warnings = flatten [
cfg.database.password != opt.database.password.default || (optional (
cfg.security.adminPassword != opt.security.adminPassword.default cfg.database.password != opt.database.password.default ||
) "Grafana passwords will be stored as plaintext in the Nix store!"; cfg.security.adminPassword != opt.security.adminPassword.default
) "Grafana passwords will be stored as plaintext in the Nix store!")
(optional (
any (x: x.password != null || x.basicAuthPassword != null || x.secureJsonData != null) cfg.provision.datasources
) "Datasource passwords will be stored as plaintext in the Nix store!")
];
environment.systemPackages = [ cfg.package ]; environment.systemPackages = [ cfg.package ];
@ -359,6 +532,9 @@ in {
${optionalString (cfg.smtp.passwordFile != null) '' ${optionalString (cfg.smtp.passwordFile != null) ''
export GF_SMTP_PASSWORD="$(cat ${escapeShellArg cfg.smtp.passwordFile})" export GF_SMTP_PASSWORD="$(cat ${escapeShellArg cfg.smtp.passwordFile})"
''} ''}
${optionalString cfg.provision.enable ''
export GF_PATHS_PROVISIONING=${provisionConfDir};
''}
exec ${cfg.package.bin}/bin/grafana-server -homepath ${cfg.dataDir} exec ${cfg.package.bin}/bin/grafana-server -homepath ${cfg.dataDir}
''; '';
serviceConfig = { serviceConfig = {

View File

@ -4,7 +4,7 @@
# TODO: LWP/Pg perl libs aren't recognized # TODO: LWP/Pg perl libs aren't recognized
# TODO: support fastcgi # TODO: support fastcgi
# http://munin-monitoring.org/wiki/CgiHowto2 # http://guide.munin-monitoring.org/en/latest/example/webserver/apache-cgi.html
# spawn-fcgi -s /run/munin/fastcgi-graph.sock -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-graph # spawn-fcgi -s /run/munin/fastcgi-graph.sock -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-graph
# spawn-fcgi -s /run/munin/fastcgi-html.sock -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-html # spawn-fcgi -s /run/munin/fastcgi-html.sock -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-html
# https://paste.sh/vofcctHP#-KbDSXVeWoifYncZmLfZzgum # https://paste.sh/vofcctHP#-KbDSXVeWoifYncZmLfZzgum
@ -24,6 +24,8 @@ let
logdir /var/log/munin logdir /var/log/munin
rundir /run/munin rundir /run/munin
${lib.optionalString (cronCfg.extraCSS != "") "staticdir ${customStaticDir}"}
${cronCfg.extraGlobalConfig} ${cronCfg.extraGlobalConfig}
${cronCfg.hosts} ${cronCfg.hosts}
@ -63,6 +65,11 @@ let
[ipmi*] [ipmi*]
user root user root
group root group root
[munin*]
env.UPDATE_STATSFILE /var/lib/munin/munin-update.stats
${nodeCfg.extraPluginConfig}
''; '';
pluginConfDir = pkgs.stdenv.mkDerivation { pluginConfDir = pkgs.stdenv.mkDerivation {
@ -72,6 +79,54 @@ let
ln -s ${pluginConf} $out/nixos-config ln -s ${pluginConf} $out/nixos-config
''; '';
}; };
# Copy one Munin plugin into the Nix store with a specific name.
# This is suitable for use with plugins going directly into /etc/munin/plugins,
# i.e. munin.extraPlugins.
internOnePlugin = name: path:
"cp -a '${path}' '${name}'";
# Copy an entire tree of Munin plugins into a single directory in the Nix
# store, with no renaming.
# This is suitable for use with munin-node-configure --suggest, i.e.
# munin.extraAutoPlugins.
internManyPlugins = name: path:
"find '${path}' -type f -perm /a+x -exec cp -a -t . '{}' '+'";
# Use the appropriate intern-fn to copy the plugins into the store and patch
# them afterwards in an attempt to get them to run on NixOS.
internAndFixPlugins = name: intern-fn: paths:
pkgs.runCommand name {} ''
mkdir -p "$out"
cd "$out"
${lib.concatStringsSep "\n"
(lib.attrsets.mapAttrsToList intern-fn paths)}
chmod -R u+w .
find . -type f -exec sed -E -i '
s,(/usr)?/s?bin/,/run/current-system/sw/bin/,g
' '{}' '+'
'';
# TODO: write a derivation for munin-contrib, so that for contrib plugins
# you can just refer to them by name rather than needing to include a copy
# of munin-contrib in your nixos configuration.
extraPluginDir = internAndFixPlugins "munin-extra-plugins.d"
internOnePlugin nodeCfg.extraPlugins;
extraAutoPluginDir = internAndFixPlugins "munin-extra-auto-plugins.d"
internManyPlugins
(builtins.listToAttrs
(map
(path: { name = baseNameOf path; value = path; })
nodeCfg.extraAutoPlugins));
customStaticDir = pkgs.runCommand "munin-custom-static-data" {} ''
cp -a "${pkgs.munin}/etc/opt/munin/static" "$out"
cd "$out"
chmod -R u+w .
echo "${cronCfg.extraCSS}" >> style.css
echo "${cronCfg.extraCSS}" >> style-new.css
'';
in in
{ {
@ -82,11 +137,12 @@ in
enable = mkOption { enable = mkOption {
default = false; default = false;
type = types.bool;
description = '' description = ''
Enable Munin Node agent. Munin node listens on 0.0.0.0 and Enable Munin Node agent. Munin node listens on 0.0.0.0 and
by default accepts connections only from 127.0.0.1 for security reasons. by default accepts connections only from 127.0.0.1 for security reasons.
See <link xlink:href='http://munin-monitoring.org/wiki/munin-node.conf' />. See <link xlink:href='http://guide.munin-monitoring.org/en/latest/architecture/index.html' />.
''; '';
}; };
@ -95,18 +151,108 @@ in
type = types.lines; type = types.lines;
description = '' description = ''
<filename>munin-node.conf</filename> extra configuration. See <filename>munin-node.conf</filename> extra configuration. See
<link xlink:href='http://munin-monitoring.org/wiki/munin-node.conf' /> <link xlink:href='http://guide.munin-monitoring.org/en/latest/reference/munin-node.conf.html' />
''; '';
}; };
# TODO: add option to add additional plugins extraPluginConfig = mkOption {
default = "";
type = types.lines;
description = ''
<filename>plugin-conf.d</filename> extra plugin configuration. See
<link xlink:href='http://guide.munin-monitoring.org/en/latest/plugin/use.html' />
'';
example = ''
[fail2ban_*]
user root
'';
};
extraPlugins = mkOption {
default = {};
type = with types; attrsOf path;
description = ''
Additional Munin plugins to activate. Keys are the name of the plugin
symlink, values are the path to the underlying plugin script. You
can use the same plugin script multiple times (e.g. for wildcard
plugins).
Note that these plugins do not participate in autoconfiguration. If
you want to autoconfigure additional plugins, use
<option>services.munin-node.extraAutoPlugins</option>.
Plugins enabled in this manner take precedence over autoconfigured
plugins.
Plugins will be copied into the Nix store, and it will attempt to
modify them to run properly by fixing hardcoded references to
<literal>/bin</literal>, <literal>/usr/bin</literal>,
<literal>/sbin</literal>, and <literal>/usr/sbin</literal>.
'';
example = literalExample ''
{
zfs_usage_bigpool = /src/munin-contrib/plugins/zfs/zfs_usage_;
zfs_usage_smallpool = /src/munin-contrib/plugins/zfs/zfs_usage_;
zfs_list = /src/munin-contrib/plugins/zfs/zfs_list;
};
'';
};
extraAutoPlugins = mkOption {
default = [];
type = with types; listOf path;
description = ''
Additional Munin plugins to autoconfigure, using
<literal>munin-node-configure --suggest</literal>. These should be
the actual paths to the plugin files (or directories containing them),
not just their names.
If you want to manually enable individual plugins instead, use
<option>services.munin-node.extraPlugins</option>.
Note that only plugins that have the 'autoconfig' capability will do
anything if listed here, since plugins that cannot autoconfigure
won't be automatically enabled by
<literal>munin-node-configure</literal>.
Plugins will be copied into the Nix store, and it will attempt to
modify them to run properly by fixing hardcoded references to
<literal>/bin</literal>, <literal>/usr/bin</literal>,
<literal>/sbin</literal>, and <literal>/usr/sbin</literal>.
'';
example = literalExample ''
[
/src/munin-contrib/plugins/zfs
/src/munin-contrib/plugins/ssh
];
'';
};
disabledPlugins = mkOption {
# TODO: figure out why Munin isn't writing the log file and fix it.
# In the meantime this at least suppresses a useless graph full of
# NaNs in the output.
default = [ "munin_stats" ];
type = with types; listOf string;
description = ''
Munin plugins to disable, even if
<literal>munin-node-configure --suggest</literal> tries to enable
them. To disable a wildcard plugin, use an actual wildcard, as in
the example.
munin_stats is disabled by default as it tries to read
<literal>/var/log/munin/munin-update.log</literal> for timing
information, and the NixOS build of Munin does not write this file.
'';
example = [ "diskstats" "zfs_usage_*" ];
};
}; };
services.munin-cron = { services.munin-cron = {
enable = mkOption { enable = mkOption {
default = false; default = false;
type = types.bool;
description = '' description = ''
Enable munin-cron. Takes care of all heavy lifting to collect data from Enable munin-cron. Takes care of all heavy lifting to collect data from
nodes and draws graphs to html. Runs munin-update, munin-limits, nodes and draws graphs to html. Runs munin-update, munin-limits,
@ -119,11 +265,12 @@ in
extraGlobalConfig = mkOption { extraGlobalConfig = mkOption {
default = ""; default = "";
type = types.lines;
description = '' description = ''
<filename>munin.conf</filename> extra global configuration. <filename>munin.conf</filename> extra global configuration.
See <link xlink:href='http://munin-monitoring.org/wiki/munin.conf' />. See <link xlink:href='http://guide.munin-monitoring.org/en/latest/reference/munin.conf.html' />.
Useful to setup notifications, see Useful to setup notifications, see
<link xlink:href='http://munin-monitoring.org/wiki/HowToContact' /> <link xlink:href='http://guide.munin-monitoring.org/en/latest/tutorial/alert.html' />
''; '';
example = '' example = ''
contact.email.command mail -s "Munin notification for ''${var:host}" someone@example.com contact.email.command mail -s "Munin notification for ''${var:host}" someone@example.com
@ -131,14 +278,34 @@ in
}; };
hosts = mkOption { hosts = mkOption {
default = "";
type = types.lines;
description = ''
Definitions of hosts of nodes to collect data from. Needs at least one
host for cron to succeed. See
<link xlink:href='http://guide.munin-monitoring.org/en/latest/reference/munin.conf.html' />
'';
example = '' example = ''
[''${config.networking.hostName}] [''${config.networking.hostName}]
address localhost address localhost
''; '';
};
extraCSS = mkOption {
default = "";
type = types.lines;
description = '' description = ''
Definitions of hosts of nodes to collect data from. Needs at least one Custom styling for the HTML that munin-cron generates. This will be
hosts for cron to succeed. See appended to the CSS files used by munin-cron and will thus take
<link xlink:href='http://munin-monitoring.org/wiki/munin.conf' /> precedence over the builtin styles.
'';
example = ''
/* A simple dark theme. */
html, body { background: #222222; }
#header, #footer { background: #333333; }
img.i, img.iwarn, img.icrit, img.iunkn {
filter: invert(100%) hue-rotate(-30deg);
}
''; '';
}; };
@ -155,6 +322,7 @@ in
description = "Munin monitoring user"; description = "Munin monitoring user";
group = "munin"; group = "munin";
uid = config.ids.uids.munin; uid = config.ids.uids.munin;
home = "/var/lib/munin";
}]; }];
users.groups = [{ users.groups = [{
@ -173,14 +341,27 @@ in
environment.MUNIN_PLUGSTATE = "/run/munin"; environment.MUNIN_PLUGSTATE = "/run/munin";
environment.MUNIN_LOGDIR = "/var/log/munin"; environment.MUNIN_LOGDIR = "/var/log/munin";
preStart = '' preStart = ''
echo "updating munin plugins..." echo "Updating munin plugins..."
mkdir -p /etc/munin/plugins mkdir -p /etc/munin/plugins
rm -rf /etc/munin/plugins/* rm -rf /etc/munin/plugins/*
# Autoconfigure builtin plugins
${pkgs.munin}/bin/munin-node-configure --suggest --shell --families contrib,auto,manual --config ${nodeConf} --libdir=${pkgs.munin}/lib/plugins --servicedir=/etc/munin/plugins --sconfdir=${pluginConfDir} 2>/dev/null | ${pkgs.bash}/bin/bash ${pkgs.munin}/bin/munin-node-configure --suggest --shell --families contrib,auto,manual --config ${nodeConf} --libdir=${pkgs.munin}/lib/plugins --servicedir=/etc/munin/plugins --sconfdir=${pluginConfDir} 2>/dev/null | ${pkgs.bash}/bin/bash
# NOTE: we disable disktstats because plugin seems to fail and it hangs html generation (100% CPU + memory leak) # Autoconfigure extra plugins
rm /etc/munin/plugins/diskstats || true ${pkgs.munin}/bin/munin-node-configure --suggest --shell --families contrib,auto,manual --config ${nodeConf} --libdir=${extraAutoPluginDir} --servicedir=/etc/munin/plugins --sconfdir=${pluginConfDir} 2>/dev/null | ${pkgs.bash}/bin/bash
${lib.optionalString (nodeCfg.extraPlugins != {}) ''
# Link in manually enabled plugins
ln -f -s -t /etc/munin/plugins ${extraPluginDir}/*
''}
${lib.optionalString (nodeCfg.disabledPlugins != []) ''
# Disable plugins
cd /etc/munin/plugins
rm -f ${toString nodeCfg.disabledPlugins}
''}
''; '';
serviceConfig = { serviceConfig = {
ExecStart = "${pkgs.munin}/sbin/munin-node --config ${nodeConf} --servicedir /etc/munin/plugins/ --sconfdir=${pluginConfDir}"; ExecStart = "${pkgs.munin}/sbin/munin-node --config ${nodeConf} --servicedir /etc/munin/plugins/ --sconfdir=${pluginConfDir}";
@ -192,6 +373,10 @@ in
}) (mkIf cronCfg.enable { }) (mkIf cronCfg.enable {
# Munin is hardcoded to use DejaVu Mono and the graphs come out wrong if
# it's not available.
fonts.fonts = [ pkgs.dejavu_fonts ];
systemd.timers.munin-cron = { systemd.timers.munin-cron = {
description = "batch Munin master programs"; description = "batch Munin master programs";
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];

View File

@ -5,43 +5,163 @@ with lib;
let let
cfg = config.services.ndppd; cfg = config.services.ndppd;
configFile = pkgs.runCommand "ndppd.conf" {} '' render = s: f: concatStringsSep "\n" (mapAttrsToList f s);
substitute ${pkgs.ndppd}/etc/ndppd.conf $out \ prefer = a: b: if a != null then a else b;
--replace eth0 ${cfg.interface} \
--replace 1111:: ${cfg.network} ndppdConf = prefer cfg.configFile (pkgs.writeText "ndppd.conf" ''
''; route-ttl ${toString cfg.routeTTL}
in { ${render cfg.proxies (proxyInterfaceName: proxy: ''
options = { proxy ${prefer proxy.interface proxyInterfaceName} {
services.ndppd = { router ${boolToString proxy.router}
enable = mkEnableOption "daemon that proxies NDP (Neighbor Discovery Protocol) messages between interfaces"; timeout ${toString proxy.timeout}
ttl ${toString proxy.ttl}
${render proxy.rules (ruleNetworkName: rule: ''
rule ${prefer rule.network ruleNetworkName} {
${rule.method}${if rule.method == "iface" then " ${rule.interface}" else ""}
}'')}
}'')}
'');
proxy = types.submodule {
options = {
interface = mkOption { interface = mkOption {
type = types.string; type = types.nullOr types.str;
default = "eth0"; description = ''
example = "ens3"; Listen for any Neighbor Solicitation messages on this interface,
description = "Interface which is on link-level with router."; and respond to them according to a set of rules.
}; Defaults to the name of the attrset.
network = mkOption { '';
type = types.string;
default = "1111::";
example = "2001:DB8::/32";
description = "Network that we proxy.";
};
configFile = mkOption {
type = types.nullOr types.path;
default = null; default = null;
description = "Path to configuration file.";
}; };
router = mkOption {
type = types.bool;
description = ''
Turns on or off the router flag for Neighbor Advertisement Messages.
'';
default = true;
};
timeout = mkOption {
type = types.int;
description = ''
Controls how long to wait for a Neighbor Advertisment Message before
invalidating the entry, in milliseconds.
'';
default = 500;
};
ttl = mkOption {
type = types.int;
description = ''
Controls how long a valid or invalid entry remains in the cache, in
milliseconds.
'';
default = 30000;
};
rules = mkOption {
type = types.attrsOf rule;
description = ''
This is a rule that the target address is to match against. If no netmask
is provided, /128 is assumed. You may have several rule sections, and the
addresses may or may not overlap.
'';
default = {};
};
};
};
rule = types.submodule {
options = {
network = mkOption {
type = types.nullOr types.str;
description = ''
This is the target address is to match against. If no netmask
is provided, /128 is assumed. The addresses of serveral rules
may or may not overlap.
Defaults to the name of the attrset.
'';
default = null;
};
method = mkOption {
type = types.enum [ "static" "iface" "auto" ];
description = ''
static: Immediately answer any Neighbor Solicitation Messages
(if they match the IP rule).
iface: Forward the Neighbor Solicitation Message through the specified
interface and only respond if a matching Neighbor Advertisement
Message is received.
auto: Same as iface, but instead of manually specifying the outgoing
interface, check for a matching route in /proc/net/ipv6_route.
'';
default = "auto";
};
interface = mkOption {
type = types.nullOr types.str;
description = "Interface to use when method is iface.";
default = null;
};
};
};
in {
options.services.ndppd = {
enable = mkEnableOption "daemon that proxies NDP (Neighbor Discovery Protocol) messages between interfaces";
interface = mkOption {
type = types.nullOr types.str;
description = ''
Interface which is on link-level with router.
(Legacy option, use services.ndppd.proxies.&lt;interface&gt;.rules.&lt;network&gt; instead)
'';
default = null;
example = "eth0";
};
network = mkOption {
type = types.nullOr types.str;
description = ''
Network that we proxy.
(Legacy option, use services.ndppd.proxies.&lt;interface&gt;.rules.&lt;network&gt; instead)
'';
default = null;
example = "1111::/64";
};
configFile = mkOption {
type = types.nullOr types.path;
description = "Path to configuration file.";
default = null;
};
routeTTL = mkOption {
type = types.int;
description = ''
This tells 'ndppd' how often to reload the route file /proc/net/ipv6_route,
in milliseconds.
'';
default = 30000;
};
proxies = mkOption {
type = types.attrsOf proxy;
description = ''
This sets up a listener, that will listen for any Neighbor Solicitation
messages, and respond to them according to a set of rules.
'';
default = {};
example = { "eth0".rules."1111::/64" = {}; };
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd.packages = [ pkgs.ndppd ]; warnings = mkIf (cfg.interface != null && cfg.network != null) [ ''
environment.etc."ndppd.conf".source = if (cfg.configFile != null) then cfg.configFile else configFile; The options services.ndppd.interface and services.ndppd.network will probably be removed soon,
please use services.ndppd.proxies.<interface>.rules.<network> instead.
'' ];
services.ndppd.proxies = mkIf (cfg.interface != null && cfg.network != null) {
"${cfg.interface}".rules."${cfg.network}" = {};
};
systemd.services.ndppd = { systemd.services.ndppd = {
serviceConfig.RuntimeDirectory = [ "ndppd" ]; description = "NDP Proxy Daemon";
documentation = [ "man:ndppd(1)" "man:ndppd.conf(5)" ];
after = [ "network-pre.target" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
serviceConfig.ExecStart = "${pkgs.ndppd}/bin/ndppd -c ${ndppdConf}";
}; };
}; };
meta.maintainers = with maintainers; [ gnidorah ];
} }

View File

@ -122,7 +122,7 @@ in {
systemd.packages = [ pkgs.syncthing ]; systemd.packages = [ pkgs.syncthing ];
users = mkIf (cfg.user == defaultUser) { users = mkIf (cfg.systemService && cfg.user == defaultUser) {
users."${defaultUser}" = users."${defaultUser}" =
{ group = cfg.group; { group = cfg.group;
home = cfg.dataDir; home = cfg.dataDir;

View File

@ -121,11 +121,12 @@ in
}; };
networking.firewall = mkIf cfg.openPorts { networking.firewall = mkIf cfg.openPorts {
# https://help.ubnt.com/hc/en-us/articles/204910084-UniFi-Change-Default-Ports-for-Controller-and-UAPs # https://help.ubnt.com/hc/en-us/articles/218506997
allowedTCPPorts = [ allowedTCPPorts = [
8080 # Port for UAP to inform controller. 8080 # Port for UAP to inform controller.
8880 # Port for HTTP portal redirect, if guest portal is enabled. 8880 # Port for HTTP portal redirect, if guest portal is enabled.
8843 # Port for HTTPS portal redirect, ditto. 8843 # Port for HTTPS portal redirect, ditto.
6789 # Port for UniFi mobile speed test.
]; ];
allowedUDPPorts = [ allowedUDPPorts = [
3478 # UDP port used for STUN. 3478 # UDP port used for STUN.

View File

@ -426,7 +426,7 @@ in {
"~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\\.php(?:$|/)" = { "~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\\.php(?:$|/)" = {
priority = 500; priority = 500;
extraConfig = '' extraConfig = ''
include ${pkgs.nginxMainline}/conf/fastcgi.conf; include ${config.services.nginx.package}/conf/fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS ${if cfg.https then "on" else "off"}; fastcgi_param HTTPS ${if cfg.https then "on" else "off"};

View File

@ -6,12 +6,14 @@ let
dmcfg = config.services.xserver.displayManager; dmcfg = config.services.xserver.displayManager;
ldmcfg = dmcfg.lightdm; ldmcfg = dmcfg.lightdm;
xcfg = config.services.xserver;
cfg = ldmcfg.greeters.gtk; cfg = ldmcfg.greeters.gtk;
inherit (pkgs) writeText; inherit (pkgs) writeText;
theme = cfg.theme.package; theme = cfg.theme.package;
icons = cfg.iconTheme.package; icons = cfg.iconTheme.package;
cursors = cfg.cursorTheme.package;
# The default greeter provided with this expression is the GTK greeter. # The default greeter provided with this expression is the GTK greeter.
# Again, we need a few things in the environment for the greeter to run with # Again, we need a few things in the environment for the greeter to run with
@ -28,7 +30,8 @@ let
--set GTK_EXE_PREFIX "${theme}" \ --set GTK_EXE_PREFIX "${theme}" \
--set GTK_DATA_PREFIX "${theme}" \ --set GTK_DATA_PREFIX "${theme}" \
--set XDG_DATA_DIRS "${theme}/share:${icons}/share" \ --set XDG_DATA_DIRS "${theme}/share:${icons}/share" \
--set XDG_CONFIG_HOME "${theme}/share" --set XDG_CONFIG_HOME "${theme}/share" \
--set XCURSOR_PATH "${cursors}/share/icons"
cat - > $out/lightdm-gtk-greeter.desktop << EOF cat - > $out/lightdm-gtk-greeter.desktop << EOF
[Desktop Entry] [Desktop Entry]
@ -44,9 +47,12 @@ let
[greeter] [greeter]
theme-name = ${cfg.theme.name} theme-name = ${cfg.theme.name}
icon-theme-name = ${cfg.iconTheme.name} icon-theme-name = ${cfg.iconTheme.name}
cursor-theme-name = ${cfg.cursorTheme.name}
cursor-theme-size = ${toString cfg.cursorTheme.size}
background = ${ldmcfg.background} background = ${ldmcfg.background}
${optionalString (cfg.clock-format != null) "clock-format = ${cfg.clock-format}"} ${optionalString (cfg.clock-format != null) "clock-format = ${cfg.clock-format}"}
${optionalString (cfg.indicators != null) "indicators = ${concatStringsSep ";" cfg.indicators}"} ${optionalString (cfg.indicators != null) "indicators = ${concatStringsSep ";" cfg.indicators}"}
${optionalString (xcfg.dpi != null) "xft-dpi=${toString xcfg.dpi}"}
${cfg.extraConfig} ${cfg.extraConfig}
''; '';
@ -106,6 +112,33 @@ in
}; };
cursorTheme = {
package = mkOption {
default = pkgs.gnome3.defaultIconTheme;
defaultText = "pkgs.gnome3.defaultIconTheme";
description = ''
The package path that contains the cursor theme given in the name option.
'';
};
name = mkOption {
type = types.str;
default = "Adwaita";
description = ''
Name of the cursor theme to use for the lightdm-gtk-greeter.
'';
};
size = mkOption {
type = types.int;
default = 16;
description = ''
Size of the cursor theme to use for the lightdm-gtk-greeter.
'';
};
};
clock-format = mkOption { clock-format = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;

View File

@ -33,7 +33,7 @@ let
avoid_warnings=1 avoid_warnings=1
'' + optional isAarch64 '' '' + optional isAarch64 ''
# Boot in 64-bit mode. # Boot in 64-bit mode.
arm_control=0x200 arm_64bit=1
'' + (if cfg.uboot.enable then '' '' + (if cfg.uboot.enable then ''
kernel=u-boot-rpi.bin kernel=u-boot-rpi.bin
'' else '' '' else ''

View File

@ -78,7 +78,7 @@ let cfg = config.system.autoUpgrade; in
HOME = "/root"; HOME = "/root";
} // config.networking.proxy.envVars; } // config.networking.proxy.envVars;
path = [ pkgs.gnutar pkgs.xz.bin config.nix.package.out ]; path = [ pkgs.gnutar pkgs.xz.bin pkgs.gitMinimal config.nix.package.out ];
script = '' script = ''
${config.system.build.nixos-rebuild}/bin/nixos-rebuild switch ${toString cfg.flags} ${config.system.build.nixos-rebuild}/bin/nixos-rebuild switch ${toString cfg.flags}

View File

@ -19,21 +19,21 @@ let
description = "The block device is backed by an encrypted one, adds this device as a initrd luks entry."; description = "The block device is backed by an encrypted one, adds this device as a initrd luks entry.";
}; };
options.blkDev = mkOption { blkDev = mkOption {
default = null; default = null;
example = "/dev/sda1"; example = "/dev/sda1";
type = types.nullOr types.str; type = types.nullOr types.str;
description = "Location of the backing encrypted device."; description = "Location of the backing encrypted device.";
}; };
options.label = mkOption { label = mkOption {
default = null; default = null;
example = "rootfs"; example = "rootfs";
type = types.nullOr types.str; type = types.nullOr types.str;
description = "Label of the unlocked encrypted device. Set <literal>fileSystems.&lt;name?&gt;.device</literal> to <literal>/dev/mapper/&lt;label&gt;</literal> to mount the unlocked device."; description = "Label of the unlocked encrypted device. Set <literal>fileSystems.&lt;name?&gt;.device</literal> to <literal>/dev/mapper/&lt;label&gt;</literal> to mount the unlocked device.";
}; };
options.keyFile = mkOption { keyFile = mkOption {
default = null; default = null;
example = "/mnt-root/root/.swapkey"; example = "/mnt-root/root/.swapkey";
type = types.nullOr types.str; type = types.nullOr types.str;

View File

@ -231,7 +231,7 @@ in
fsToSkipCheck = [ "none" "bindfs" "btrfs" "zfs" "tmpfs" "nfs" "vboxsf" "glusterfs" ]; fsToSkipCheck = [ "none" "bindfs" "btrfs" "zfs" "tmpfs" "nfs" "vboxsf" "glusterfs" ];
skipCheck = fs: fs.noCheck || fs.device == "none" || builtins.elem fs.fsType fsToSkipCheck; skipCheck = fs: fs.noCheck || fs.device == "none" || builtins.elem fs.fsType fsToSkipCheck;
# https://wiki.archlinux.org/index.php/fstab#Filepath_spaces # https://wiki.archlinux.org/index.php/fstab#Filepath_spaces
escape = string: builtins.replaceStrings [ " " ] [ "\\040" ] string; escape = string: builtins.replaceStrings [ " " "\t" ] [ "\\040" "\\011" ] string;
in '' in ''
# This is a generated file. Do not edit! # This is a generated file. Do not edit!
# #

View File

@ -129,6 +129,7 @@ in
matrix-synapse = handleTest ./matrix-synapse.nix {}; matrix-synapse = handleTest ./matrix-synapse.nix {};
memcached = handleTest ./memcached.nix {}; memcached = handleTest ./memcached.nix {};
mesos = handleTest ./mesos.nix {}; mesos = handleTest ./mesos.nix {};
minio = handleTest ./minio.nix {};
misc = handleTest ./misc.nix {}; misc = handleTest ./misc.nix {};
mongodb = handleTest ./mongodb.nix {}; mongodb = handleTest ./mongodb.nix {};
morty = handleTest ./morty.nix {}; morty = handleTest ./morty.nix {};
@ -142,6 +143,8 @@ in
nat.firewall = handleTest ./nat.nix { withFirewall = true; }; nat.firewall = handleTest ./nat.nix { withFirewall = true; };
nat.firewall-conntrack = handleTest ./nat.nix { withFirewall = true; withConntrackHelpers = true; }; nat.firewall-conntrack = handleTest ./nat.nix { withFirewall = true; withConntrackHelpers = true; };
nat.standalone = handleTest ./nat.nix { withFirewall = false; }; nat.standalone = handleTest ./nat.nix { withFirewall = false; };
ndppd = handleTest ./ndppd.nix {};
neo4j = handleTest ./neo4j.nix {};
netdata = handleTest ./netdata.nix {}; netdata = handleTest ./netdata.nix {};
networking.networkd = handleTest ./networking.nix { networkd = true; }; networking.networkd = handleTest ./networking.nix { networkd = true; };
networking.scripted = handleTest ./networking.nix { networkd = false; }; networking.scripted = handleTest ./networking.nix { networkd = false; };
@ -161,6 +164,7 @@ in
opensmtpd = handleTest ./opensmtpd.nix {}; opensmtpd = handleTest ./opensmtpd.nix {};
openssh = handleTest ./openssh.nix {}; openssh = handleTest ./openssh.nix {};
osquery = handleTest ./osquery.nix {}; osquery = handleTest ./osquery.nix {};
osrm-backend = handleTest ./osrm-backend.nix {};
ostree = handleTest ./ostree.nix {}; ostree = handleTest ./ostree.nix {};
pam-oath-login = handleTest ./pam-oath-login.nix {}; pam-oath-login = handleTest ./pam-oath-login.nix {};
pam-u2f = handleTest ./pam-u2f.nix {}; pam-u2f = handleTest ./pam-u2f.nix {};

View File

@ -50,6 +50,18 @@ in {
} }
]; ];
}; };
lovelaceConfig = {
title = "My Awesome Home";
views = [ {
title = "Example";
cards = [ {
type = "markdown";
title = "Lovelace";
content = "Welcome to your **Lovelace UI**.";
} ];
} ];
};
lovelaceConfigWritable = true;
}; };
}; };
}; };
@ -59,8 +71,10 @@ in {
$hass->waitForUnit("home-assistant.service"); $hass->waitForUnit("home-assistant.service");
# The config is specified using a Nix attribute set, # The config is specified using a Nix attribute set,
# but then converted from JSON to YAML # converted from JSON to YAML, and linked to the config dir
$hass->succeed("test -f ${configDir}/configuration.yaml"); $hass->succeed("test -L ${configDir}/configuration.yaml");
# The lovelace config is copied because lovelaceConfigWritable = true
$hass->succeed("test -f ${configDir}/ui-lovelace.yaml");
# Check that Home Assistant's web interface and API can be reached # Check that Home Assistant's web interface and API can be reached
$hass->waitForOpenPort(8123); $hass->waitForOpenPort(8123);

View File

@ -1,77 +1,91 @@
import ../make-test.nix ({ pkgs, ...} : { system ? builtins.currentSystem
, config ? { }
, pkgs ? import ../../.. { inherit system config; }
}:
let let
trivialJob = pkgs.writeTextDir "trivial.nix" ''
{ trivial = builtins.derivation {
name = "trivial";
system = "x86_64-linux";
builder = "/bin/sh";
args = ["-c" "echo success > $out; exit 0"];
};
}
'';
createTrivialProject = pkgs.stdenv.mkDerivation { trivialJob = pkgs.writeTextDir "trivial.nix" ''
name = "create-trivial-project"; { trivial = builtins.derivation {
unpackPhase = ":"; name = "trivial";
buildInputs = [ pkgs.makeWrapper ]; system = "x86_64-linux";
installPhase = "install -m755 -D ${./create-trivial-project.sh} $out/bin/create-trivial-project.sh"; builder = "/bin/sh";
postFixup = '' args = ["-c" "echo success > $out; exit 0"];
wrapProgram "$out/bin/create-trivial-project.sh" --prefix PATH ":" ${pkgs.stdenv.lib.makeBinPath [ pkgs.curl ]} --set EXPR_PATH ${trivialJob} };
''; }
}; '';
in { createTrivialProject = pkgs.stdenv.mkDerivation {
name = "hydra-init-localdb"; name = "create-trivial-project";
meta = with pkgs.stdenv.lib.maintainers; { unpackPhase = ":";
maintainers = [ pstn lewo ma27 ]; buildInputs = [ pkgs.makeWrapper ];
installPhase = "install -m755 -D ${./create-trivial-project.sh} $out/bin/create-trivial-project.sh";
postFixup = ''
wrapProgram "$out/bin/create-trivial-project.sh" --prefix PATH ":" ${pkgs.stdenv.lib.makeBinPath [ pkgs.curl ]} --set EXPR_PATH ${trivialJob}
'';
}; };
machine = callTest = f: f { inherit system pkgs; };
{ pkgs, ... }:
{ hydraPkgs = {
virtualisation.memorySize = 1024; inherit (pkgs) nixStable nixUnstable;
time.timeZone = "UTC"; };
environment.systemPackages = [ createTrivialProject pkgs.jq ]; tests = pkgs.lib.flip pkgs.lib.mapAttrs hydraPkgs (name: nix:
services.hydra = { callTest (import ../make-test.nix ({ pkgs, lib, ... }:
enable = true; {
name = "hydra-with-${name}";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ pstn lewo ma27 ];
};
#Hydra needs those settings to start up, so we add something not harmfull. machine = { pkgs, ... }:
hydraURL = "example.com"; {
notificationSender = "example@example.com"; virtualisation.memorySize = 1024;
}; time.timeZone = "UTC";
nix = {
buildMachines = [{
hostName = "localhost";
systems = [ "x86_64-linux" ];
}];
binaryCaches = []; environment.systemPackages = [ createTrivialProject pkgs.jq ];
}; services.hydra = {
}; enable = true;
testScript = #Hydra needs those settings to start up, so we add something not harmfull.
'' hydraURL = "example.com";
# let the system boot up notificationSender = "example@example.com";
$machine->waitForUnit("multi-user.target");
# test whether the database is running
$machine->succeed("systemctl status postgresql.service");
# test whether the actual hydra daemons are running
$machine->succeed("systemctl status hydra-queue-runner.service");
$machine->succeed("systemctl status hydra-init.service");
$machine->succeed("systemctl status hydra-evaluator.service");
$machine->succeed("systemctl status hydra-send-stats.service");
$machine->succeed("hydra-create-user admin --role admin --password admin"); package = pkgs.hydra.override { inherit nix; };
};
nix = {
buildMachines = [{
hostName = "localhost";
systems = [ "x86_64-linux" ];
}];
# create a project with a trivial job binaryCaches = [];
$machine->waitForOpenPort(3000); };
};
# make sure the build as been successfully built testScript = ''
$machine->succeed("create-trivial-project.sh"); # let the system boot up
$machine->waitForUnit("multi-user.target");
# test whether the database is running
$machine->succeed("systemctl status postgresql.service");
# test whether the actual hydra daemons are running
$machine->succeed("systemctl status hydra-queue-runner.service");
$machine->succeed("systemctl status hydra-init.service");
$machine->succeed("systemctl status hydra-evaluator.service");
$machine->succeed("systemctl status hydra-send-stats.service");
$machine->waitUntilSucceeds('curl -L -s http://localhost:3000/build/1 -H "Accept: application/json" | jq .buildstatus | xargs test 0 -eq'); $machine->succeed("hydra-create-user admin --role admin --password admin");
'';
}) # create a project with a trivial job
$machine->waitForOpenPort(3000);
# make sure the build as been successfully built
$machine->succeed("create-trivial-project.sh");
$machine->waitUntilSucceeds('curl -L -s http://localhost:3000/build/1 -H "Accept: application/json" | jq .buildstatus | xargs test 0 -eq');
'';
})));
in
tests

View File

@ -1,4 +1,32 @@
import ./make-test.nix ({ pkgs, ... } : { import ./make-test.nix ({ pkgs, ... } : let
runWithOpenSSL = file: cmd: pkgs.runCommand file {
buildInputs = [ pkgs.openssl ];
} cmd;
ca_key = runWithOpenSSL "ca-key.pem" "openssl genrsa -out $out 2048";
ca_pem = runWithOpenSSL "ca.pem" ''
openssl req \
-x509 -new -nodes -key ${ca_key} \
-days 10000 -out $out -subj "/CN=snakeoil-ca"
'';
key = runWithOpenSSL "matrix_key.pem" "openssl genrsa -out $out 2048";
csr = runWithOpenSSL "matrix.csr" ''
openssl req \
-new -key ${key} \
-out $out -subj "/CN=localhost" \
'';
cert = runWithOpenSSL "matrix_cert.pem" ''
openssl x509 \
-req -in ${csr} \
-CA ${ca_pem} -CAkey ${ca_key} \
-CAcreateserial -out $out \
-days 365
'';
in {
name = "matrix-synapse"; name = "matrix-synapse";
meta = with pkgs.stdenv.lib.maintainers; { meta = with pkgs.stdenv.lib.maintainers; {
@ -8,23 +36,31 @@ import ./make-test.nix ({ pkgs, ... } : {
nodes = { nodes = {
# Since 0.33.0, matrix-synapse doesn't allow underscores in server names # Since 0.33.0, matrix-synapse doesn't allow underscores in server names
serverpostgres = args: { serverpostgres = args: {
services.matrix-synapse.enable = true; services.matrix-synapse = {
services.matrix-synapse.database_type = "psycopg2"; enable = true;
database_type = "psycopg2";
tls_certificate_path = "${cert}";
tls_private_key_path = "${key}";
};
}; };
serversqlite = args: { serversqlite = args: {
services.matrix-synapse.enable = true; services.matrix-synapse = {
services.matrix-synapse.database_type = "sqlite3"; enable = true;
database_type = "sqlite3";
tls_certificate_path = "${cert}";
tls_private_key_path = "${key}";
};
}; };
}; };
testScript = '' testScript = ''
startAll; startAll;
$serverpostgres->waitForUnit("matrix-synapse.service"); $serverpostgres->waitForUnit("matrix-synapse.service");
$serverpostgres->waitUntilSucceeds("curl -Lk https://localhost:8448/"); $serverpostgres->waitUntilSucceeds("curl -L --cacert ${ca_pem} https://localhost:8448/");
$serverpostgres->requireActiveUnit("postgresql.service"); $serverpostgres->requireActiveUnit("postgresql.service");
$serversqlite->waitForUnit("matrix-synapse.service"); $serversqlite->waitForUnit("matrix-synapse.service");
$serversqlite->waitUntilSucceeds("curl -Lk https://localhost:8448/"); $serversqlite->waitUntilSucceeds("curl -L --cacert ${ca_pem} https://localhost:8448/");
$serversqlite->mustSucceed("[ -e /var/lib/matrix-synapse/homeserver.db ]"); $serversqlite->mustSucceed("[ -e /var/lib/matrix-synapse/homeserver.db ]");
''; '';

View File

@ -15,9 +15,7 @@ import ./make-test.nix ({ pkgs, ...} : {
munin-node = { munin-node = {
enable = true; enable = true;
# disable a failing plugin to prevent irrelevant error message, see #23049 # disable a failing plugin to prevent irrelevant error message, see #23049
extraConfig = '' disabledPlugins = [ "apc_nis" ];
ignore_file ^apc_nis$
'';
}; };
munin-cron = { munin-cron = {
enable = true; enable = true;

61
nixos/tests/ndppd.nix Normal file
View File

@ -0,0 +1,61 @@
import ./make-test.nix ({ pkgs, lib, ...} : {
name = "ndppd";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ fpletz ];
};
nodes = {
upstream = { pkgs, ... }: {
environment.systemPackages = [ pkgs.tcpdump ];
networking.useDHCP = false;
networking.interfaces = {
eth1 = {
ipv6.addresses = [
{ address = "fd23::1"; prefixLength = 112; }
];
ipv6.routes = [
{ address = "fd42::";
prefixLength = 112;
}
];
};
};
};
server = { pkgs, ... }: {
boot.kernel.sysctl = {
"net.ipv6.conf.all.forwarding" = "1";
"net.ipv6.conf.default.forwarding" = "1";
};
environment.systemPackages = [ pkgs.tcpdump ];
networking.useDHCP = false;
networking.interfaces = {
eth1 = {
ipv6.addresses = [
{ address = "fd23::2"; prefixLength = 112; }
];
};
};
services.ndppd = {
enable = true;
interface = "eth1";
network = "fd42::/112";
};
containers.client = {
autoStart = true;
privateNetwork = true;
hostAddress = "192.168.255.1";
localAddress = "192.168.255.2";
hostAddress6 = "fd42::1";
localAddress6 = "fd42::2";
config = {};
};
};
};
testScript = ''
startAll;
$server->waitForUnit("multi-user.target");
$upstream->waitForUnit("multi-user.target");
$upstream->waitUntilSucceeds("ping -c5 fd42::2");
'';
})

20
nixos/tests/neo4j.nix Normal file
View File

@ -0,0 +1,20 @@
import ./make-test.nix {
name = "neo4j";
nodes = {
master =
{ ... }:
{
services.neo4j.enable = true;
};
};
testScript = ''
startAll;
$master->waitForUnit("neo4j");
$master->sleep(20); # Hopefully this is long enough!!
$master->succeed("curl http://localhost:7474/");
'';
}

View File

@ -0,0 +1,53 @@
import ./make-test.nix ({ pkgs, lib, ... }:
let
port = 5000;
in {
name = "osrm-backend";
meta.maintainers = [ lib.maintainers.erictapen ];
machine = { config, pkgs, ... }:{
services.osrm = {
enable = true;
inherit port;
dataFile = let
filename = "monaco";
osrm-data = pkgs.stdenv.mkDerivation {
name = "osrm-data";
buildInputs = [ pkgs.osrm-backend ];
# This is a pbf file of monaco, downloaded at 2019-01-04 from
# http://download.geofabrik.de/europe/monaco-latest.osm.pbf
# as apparently no provider of OSM files guarantees immutability,
# this is hosted as a gist on GitHub.
src = pkgs.fetchgit {
url = "https://gist.github.com/erictapen/01e39f73a6c856eac53ba809a94cdb83";
rev = "9b1ff0f24deb40e5cf7df51f843dbe860637b8ce";
sha256 = "1scqhmrfnpwsy5i2a9jpggqnvfgj4hv9p4qyvc79321pzkbv59nx";
};
buildCommand = ''
cp $src/${filename}.osm.pbf .
${pkgs.osrm-backend}/bin/osrm-extract -p ${pkgs.osrm-backend}/share/osrm/profiles/car.lua ${filename}.osm.pbf
${pkgs.osrm-backend}/bin/osrm-partition ${filename}.osrm
${pkgs.osrm-backend}/bin/osrm-customize ${filename}.osrm
mkdir -p $out
cp ${filename}* $out/
'';
};
in "${osrm-data}/${filename}.osrm";
};
environment.systemPackages = [ pkgs.jq ];
};
testScript = let
query = "http://localhost:${toString port}/route/v1/driving/7.41720,43.73304;7.42463,43.73886?steps=true";
in ''
$machine->waitForUnit("osrm.service");
$machine->waitForOpenPort(${toString port});
$machine->succeed("curl --silent '${query}' | jq .waypoints[0].name | grep -F 'Boulevard Rainier III'");
$machine->succeed("curl --silent '${query}' | jq .waypoints[1].name | grep -F 'Avenue de la Costa'");
'';
})

View File

@ -7,7 +7,7 @@ with import ../lib/testing.nix { inherit system pkgs; };
with pkgs.lib; with pkgs.lib;
let let
postgresql-versions = import ../../pkgs/servers/sql/postgresql pkgs pkgs; postgresql-versions = import ../../pkgs/servers/sql/postgresql pkgs;
test-sql = pkgs.writeText "postgresql-test" '' test-sql = pkgs.writeText "postgresql-test" ''
CREATE EXTENSION pgcrypto; -- just to check if lib loading works CREATE EXTENSION pgcrypto; -- just to check if lib loading works
CREATE TABLE sth ( CREATE TABLE sth (
@ -67,12 +67,7 @@ let
}; };
in in
(mapAttrs' (name: package: { inherit name; value=make-postgresql-test name package false;}) postgresql-versions) // ( (mapAttrs' (name: package: { inherit name; value=make-postgresql-test name package false;}) postgresql-versions) // {
# just pick one version for the dump all test postgresql_11-backup-all = make-postgresql-test "postgresql_11-backup-all" postgresql-versions.postgresql_11 true;
let }
first = head (attrNames postgresql-versions);
name = "${first}-backup-all";
in {
${name} = make-postgresql-test name postgresql-versions.${first} true;
}
)

View File

@ -1,40 +1,58 @@
import ./make-test.nix ({ pkgs, lib, ... }: { system ? builtins.currentSystem,
config ? {},
pkgs ? import ../.. { inherit system config; }
}:
with import ../lib/testing.nix { inherit system pkgs; };
with pkgs.lib;
let
redmineTest = package: makeTest {
machine =
{ config, pkgs, ... }:
{ services.mysql.enable = true;
services.mysql.package = pkgs.mariadb;
services.mysql.ensureDatabases = [ "redmine" ];
services.mysql.ensureUsers = [
{ name = "redmine";
ensurePermissions = { "redmine.*" = "ALL PRIVILEGES"; };
}
];
services.redmine.enable = true;
services.redmine.package = package;
services.redmine.database.socket = "/run/mysqld/mysqld.sock";
services.redmine.plugins = {
redmine_env_auth = pkgs.fetchurl {
url = https://github.com/Intera/redmine_env_auth/archive/0.7.zip;
sha256 = "1xb8lyarc7mpi86yflnlgyllh9hfwb9z304f19dx409gqpia99sc";
};
};
services.redmine.themes = {
dkuk-redmine_alex_skin = pkgs.fetchurl {
url = https://bitbucket.org/dkuk/redmine_alex_skin/get/1842ef675ef3.zip;
sha256 = "0hrin9lzyi50k4w2bd2b30vrf1i4fi1c0gyas5801wn8i7kpm9yl";
};
};
};
testScript = ''
startAll;
$machine->waitForUnit('redmine.service');
$machine->waitForOpenPort('3000');
$machine->succeed("curl --fail http://localhost:3000/");
'';
};
in
{ {
name = "redmine"; redmine_3 = redmineTest pkgs.redmine // {
meta.maintainers = [ lib.maintainers.aanderse ]; name = "redmine_3";
meta.maintainers = [ maintainers.aanderse ];
};
machine = redmine_4 = redmineTest pkgs.redmine_4 // {
{ config, pkgs, ... }: name = "redmine_4";
{ services.mysql.enable = true; meta.maintainers = [ maintainers.aanderse ];
services.mysql.package = pkgs.mariadb; };
services.mysql.ensureDatabases = [ "redmine" ]; }
services.mysql.ensureUsers = [
{ name = "redmine";
ensurePermissions = { "redmine.*" = "ALL PRIVILEGES"; };
}
];
services.redmine.enable = true;
services.redmine.database.socket = "/run/mysqld/mysqld.sock";
services.redmine.plugins = {
redmine_env_auth = pkgs.fetchurl {
url = https://github.com/Intera/redmine_env_auth/archive/0.6.zip;
sha256 = "0yyr1yjd8gvvh832wdc8m3xfnhhxzk2pk3gm2psg5w9jdvd6skak";
};
};
services.redmine.themes = {
dkuk-redmine_alex_skin = pkgs.fetchurl {
url = https://bitbucket.org/dkuk/redmine_alex_skin/get/1842ef675ef3.zip;
sha256 = "0hrin9lzyi50k4w2bd2b30vrf1i4fi1c0gyas5801wn8i7kpm9yl";
};
};
};
testScript = ''
startAll;
$machine->waitForUnit('redmine.service');
$machine->waitForOpenPort('3000');
$machine->succeed("curl --fail http://localhost:3000/");
'';
})

View File

@ -10,6 +10,8 @@ import ./make-test.nix ({ pkgs, ...} : {
enable = true; enable = true;
hostName = "roundcube"; hostName = "roundcube";
database.password = "notproduction"; database.password = "notproduction";
package = pkgs.roundcube.withPlugins (plugins: [ plugins.persistent_login ]);
plugins = [ "persistent_login" ];
}; };
services.nginx.virtualHosts.roundcube = { services.nginx.virtualHosts.roundcube = {
forceSSL = false; forceSSL = false;
@ -23,6 +25,6 @@ import ./make-test.nix ({ pkgs, ...} : {
$roundcube->waitForUnit("postgresql.service"); $roundcube->waitForUnit("postgresql.service");
$roundcube->waitForUnit("phpfpm-roundcube.service"); $roundcube->waitForUnit("phpfpm-roundcube.service");
$roundcube->waitForUnit("nginx.service"); $roundcube->waitForUnit("nginx.service");
$roundcube->succeed("curl -sSfL http://roundcube/"); $roundcube->succeed("curl -sSfL http://roundcube/ | grep 'Keep me logged in'");
''; '';
}) })

View File

@ -1,6 +1,6 @@
let let
version = "2.3.0"; version = "2.3.1";
sha256 = "0v79nz19riaga6iwj6m59fq8adm5llrkq61xizriz30rw8rkk04z"; sha256 = "13y3gczqb0rb6v17j63j1zp11cnykbv9c674hrk1i6jb3y4am4lv";
cargoSha256 = "01vdrfqh2nlghbgnbb7qmrazsjmynrb9542qrgchxq589wasb4j2"; cargoSha256 = "1pj5hzy7k1l9bbw1qpz80vvk89qz4qz4rnnkcvn2rkbmq382gxwy";
in in
import ./parity.nix { inherit version sha256 cargoSha256; } import ./parity.nix { inherit version sha256 cargoSha256; }

View File

@ -1,6 +1,6 @@
let let
version = "2.2.7"; version = "2.2.8";
sha256 = "0bxq4z84vsb8hmbscr41xiw11m9xg6if231v76c2dmkbyqgpqy8p"; sha256 = "1l2bxra4fkbh8gnph9wnc24ddmzfdclsgcjbx8q6fflhcg6r9hf1";
cargoSha256 = "1izwqg87qxhmmkd49m0k09i7r05sfcb18m5jbpvggjzp57ips09r"; cargoSha256 = "10lg0vzikzlj927hpn59x1dz9dvhcaqsl8nz14vj2iz42vfkcm7p";
in in
import ./parity.nix { inherit version sha256 cargoSha256; } import ./parity.nix { inherit version sha256 cargoSha256; }

View File

@ -100,13 +100,13 @@ in
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "cmus-${version}"; name = "cmus-${version}";
version = "2.7.1"; version = "2.8.0";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "cmus"; owner = "cmus";
repo = "cmus"; repo = "cmus";
rev = "v${version}"; rev = "v${version}";
sha256 = "0xd96py21bl869qlv1353zw7xsgq6v5s8szr0ldr63zj5fgc2ps5"; sha256 = "1ydnvq13ay8b8mfmmgwi5qsgyf220yi1d01acbnxqn775dghmwar";
}; };
patches = [ ./option-debugging.patch ]; patches = [ ./option-debugging.patch ];

View File

@ -5,13 +5,13 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "flacon-${version}"; name = "flacon-${version}";
version = "5.0.0"; version = "5.1.0";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "flacon"; owner = "flacon";
repo = "flacon"; repo = "flacon";
rev = "v${version}"; rev = "v${version}";
sha256 = "0pglqm2z7mp5igqmfnmvrgjhfbfrj8q5jvd0a0g2dzv3rqwfw4vc"; sha256 = "18m077z1hqjg10chy5rgajd9q1wnrcxhiidivgjcdchc9q5d4b08";
}; };
nativeBuildInputs = [ cmake pkgconfig makeWrapper ]; nativeBuildInputs = [ cmake pkgconfig makeWrapper ];

View File

@ -2,13 +2,12 @@
libsamplerate, libpulseaudio, libXinerama, gettext, pkgconfig, alsaLib }: libsamplerate, libpulseaudio, libXinerama, gettext, pkgconfig, alsaLib }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "4.0.18"; version = "4.1.00";
pname = "fldigi"; pname = "fldigi";
name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "mirror://sourceforge/${pname}/${name}.tar.gz"; url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
sha256 = "0a3z9xj9gsa6fskiai9410kwqfb6156km59y36a31mhyddzk27p7"; sha256 = "1hm2n4p3pdd029kizgzwf3zzgsy1m6z83z7rr2kyjhrq2vp5gf0s";
}; };
buildInputs = [ libXinerama gettext hamlib fltk13 libjpeg libpng portaudio buildInputs = [ libXinerama gettext hamlib fltk13 libjpeg libpng portaudio

View File

@ -5,14 +5,14 @@
python3Packages.buildPythonApplication rec { python3Packages.buildPythonApplication rec {
pname = "gpodder"; pname = "gpodder";
version = "3.10.6"; version = "3.10.7";
format = "other"; format = "other";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "gpodder"; owner = pname;
repo = "gpodder"; repo = pname;
rev = version; rev = version;
sha256 = "11nccsnlxrj8wwl8dyz9a0yrzma6ipx5gwj2lc7m308z60r8wvjs"; sha256 = "0sx9rj6dpvd2xz7lak2yi0zlgr3lp2ng1fw23s39la9ly4g1835j";
}; };
postPatch = with stdenv.lib; '' postPatch = with stdenv.lib; ''

View File

@ -5,14 +5,14 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "lsp-plugins"; pname = "lsp-plugins";
version = "1.1.4"; version = "1.1.5";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "sadko4u"; owner = "sadko4u";
repo = "${pname}"; repo = "${pname}";
rev = "${name}"; rev = "${name}";
sha256 = "0vb8ax0w4d2a153wxrhkpi21fxsv7c24k57vhfgmm1lqwv6pbl69"; sha256 = "0xcxm47j7mz5vprjqqhi95gz62syp4y737h7cssxd3flqkgar7xr";
}; };
nativeBuildInputs = [ pkgconfig php expat ]; nativeBuildInputs = [ pkgconfig php expat ];

View File

@ -2,11 +2,11 @@
pythonPackages.buildPythonApplication rec { pythonPackages.buildPythonApplication rec {
pname = "Mopidy-Iris"; pname = "Mopidy-Iris";
version = "3.31.8"; version = "3.32.4";
src = pythonPackages.fetchPypi { src = pythonPackages.fetchPypi {
inherit pname version; inherit pname version;
sha256 = "16rrvby6rdiz53minfqsbgmymnc4agi2iwp0pf5ahsaxp1xq0cqy"; sha256 = "16b3dkxland4mjzjs2rz5gbqjapzzmap4d1mfhbrj2ch3plmdy7g";
}; };
propagatedBuildInputs = [ propagatedBuildInputs = [

View File

@ -23,13 +23,13 @@ let
in stdenv.mkDerivation rec { in stdenv.mkDerivation rec {
name = "pulseaudio-modules-bt-${version}"; name = "pulseaudio-modules-bt-${version}";
version = "unstable-2018-11-01"; version = "unstable-2019-01-05";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "EHfive"; owner = "EHfive";
repo = "pulseaudio-modules-bt"; repo = "pulseaudio-modules-bt";
rev = "a2f62fcaa702bb883c07d074ebca8d7135520ab8"; rev = "4b0cde160c96f40d860fef267a6ded49ae045be0";
sha256 = "1fhg7q9064zikhy0xxldn4fvh49pc47mgikcbd9yhsk66gcn6zj3"; sha256 = "15jw5nf2dhqqdwzyh2x5kdkrq7f3qn140gw6gmspcai9kplhk24w";
fetchSubmodules = true; fetchSubmodules = true;
}; };

View File

@ -3,12 +3,12 @@
, libGLU, lv2, gtk2, cairo, pango, fftwFloat, zita-convolver }: , libGLU, lv2, gtk2, cairo, pango, fftwFloat, zita-convolver }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "20181103"; version = "20190105";
name = "x42-plugins-${version}"; name = "x42-plugins-${version}";
src = fetchurl { src = fetchurl {
url = "https://gareus.org/misc/x42-plugins/${name}.tar.xz"; url = "https://gareus.org/misc/x42-plugins/${name}.tar.xz";
sha256 = "085d6qjj7nl22f0xamqdrnfxwi8zrfwgkwm1svm73bjkdv270438"; sha256 = "1bb7k3ly4qa05zgkbpm7d3x9cjch1fklgh279m6hp0ac3hhncdxp";
}; };
nativeBuildInputs = [ pkgconfig ]; nativeBuildInputs = [ pkgconfig ];

View File

@ -6,11 +6,11 @@ assert stdenv ? glibc;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "yoshimi-${version}"; name = "yoshimi-${version}";
version = "1.5.10"; version = "1.5.10.1";
src = fetchurl { src = fetchurl {
url = "mirror://sourceforge/yoshimi/${name}.tar.bz2"; url = "mirror://sourceforge/yoshimi/${name}.tar.bz2";
sha256 = "0mazzn5pc4xnjci3yy1yfsx9l05gkxqzkmscaq1h75jpa7qfsial"; sha256 = "02mmy17sa3dlwmjjahn8rfd6h67c5s0q3fvkf6ljrc2mbbpwc375";
}; };
buildInputs = [ buildInputs = [

View File

@ -8,19 +8,19 @@ let
inherit (gnome2) GConf gnome_vfs; inherit (gnome2) GConf gnome_vfs;
}; };
stableVersion = { stableVersion = {
version = "3.3.0.20"; # "Android Studio 3.3" version = "3.3.1.0"; # "Android Studio 3.3.1"
build = "182.5199772"; build = "182.5264788";
sha256Hash = "0dracganibnkyapn2pk2qqnxpwmii57371ycri4nccaci9v9pcjw"; sha256Hash = "0fghqkc8pkb7waxclm0qq4nlnsvmv9d3fcj5nnvgbfkjyw032q42";
}; };
betaVersion = { betaVersion = {
version = "3.4.0.11"; # "Android Studio 3.4 Beta 2" version = "3.4.0.12"; # "Android Studio 3.4 Beta 3"
build = "183.5240537"; build = "183.5256591";
sha256Hash = "0mv7ayqjkw97jzdifw1cdvjhnzygzkd2a9rc0h99fclhf2nii5yr"; sha256Hash = "1yab2sgabgk3wa3wrzv9z1dc2k7x0079v0mlwrp32jwx8r9byvcw";
}; };
latestVersion = { # canary & dev latestVersion = { # canary & dev
version = "3.5.0.1"; # "Android Studio 3.5 Canary 2" version = "3.5.0.2"; # "Android Studio 3.5 Canary 3"
build = "183.5240547"; build = "183.5256920";
sha256Hash = "0z52ig9v2w9i6bqiqpdvgcr6g6sgl8p5317jamg72d5csm9hgfx3"; sha256Hash = "09bd80ld21hq743xjacsq0nkxwl5xzr253p86n71n580yn4rgmlb";
}; };
in rec { in rec {
# Old alias (TODO @primeos: Remove after 19.03 is branched off): # Old alias (TODO @primeos: Remove after 19.03 is branched off):

View File

@ -2,11 +2,11 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "dhex-${version}"; name = "dhex-${version}";
version = "0.68"; version = "0.69";
src = fetchurl { src = fetchurl {
url = "http://www.dettus.net/dhex/dhex_${version}.tar.gz"; url = "http://www.dettus.net/dhex/dhex_${version}.tar.gz";
sha256 = "126c34745b48a07448cfe36fe5913d37ec562ad72d3f732b99bd40f761f4da08"; sha256 = "06y4lrp29f2fh303ijk1xhspa1d4x4dm6hnyw3dd8szi3k6hnwsj";
}; };
buildInputs = [ ncurses ]; buildInputs = [ ncurses ];

View File

@ -42,6 +42,7 @@ stdenv.mkDerivation rec {
patches = [ patches = [
./clean-env.patch ./clean-env.patch
./tramp-detect-wrapped-gvfsd.patch
]; ];
postPatch = lib.optionalString srcRepo '' postPatch = lib.optionalString srcRepo ''

View File

@ -0,0 +1,14 @@
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index f370abba31..f2806263a9 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -164,7 +164,8 @@ tramp-gvfs-enabled
(and (featurep 'dbusbind)
(tramp-compat-funcall 'dbus-get-unique-name :system)
(tramp-compat-funcall 'dbus-get-unique-name :session)
- (or (tramp-compat-process-running-p "gvfs-fuse-daemon")
+ (or (tramp-compat-process-running-p ".gvfsd-fuse-wrapped")
+ (tramp-compat-process-running-p "gvfs-fuse-daemon")
(tramp-compat-process-running-p "gvfsd-fuse"))))
"Non-nil when GVFS is available.")

View File

@ -250,145 +250,145 @@ in
clion = buildClion rec { clion = buildClion rec {
name = "clion-${version}"; name = "clion-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "C/C++ IDE. New. Intelligent. Cross-platform"; description = "C/C++ IDE. New. Intelligent. Cross-platform";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/cpp/CLion-${version}.tar.gz"; url = "https://download.jetbrains.com/cpp/CLion-${version}.tar.gz";
sha256 = "1pffxq69ihdc55lsy2q56vlanpgyks0g82n40b29j4m66flmxbkl"; /* updated by script */ sha256 = "1zglpw9vc3ybdmwymi0c2m6anhcmx9jcqi69gnn06n9f4x1v6gwn"; /* updated by script */
}; };
wmClass = "jetbrains-clion"; wmClass = "jetbrains-clion";
update-channel = "CLion Release"; # channel's id as in http://www.jetbrains.com/updates/updates.xml update-channel = "CLion RELEASE"; # channel's id as in http://www.jetbrains.com/updates/updates.xml
}; };
datagrip = buildDataGrip rec { datagrip = buildDataGrip rec {
name = "datagrip-${version}"; name = "datagrip-${version}";
version = "2018.2.5"; /* updated by script */ version = "2018.3.2"; /* updated by script */
description = "Your Swiss Army Knife for Databases and SQL"; description = "Your Swiss Army Knife for Databases and SQL";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/datagrip/${name}.tar.gz"; url = "https://download.jetbrains.com/datagrip/${name}.tar.gz";
sha256 = "0ls3qas8z0d1ynn6hh42qipa5br2g2497wf3pgcw3q0m3kp6wida"; /* updated by script */ sha256 = "0vj1cgmg33626i38x9wmh5hqr1lf0x3m23gzq30rp4q4cbi38806"; /* updated by script */
}; };
wmClass = "jetbrains-datagrip"; wmClass = "jetbrains-datagrip";
update-channel = "DataGrip 2018.2"; update-channel = "DataGrip RELEASE";
}; };
goland = buildGoland rec { goland = buildGoland rec {
name = "goland-${version}"; name = "goland-${version}";
version = "2018.3.2"; /* updated by script */ version = "2018.3.3"; /* updated by script */
description = "Up and Coming Go IDE"; description = "Up and Coming Go IDE";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/go/${name}.tar.gz"; url = "https://download.jetbrains.com/go/${name}.tar.gz";
sha256 = "0vnw6zc23dibpk1z7yg1lrgjznqc7508g1azybml878h6yykm5a4"; /* updated by script */ sha256 = "065z8084xkv6w8m7pq98rgls1avzrqm23mrxdq5172rs5p1c5r9f"; /* updated by script */
}; };
wmClass = "jetbrains-goland"; wmClass = "jetbrains-goland";
update-channel = "GoLand Release"; update-channel = "GoLand RELEASE";
}; };
idea-community = buildIdea rec { idea-community = buildIdea rec {
name = "idea-community-${version}"; name = "idea-community-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "Integrated Development Environment (IDE) by Jetbrains, community edition"; description = "Integrated Development Environment (IDE) by Jetbrains, community edition";
license = stdenv.lib.licenses.asl20; license = stdenv.lib.licenses.asl20;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/idea/ideaIC-${version}.tar.gz"; url = "https://download.jetbrains.com/idea/ideaIC-${version}.tar.gz";
sha256 = "1c9x3m7dknqr6yxqnn2ch3akwm6yskpmy32hcbjg7s87g1n6gy8m"; /* updated by script */ sha256 = "0j5yc7n04jlyyghmwllpfvcd2g6k1syjp07xb1ljyx7rm4jcf8q6"; /* updated by script */
}; };
wmClass = "jetbrains-idea-ce"; wmClass = "jetbrains-idea-ce";
update-channel = "IntelliJ IDEA Release"; update-channel = "IntelliJ IDEA RELEASE";
}; };
idea-ultimate = buildIdea rec { idea-ultimate = buildIdea rec {
name = "idea-ultimate-${version}"; name = "idea-ultimate-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "Integrated Development Environment (IDE) by Jetbrains, requires paid license"; description = "Integrated Development Environment (IDE) by Jetbrains, requires paid license";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/idea/ideaIU-${version}-no-jdk.tar.gz"; url = "https://download.jetbrains.com/idea/ideaIU-${version}-no-jdk.tar.gz";
sha256 = "1dj39hs63xba2jfk3sd2yiq7vk7758axrc5549krfd1aaawl4sl8"; /* updated by script */ sha256 = "0s3r3h1zcwkfqhsfb224fgy62fdhnd4gjgk2h6pyhq1frnh3x5bg"; /* updated by script */
}; };
wmClass = "jetbrains-idea"; wmClass = "jetbrains-idea";
update-channel = "IntelliJ IDEA Release"; update-channel = "IntelliJ IDEA RELEASE";
}; };
phpstorm = buildPhpStorm rec { phpstorm = buildPhpStorm rec {
name = "phpstorm-${version}"; name = "phpstorm-${version}";
version = "2018.2.6"; /* updated by script */ version = "2018.3.3"; /* updated by script */
description = "Professional IDE for Web and PHP developers"; description = "Professional IDE for Web and PHP developers";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/webide/PhpStorm-${version}.tar.gz"; url = "https://download.jetbrains.com/webide/PhpStorm-${version}.tar.gz";
sha256 = "0z627q9mcxlz8a92dndnaz2qa9dkaapimsfqkvc0i8ab88yw75v1"; /* updated by script */ sha256 = "0znhw83h46a3haspwcin5xjf3ask8ijxla778p9vdbi9xs0zqx39"; /* updated by script */
}; };
wmClass = "jetbrains-phpstorm"; wmClass = "jetbrains-phpstorm";
update-channel = "PhpStorm 2018.2"; update-channel = "PhpStorm RELEASE";
}; };
pycharm-community = buildPycharm rec { pycharm-community = buildPycharm rec {
name = "pycharm-community-${version}"; name = "pycharm-community-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "PyCharm Community Edition"; description = "PyCharm Community Edition";
license = stdenv.lib.licenses.asl20; license = stdenv.lib.licenses.asl20;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/python/${name}.tar.gz"; url = "https://download.jetbrains.com/python/${name}.tar.gz";
sha256 = "0dnjkq1qbxc05cxafi5hw6pw9wya0w44ni32b34sclq26xr6blvj"; /* updated by script */ sha256 = "11kzzwkp206l466ii6vm6iqmhpx0s594vh37x2lwwsgmg6qzz6vq"; /* updated by script */
}; };
wmClass = "jetbrains-pycharm-ce"; wmClass = "jetbrains-pycharm-ce";
update-channel = "PyCharm Release"; update-channel = "PyCharm RELEASE";
}; };
pycharm-professional = buildPycharm rec { pycharm-professional = buildPycharm rec {
name = "pycharm-professional-${version}"; name = "pycharm-professional-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "PyCharm Professional Edition"; description = "PyCharm Professional Edition";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/python/${name}.tar.gz"; url = "https://download.jetbrains.com/python/${name}.tar.gz";
sha256 = "0z6qjc3qh58ds338rlfzi9446y3sghpnccaachkja2q59f97dfma"; /* updated by script */ sha256 = "1m8lzghs6g57fwcv6bpmnf21d4w2k10gsmi0i2wv2j8ff4hcy7ij"; /* updated by script */
}; };
wmClass = "jetbrains-pycharm"; wmClass = "jetbrains-pycharm";
update-channel = "PyCharm Release"; update-channel = "PyCharm RELEASE";
}; };
rider = buildRider rec { rider = buildRider rec {
name = "rider-${version}"; name = "rider-${version}";
version = "2018.3.1"; /* updated by script */ version = "2018.3.2"; /* updated by script */
description = "A cross-platform .NET IDE based on the IntelliJ platform and ReSharper"; description = "A cross-platform .NET IDE based on the IntelliJ platform and ReSharper";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/rider/JetBrains.Rider-${version}.tar.gz"; url = "https://download.jetbrains.com/rider/JetBrains.Rider-${version}.tar.gz";
sha256 = "0ghk819ik28y9b61vb2h463zbvvq1n2wl778czkakc4qjba2qnks"; /* updated by script */ sha256 = "1ffzbp2xca2z8g0wlkvmqr0j2f2dnqafpnvzk9zd5asfhhbyrhg5"; /* updated by script */
}; };
wmClass = "jetbrains-rider"; wmClass = "jetbrains-rider";
update-channel = "Rider 2018.3"; update-channel = "Rider RELEASE";
}; };
ruby-mine = buildRubyMine rec { ruby-mine = buildRubyMine rec {
name = "ruby-mine-${version}"; name = "ruby-mine-${version}";
version = "2018.2.6"; /* updated by script */ version = "2018.3.3"; /* updated by script */
description = "The Most Intelligent Ruby and Rails IDE"; description = "The Most Intelligent Ruby and Rails IDE";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/ruby/RubyMine-${version}.tar.gz"; url = "https://download.jetbrains.com/ruby/RubyMine-${version}.tar.gz";
sha256 = "0xbmj7d1ccq2qf1jsvch1zxdrypkvzxdfkr431c8fnabh993yxx1"; /* updated by script */ sha256 = "1zjcdsr91y07dhqmhqy2yq6c0rhsxg2m52fz14hhmphddlwvhzny"; /* updated by script */
}; };
wmClass = "jetbrains-rubymine"; wmClass = "jetbrains-rubymine";
update-channel = "RubyMine 2018.2"; update-channel = "RubyMine RELEASE";
}; };
webstorm = buildWebStorm rec { webstorm = buildWebStorm rec {
name = "webstorm-${version}"; name = "webstorm-${version}";
version = "2018.3.3"; /* updated by script */ version = "2018.3.4"; /* updated by script */
description = "Professional IDE for Web and JavaScript development"; description = "Professional IDE for Web and JavaScript development";
license = stdenv.lib.licenses.unfree; license = stdenv.lib.licenses.unfree;
src = fetchurl { src = fetchurl {
url = "https://download.jetbrains.com/webstorm/WebStorm-${version}.tar.gz"; url = "https://download.jetbrains.com/webstorm/WebStorm-${version}.tar.gz";
sha256 = "0q8njbrll7qgijnxqic2mpca2jb2plpd677xdj5v72mm66mvxmss"; /* updated by script */ sha256 = "11l39yy8qdrr89y9x3i9acp0am4xb86z6v7wg1kc9fd5p13jr2xs"; /* updated by script */
}; };
wmClass = "jetbrains-webstorm"; wmClass = "jetbrains-webstorm";
update-channel = "WebStorm Release"; update-channel = "WebStorm RELEASE";
}; };
} }

View File

@ -9,7 +9,7 @@
let let
pname = "kdevelop"; pname = "kdevelop";
version = "5.2.4"; version = "5.3.1";
qtVersion = "5.${lib.versions.minor qtbase.version}"; qtVersion = "5.${lib.versions.minor qtbase.version}";
in in
mkDerivation rec { mkDerivation rec {
@ -17,7 +17,7 @@ mkDerivation rec {
src = fetchurl { src = fetchurl {
url = "mirror://kde/stable/${pname}/${version}/src/${name}.tar.xz"; url = "mirror://kde/stable/${pname}/${version}/src/${name}.tar.xz";
sha256 = "1jbks7nh9rybz4kg152l39hfj2x0p6mjins8x9mz03bbv8jf8gic"; sha256 = "1098ra7qpal6578hsv20kvxc63v47sp85wjhqr5rgzr2fm7jf6fr";
}; };
nativeBuildInputs = [ nativeBuildInputs = [
@ -37,6 +37,12 @@ mkDerivation rec {
shared-mime-info libksysguard konsole kcrash karchive kguiaddons kpurpose shared-mime-info libksysguard konsole kcrash karchive kguiaddons kpurpose
]; ];
# https://cgit.kde.org/kdevelop.git/commit/?id=716372ae2e8dff9c51e94d33443536786e4bd85b
# required as nixos seems to be unable to find CLANG_BUILTIN_DIR
cmakeFlags = [
"-DCLANG_BUILTIN_DIR=${llvmPackages.clang-unwrapped}/lib/clang/${(builtins.parseDrvName llvmPackages.clang.name).version}/include"
];
postInstall = '' postInstall = ''
# The kdevelop! script (shell environment) needs qdbus and kioclient5 in PATH. # The kdevelop! script (shell environment) needs qdbus and kioclient5 in PATH.
wrapProgram "$out/bin/kdevelop!" \ wrapProgram "$out/bin/kdevelop!" \

View File

@ -1,15 +1,25 @@
{ stdenv, fetchFromGitHub, cmake, gettext, msgpack, libtermkey, libiconv { stdenv, fetchFromGitHub, cmake, gettext, msgpack, libtermkey, libiconv
, libuv, luaPackages, ncurses, pkgconfig , libuv, lua, ncurses, pkgconfig
, unibilium, xsel, gperf , unibilium, xsel, gperf
, libvterm-neovim , libvterm-neovim
, withJemalloc ? true, jemalloc , withJemalloc ? true, jemalloc
, glibcLocales ? null, procps ? null
# now defaults to false because some tests can be flaky (clipboard etc)
, doCheck ? false
}: }:
with stdenv.lib; with stdenv.lib;
let let
neovimLuaEnv = lua.withPackages(ps:
neovim = stdenv.mkDerivation rec { (with ps; [ mpack lpeg luabitop ]
++ optionals doCheck [
nvim-client luv coxpcall busted luafilesystem penlight inspect
]
));
in
stdenv.mkDerivation rec {
name = "neovim-unwrapped-${version}"; name = "neovim-unwrapped-${version}";
version = "0.3.4"; version = "0.3.4";
@ -36,11 +46,20 @@ let
ncurses ncurses
libvterm-neovim libvterm-neovim
unibilium unibilium
luaPackages.lua
gperf gperf
neovimLuaEnv
] ++ optional withJemalloc jemalloc ] ++ optional withJemalloc jemalloc
++ optional stdenv.isDarwin libiconv ++ optional stdenv.isDarwin libiconv
++ lualibs; ++ optionals doCheck [ glibcLocales procps ]
;
inherit doCheck;
# to be exhaustive, one could run
# make oldtests too
checkPhase = ''
make functionaltest
'';
nativeBuildInputs = [ nativeBuildInputs = [
cmake cmake
@ -48,10 +67,6 @@ let
pkgconfig pkgconfig
]; ];
LUA_PATH = stdenv.lib.concatStringsSep ";" (map luaPackages.getLuaPath lualibs);
LUA_CPATH = stdenv.lib.concatStringsSep ";" (map luaPackages.getLuaCPath lualibs);
lualibs = [ luaPackages.mpack luaPackages.lpeg luaPackages.luabitop ];
# nvim --version output retains compilation flags and references to build tools # nvim --version output retains compilation flags and references to build tools
postPatch = '' postPatch = ''
@ -61,9 +76,11 @@ let
disallowedReferences = [ stdenv.cc ]; disallowedReferences = [ stdenv.cc ];
cmakeFlags = [ cmakeFlags = [
"-DLUA_PRG=${luaPackages.lua}/bin/lua" "-DLUA_PRG=${neovimLuaEnv}/bin/lua"
"-DGPERF_PRG=${gperf}/bin/gperf" "-DGPERF_PRG=${gperf}/bin/gperf"
]; ]
++ optional doCheck "-DBUSTED_PRG=${neovimLuaEnv}/bin/busted"
;
# triggers on buffer overflow bug while running tests # triggers on buffer overflow bug while running tests
hardeningDisable = [ "fortify" ]; hardeningDisable = [ "fortify" ];
@ -81,6 +98,11 @@ let
$out/bin/nvim $out/bin/nvim
''; '';
# export PATH=$PWD/build/bin:${PATH}
shellHook=''
export VIMRUNTIME=$PWD/runtime
'';
meta = { meta = {
description = "Vim text editor fork focused on extensibility and agility"; description = "Vim text editor fork focused on extensibility and agility";
longDescription = '' longDescription = ''
@ -104,7 +126,4 @@ let
# https://nix-cache.s3.amazonaws.com/log/9ahcb52905d9d417zsskjpc331iailpq-neovim-unwrapped-0.2.2.drv # https://nix-cache.s3.amazonaws.com/log/9ahcb52905d9d417zsskjpc331iailpq-neovim-unwrapped-0.2.2.drv
broken = stdenv.isAarch64; broken = stdenv.isAarch64;
}; };
}; }
in
neovim

View File

@ -5,7 +5,7 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "qgis-2.18.22"; name = "qgis-2.18.28";
buildInputs = [ gdal qt4 flex openssl bison proj geos xlibsWrapper sqlite gsl qwt qscintilla buildInputs = [ gdal qt4 flex openssl bison proj geos xlibsWrapper sqlite gsl qwt qscintilla
fcgi libspatialindex libspatialite postgresql qjson qca2 txt2tags pkgconfig fcgi libspatialindex libspatialite postgresql qjson qca2 txt2tags pkgconfig
@ -35,14 +35,15 @@ stdenv.mkDerivation rec {
src = fetchurl { src = fetchurl {
url = "https://qgis.org/downloads/${name}.tar.bz2"; url = "https://qgis.org/downloads/${name}.tar.bz2";
sha256 = "00b3a2hfn3i7bdx7x96vz2nj0976vpkhid4ss7n8c33fdvw3k82a"; sha256 = "18pijqls1isd2bpg0mkrw07jqvdfaiwwb9mvz7p2xrgqcjx7dxsq";
}; };
patches = [ patches = [
# https://github.com/qgis/QGIS/pull/7765 # already merged upstream in QGIS-3.*, but needs to be backported to QGIS-2
(fetchpatch { (fetchpatch {
url = "https://github.com/qgis/QGIS/commit/6b61ef361a77f057dc29eb07463007bd9012b253.patch"; url = "https://patch-diff.githubusercontent.com/raw/qgis/QGIS/pull/7263.patch";
sha256 = "1xibcahm18n7nxff1xvwwzjf505hvhiw5dk12is7aclv49h0rdf7"; name = "Ensure_qgis.db_is_writable_when_copied_from_RO_source";
sha256 = "19wr2kz0x8x6p2n0ylzd4lqrdmbkxyxr0zpwf2vl9hdp92rdjxbv";
}) })
]; ];

View File

@ -1,5 +1,5 @@
{ lib, stdenv, fetchFromGitHub, pkgconfig, libtool { lib, stdenv, fetchFromGitHub, pkgconfig, libtool
, bzip2, zlib, libX11, libXext, libXt, fontconfig, freetype, ghostscript, libjpeg , bzip2, zlib, libX11, libXext, libXt, fontconfig, freetype, ghostscript, libjpeg, djvulibre
, lcms2, openexr, libpng, librsvg, libtiff, libxml2, openjpeg, libwebp, libheif , lcms2, openexr, libpng, librsvg, libtiff, libxml2, openjpeg, libwebp, libheif
, ApplicationServices , ApplicationServices
}: }:
@ -53,7 +53,7 @@ stdenv.mkDerivation rec {
buildInputs = buildInputs =
[ zlib fontconfig freetype ghostscript [ zlib fontconfig freetype ghostscript
libpng libtiff libxml2 libheif libpng libtiff libxml2 libheif djvulibre
] ]
++ lib.optionals (!stdenv.hostPlatform.isMinGW) ++ lib.optionals (!stdenv.hostPlatform.isMinGW)
[ openexr librsvg openjpeg ] [ openexr librsvg openjpeg ]

View File

@ -1,5 +1,5 @@
{ lib, stdenv, fetchFromGitHub, fetchpatch, pkgconfig, libtool { lib, stdenv, fetchFromGitHub, fetchpatch, pkgconfig, libtool
, bzip2, zlib, libX11, libXext, libXt, fontconfig, freetype, ghostscript, libjpeg , bzip2, zlib, libX11, libXext, libXt, fontconfig, freetype, ghostscript, libjpeg, djvulibre
, lcms2, openexr, libpng, librsvg, libtiff, libxml2, openjpeg, libwebp, fftw, libheif, libde265 , lcms2, openexr, libpng, librsvg, libtiff, libxml2, openjpeg, libwebp, fftw, libheif, libde265
, ApplicationServices , ApplicationServices
}: }:
@ -65,7 +65,7 @@ stdenv.mkDerivation rec {
buildInputs = buildInputs =
[ zlib fontconfig freetype ghostscript [ zlib fontconfig freetype ghostscript
libpng libtiff libxml2 libheif libde265 libpng libtiff libxml2 libheif libde265 djvulibre
] ]
++ lib.optionals (!stdenv.hostPlatform.isMinGW) ++ lib.optionals (!stdenv.hostPlatform.isMinGW)
[ openexr librsvg openjpeg ] [ openexr librsvg openjpeg ]

View File

@ -1,63 +0,0 @@
{ stdenv, fetchurl, makeWrapper, makeDesktopItem, unzip, jre }:
let
name = "astah-community";
version = "7.2.0";
postfix = "1ff236";
desktopIcon = fetchurl {
name = "${name}.png";
url = "https://aur.archlinux.org/cgit/aur.git/plain/astah_community.png?h=astah-community&id=94710b5a6aadcaf489022b0f0e61f8832ae6fa87";
sha256 = "0knlknwfqqnhg63sxxpia5ykn397id31gzr956wnn6yjj58k3ckm";
};
mimeXml = fetchurl {
name = "${name}.xml";
url = "https://aur.archlinux.org/cgit/aur.git/plain/astah_community.xml?h=astah-community&id=94710b5a6aadcaf489022b0f0e61f8832ae6fa87";
sha256 = "096n2r14ddm97r32i4sbp7v4qdmwn9sxy7lwphcx1nydppb0m97b";
};
desktopItem = makeDesktopItem {
name = name;
exec = "astah %U";
icon = "${desktopIcon}";
comment = "Lightweight, easy-to-use, and free UML2.x modeler";
desktopName = "Astah* Community";
genericName = "Astah* Community";
mimeType = "application/x-astah";
categories = "Application;Development;";
extraEntries = "NoDisplay=false";
};
in
stdenv.mkDerivation {
name = "${name}-${version}";
src = fetchurl {
url = "http://cdn.change-vision.com/files/${name}-${stdenv.lib.replaceStrings ["."] ["_"] version}-${postfix}.zip";
sha256 = "1lkl30jdjiarvh2ap9rjabvrq9qhrlmfrasv3vvkag22y9w4l499";
};
nativeBuildInputs = [ unzip makeWrapper ];
installPhase = ''
runHook preInstall
mkdir -p $out/{bin,share}
cp -r . $out/share/astah
cp -r ${desktopItem}/share/applications $out/share/applications
install -D ${desktopIcon} $out/share/pixmaps/${name}.png
install -D ${mimeXml} $out/share/mime/packages/${name}.xml
makeWrapper ${jre}/bin/java $out/bin/astah \
--add-flags "-jar $out/share/astah/astah-community.jar"
runHook postInstall
'';
meta = with stdenv.lib; {
description = "Lightweight, easy-to-use, and free UML2.x modeler";
homepage = http://astah.net/editions/community;
license = licenses.unfree;
};
}

View File

@ -4,13 +4,13 @@
mkDerivation rec { mkDerivation rec {
pname = "albert"; pname = "albert";
version = "0.15.0"; version = "0.16.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "albertlauncher"; owner = "albertlauncher";
repo = "albert"; repo = "albert";
rev = "v${version}"; rev = "v${version}";
sha256 = "063z9yq6bsxcsqsw1n93ks5dzhzv6i252mjz1d5mxhxvgmqlfk0v"; sha256 = "04sr35fqz66i24lv7r2p9qfqxs55i8xpj7aam0v9yakcr33lf55a";
fetchSubmodules = true; fetchSubmodules = true;
}; };
@ -25,7 +25,7 @@ mkDerivation rec {
postPatch = '' postPatch = ''
sed -i "/QStringList dirs = {/a \"$out/libs\"," \ sed -i "/QStringList dirs = {/a \"$out/libs\"," \
lib/albertcore/src/core/albert.cpp src/app/main.cpp
''; '';
preBuild = '' preBuild = ''

View File

@ -41,6 +41,7 @@ stdenv.mkDerivation rec {
url = "https://github.com/naihe2010/apvlv/commit/a3a895772a27d76dab0c37643f0f4c73f9970e62.patch"; url = "https://github.com/naihe2010/apvlv/commit/a3a895772a27d76dab0c37643f0f4c73f9970e62.patch";
sha256 = "1fpc7wr1ajilvwi5gjsy5g9jcx4bl03gp5dmajg90ljqbhwz2bfi"; sha256 = "1fpc7wr1ajilvwi5gjsy5g9jcx4bl03gp5dmajg90ljqbhwz2bfi";
}) })
./fix-build-with-poppler-0.73.0.patch
]; ];
installPhase = '' installPhase = ''

View File

@ -0,0 +1,13 @@
diff --git a/src/ApvlvPdf.cc b/src/ApvlvPdf.cc
index 765b112..83d133f 100644
--- a/src/ApvlvPdf.cc
+++ b/src/ApvlvPdf.cc
@@ -29,7 +29,7 @@
#include "ApvlvPdf.h"
#ifndef POPPLER_WITH_GDK
-#include <goo/gtypes.h>
+#include <goo/gfile.h>
static void
copy_cairo_surface_to_pixbuf (cairo_surface_t *surface,

View File

@ -5,12 +5,12 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "3.38.1"; version = "3.39.1";
name = "calibre-${version}"; name = "calibre-${version}";
src = fetchurl { src = fetchurl {
url = "https://download.calibre-ebook.com/${version}/${name}.tar.xz"; url = "https://download.calibre-ebook.com/${version}/${name}.tar.xz";
sha256 = "07fvpnabk17sfg81xn0bsnw36k45hawwz0fcz5cmp5qydm85ncv0"; sha256 = "08c1wsdn0giv9zfb6bis9bbrw687rci8fs26qsal8ijmjk55dfsh";
}; };
patches = [ patches = [

View File

@ -0,0 +1,28 @@
{ stdenv, lib, fetchFromGitHub, pkgconfig, autoreconfHook,
glib, gtk3, pcsclite, lua5_2, curl, readline }:
let
version = "0.8.4";
in
stdenv.mkDerivation {
name = "cardpeek-${version}";
src = fetchFromGitHub {
owner = "L1L1";
repo = "cardpeek";
rev = "cardpeek-${version}";
sha256 = "1ighpl7nvcvwnsd6r5h5n9p95kclwrq99hq7bry7s53yr57l6588";
};
nativeBuildInputs = [ pkgconfig autoreconfHook ];
buildInputs = [ glib gtk3 pcsclite lua5_2 curl readline ];
enableParallelBuilding = true;
meta = with stdenv.lib; {
homepage = https://github.com/L1L1/cardpeek;
description = "A tool to read the contents of ISO7816 smart cards";
license = licenses.gpl3Plus;
platforms = with platforms; linux ++ darwin;
maintainers = with maintainers; [ embr ];
};
}

View File

@ -2,12 +2,12 @@
, pyserial, pygtk }: , pyserial, pygtk }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "chirp-daily-${version}"; pname = "chirp-daily";
version = "20181018"; version = "20190201";
src = fetchurl { src = fetchurl {
url = "https://trac.chirp.danplanet.com/chirp_daily/daily-${version}/${name}.tar.gz"; url = "https://trac.chirp.danplanet.com/chirp_daily/daily-${version}/${pname}-${version}.tar.gz";
sha256 = "0jd7xi6q09b3djn1k7pj1sbqvw24kn7dcp9r6abvxily4pc1xhdr"; sha256 = "1ag3qzdq39zhpagviq9gpwk4y3h11z0j40nccsnhlq8h8bxpvwlf";
}; };
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];

View File

@ -2,14 +2,14 @@
, qtquickcontrols, qtgraphicaleffects, qmake }: , qtquickcontrols, qtgraphicaleffects, qmake }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "1.1.0"; version = "1.1.1";
name = "cool-retro-term-${version}"; name = "cool-retro-term-${version}";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Swordfish90"; owner = "Swordfish90";
repo = "cool-retro-term"; repo = "cool-retro-term";
rev = version; rev = version;
sha256 = "0gmigjpc19q7l94q4wzbrxh7cdb6zk3zscaijzwsz9364wsgzb47"; sha256 = "0mird4k88ml6y61hky2jynrjmnxl849fvhsr5jfdlnv0i7r5vwi5";
}; };
patchPhase = '' patchPhase = ''

View File

@ -5,13 +5,13 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "CopyQ-${version}"; name = "CopyQ-${version}";
version = "3.7.2"; version = "3.7.3";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "hluk"; owner = "hluk";
repo = "CopyQ"; repo = "CopyQ";
rev = "v${version}"; rev = "v${version}";
sha256 = "1f2q9lzs5z31rl689ai2hig4nrj8cg9g25hhsrj6r85q9vkwkqjs"; sha256 = "1nxxxq0lfs4r673i70dh2xwdn3chcjl913bkz14kyna29i6n1nwm";
}; };
nativeBuildInputs = [ cmake ]; nativeBuildInputs = [ cmake ];

View File

@ -1,11 +1,11 @@
{ stdenv, fetchurl, libX11, libXinerama, libXft, zlib, patches ? null }: { stdenv, fetchurl, libX11, libXinerama, libXft, zlib, patches ? null }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "dmenu-4.8"; name = "dmenu-4.9";
src = fetchurl { src = fetchurl {
url = "https://dl.suckless.org/tools/${name}.tar.gz"; url = "https://dl.suckless.org/tools/${name}.tar.gz";
sha256 = "0qfvfrj10xlwd9hkvb57wshryan65bl6423h0qhiw1h76rf5lqgy"; sha256 = "0ia9nqr83bv6x247q30bal0v42chcj9qcjgv59xs6xj46m7iz5xk";
}; };
buildInputs = [ libX11 libXinerama zlib libXft ]; buildInputs = [ libX11 libXinerama zlib libXft ];

View File

@ -1,24 +1,26 @@
{ stdenv, fetchFromGitHub, makeWrapper, xdg_utils, file, coreutils }: { stdenv, fetchFromGitHub, makeWrapper, bashInteractive, xdg_utils, file, coreutils, w3m, xdotool }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "fff"; pname = "fff";
version = "2.0"; version = "2.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "dylanaraps"; owner = "dylanaraps";
repo = pname; repo = pname;
rev = version; rev = version;
sha256 = "0pqxqg1gnl3kgqma5vb0wcy4n9xbm0dp7g7dxl60cwcyqvd4vm3i"; sha256 = "0s5gi5ghwax5gc886pvbpcmsbmzhxzywajwzjsdxwjyd1v1iynwh";
}; };
pathAdd = stdenv.lib.makeSearchPath "bin" [ xdg_utils file coreutils ]; pathAdd = stdenv.lib.makeSearchPath "bin" ([ xdg_utils file coreutils w3m xdotool ]);
buildInputs = [ makeWrapper ];
installPhase = '' nativeBuildInputs = [ makeWrapper ];
install -D fff "$out/bin/fff" buildInputs = [ bashInteractive ];
install -D README.md "$out/share/doc/fff/README.md" dontBuild = true;
install -D fff.1 "$out/share/man/man1/fff.1"
wrapProgram $out/bin/fff --prefix PATH : ${pathAdd} makeFlags = [ "PREFIX=$(out)" ];
postInstall = ''
wrapProgram "$out/bin/fff" --prefix PATH : $pathAdd
''; '';
meta = with stdenv.lib; { meta = with stdenv.lib; {

View File

@ -6,13 +6,12 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "4.0.7"; version = "4.0.8";
pname = "flmsg"; pname = "flmsg";
name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "mirror://sourceforge/fldigi/${name}.tar.gz"; url = "mirror://sourceforge/fldigi/${pname}-${version}.tar.gz";
sha256 = "1kdlwhxsw02pas9d0kakkq2713wj1m4q881f6am5aq4x8n01f4xw"; sha256 = "1yy9z6mchs7r3x108z5rp0h6a18zjqrn9zq5x72qwqh1byjnfwc8";
}; };
buildInputs = [ buildInputs = [

View File

@ -6,13 +6,12 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "1.3.41"; version = "1.3.42";
pname = "flrig"; pname = "flrig";
name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "mirror://sourceforge/fldigi/${name}.tar.gz"; url = "mirror://sourceforge/fldigi/${pname}-${version}.tar.gz";
sha256 = "0vh14azg3pppyg3fb7kf6q3ighw1ka9m60jf2dzsd77f4hidhqx4"; sha256 = "10qn710ms145zq2xzb6z2fnygxmh5pmfmyfdbphrc7mrvd0phzp0";
}; };
buildInputs = [ buildInputs = [

View File

@ -49,10 +49,6 @@ stdenv.mkDerivation rec {
patchShebangs meson_post_install.py patchShebangs meson_post_install.py
''; '';
postInstall = ''
rm $out/share/applications/mimeinfo.cache
'';
meta = { meta = {
homepage = https://fontmanager.github.io/; homepage = https://fontmanager.github.io/;
description = "Simple font management for GTK+ desktop environments"; description = "Simple font management for GTK+ desktop environments";

View File

@ -1,4 +1,4 @@
{ stdenv, python }: { stdenv, python, fetchpatch }:
with python.pkgs; with python.pkgs;
@ -11,6 +11,12 @@ buildPythonApplication rec {
sha256 = "5b9af8338a0f8b95a8133b66ef106553823813ac171c0aefa3f3f2dbeb4d7f88"; sha256 = "5b9af8338a0f8b95a8133b66ef106553823813ac171c0aefa3f3f2dbeb4d7f88";
}; };
# allow newer click version
patches = fetchpatch {
url = "${meta.homepage}/commit/5b0d3ef1775756ca15b6d83fba1fb751846b5427.patch";
sha256 = "1551knh2f7yarqzcpip16ijmbx8kzdna8cihxlxx49ww55f5sg67";
};
propagatedBuildInputs = [ propagatedBuildInputs = [
click click
colorama colorama

View File

@ -6,19 +6,29 @@
, enableJPEG2K ? true, jasper , enableJPEG2K ? true, jasper
, enableDJVU ? true, djvulibre , enableDJVU ? true, djvulibre
, enableGOCR ? false, gocr # Disabled by default due to crashes , enableGOCR ? false, gocr # Disabled by default due to crashes
, enableTesseract ? true, leptonica, tesseract , enableTesseract ? true, leptonica, tesseract4
}: }:
with stdenv.lib; with stdenv.lib;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "k2pdfopt-${version}"; name = "k2pdfopt-${version}";
version = "2.42"; version = "2.51a";
src = fetchzip { src = (fetchzip {
url = "http://www.willus.com/k2pdfopt/src/k2pdfopt_v${version}_src.zip"; url = "http://www.willus.com/k2pdfopt/src/k2pdfopt_v2.51_src.zip";
sha256 = "1zag4jmkr0qrcpqqb5davmvdrabhdyz87q4zz0xpfkl6xw2dn9bk"; sha256 = "133l7xkvi67s6sfk8cfh7rmavbsf7ib5fyksk1ci6b6sch3z2sw9";
}; });
# Note: the v2.51a zip contains only files to be replaced in the v2.50 zip.
v251a_src = (fetchzip {
url = "http://www.willus.com/k2pdfopt/src/k2pdfopt_v2.51a_src.zip";
sha256 = "0vvwblii7kgdwfxw8dzk6jbmz4dv94d7rkv18i60y8wkayj6yhl6";
});
postUnpack = ''
cp -r ${v251a_src}/* $sourceRoot
'';
patches = [ ./k2pdfopt.patch ]; patches = [ ./k2pdfopt.patch ];
@ -27,65 +37,43 @@ stdenv.mkDerivation rec {
buildInputs = buildInputs =
let let
mupdf_modded = mupdf.overrideAttrs (attrs: { mupdf_modded = mupdf.overrideAttrs (attrs: {
name = "mupdf-1.10a";
version = "1.10a";
src = fetchurl {
url = "https://mupdf.com/downloads/archive/mupdf-1.10a-source.tar.gz";
sha256 = "0dm8wcs8i29aibzkqkrn8kcnk4q0kd1v66pg48h5c3qqp4v1zk5a";
};
# Excluded the pdf-*.c files, since they mostly just broke the #includes # Excluded the pdf-*.c files, since they mostly just broke the #includes
prePatch = '' prePatch = ''
cp ${src}/mupdf_mod/{font,stext-device,string}.c source/fitz/ cp ${src}/mupdf_mod/{font,stext-device,string}.c source/fitz/
cp ${src}/mupdf_mod/font-win32.c source/pdf/ cp ${src}/mupdf_mod/font-win32.c source/pdf/
''; '';
# Patches from previous 1.10a version in nixpkgs
patches = [
# Compatibility with new openjpeg
./load-jpx.patch
(fetchurl {
name = "CVE-2017-5896.patch";
url = "http://git.ghostscript.com/?p=mupdf.git;a=patch;h=2c4e5867ee699b1081527bc6c6ea0e99a35a5c27";
sha256 = "14k7x47ifx82sds1c06ibzbmcparfg80719jhgwjk6w1vkh4r693";
})
(fetchpatch {
name = "mupdf-1.10a-shared_libs-1.patch";
url = "https://ftp.osuosl.org/pub/blfs/conglomeration/mupdf/mupdf-1.10a-shared_libs-1.patch";
sha256 = "0kg4vahp7hlyyj5hl18brk8s8xcbqrx19pqjzkfq6ha8mqa3k4ab";
})
];
# Override this since the jpeg directory was renamed libjpeg in mupdf 1.11
preConfigure = ''
# Don't remove mujs because upstream version is incompatible
rm -rf thirdparty/{curl,freetype,glfw,harfbuzz,jbig2dec,jpeg,openjpeg,zlib}
'';
postPatch = let
# OpenJPEG version is hardcoded in package source
openJpegVersion = with stdenv;
lib.concatStringsSep "." (lib.lists.take 2
(lib.splitString "." (lib.getVersion openjpeg)));
in ''
sed -i "s/__OPENJPEG__VERSION__/${openJpegVersion}/" source/fitz/load-jpx.c
'';
}); });
leptonica_modded = leptonica.overrideAttrs (attrs: { leptonica_modded = leptonica.overrideAttrs (attrs: {
name = "leptonica-1.74.4";
# Modified source files apply to this particular version of leptonica
version = "1.74.4";
src = fetchurl {
url = "http://www.leptonica.org/source/leptonica-1.74.4.tar.gz";
sha256 = "0fw39amgyv8v6nc7x8a4c7i37dm04i6c5zn62d24bgqnlhk59hr9";
};
prePatch = '' prePatch = ''
cp ${src}/leptonica_mod/* src/ cp ${src}/leptonica_mod/{allheaders.h,dewarp2.c,leptwin.c} src/
''; '';
patches = [];
}); });
tesseract_modded = tesseract.override { tesseract_modded = tesseract4.override {
tesseractBase = tesseract.tesseractBase.overrideAttrs (_: { tesseractBase = tesseract4.tesseractBase.overrideAttrs (_: {
prePatch = '' prePatch = ''
cp ${src}/tesseract_mod/{ambigs.cpp,ccutil.h,ccutil.cpp} ccutil/ cp ${src}/tesseract_mod/baseapi.{h,cpp} src/api/
cp ${src}/tesseract_mod/dawg.cpp api/ cp ${src}/tesseract_mod/ccutil.{h,cpp} src/ccutil/
cp ${src}/tesseract_mod/{imagedata.cpp,tessdatamanager.cpp} ccstruct/ cp ${src}/tesseract_mod/genericvector.h src/ccutil/
cp ${src}/tesseract_mod/openclwrapper.h opencl/ cp ${src}/tesseract_mod/input.cpp src/lstm/
cp ${src}/tesseract_mod/{tessedit.cpp,thresholder.cpp} ccmain/ cp ${src}/tesseract_mod/lstmrecognizer.cpp src/lstm/
cp ${src}/tesseract_mod/tess_lang_mod_edge.h cube/ cp ${src}/tesseract_mod/mainblk.cpp src/ccutil/
cp ${src}/tesseract_mod/tesscapi.cpp api/ cp ${src}/tesseract_mod/params.cpp src/ccutil/
cp ${src}/include_mod/{tesseract.h,leptonica.h} api/ cp ${src}/tesseract_mod/serialis.{h,cpp} src/ccutil/
cp ${src}/tesseract_mod/tesscapi.cpp src/api/
cp ${src}/tesseract_mod/tessdatamanager.cpp src/ccstruct/
cp ${src}/tesseract_mod/tessedit.cpp src/ccmain/
cp ${src}/include_mod/{tesseract.h,leptonica.h} src/api/
''; '';
patches = [ ./tesseract.patch ]; patches = [ ./tesseract.patch ];
}); });

View File

@ -1,29 +0,0 @@
--- a/source/fitz/load-jpx.c
+++ b/source/fitz/load-jpx.c
@@ -484,12 +484,16 @@
/* Without the definition of OPJ_STATIC, compilation fails on windows
* due to the use of __stdcall. We believe it is required on some
* linux toolchains too. */
+#ifdef __cplusplus
+extern "C"
+{
#define OPJ_STATIC
#ifndef _MSC_VER
#define OPJ_HAVE_STDINT_H
#endif
+#endif
-#include <openjpeg.h>
+#include <openjpeg-__OPENJPEG__VERSION__/openjpeg.h>
/* OpenJPEG does not provide a safe mechanism to intercept
* allocations. In the latest version all allocations go
@@ -971,4 +975,8 @@
fz_drop_pixmap(ctx, img);
}
+#ifdef __cplusplus
+}
+#endif
+
#endif /* HAVE_LURATECH */

View File

@ -1,7 +1,7 @@
diff --git a/api/Makefile.am b/api/Makefile.am diff --git a/src/api/Makefile.am b/src/api/Makefile.am
index d8c1e54..46ead13 100644 index d8c1e54..46ead13 100644
--- a/api/Makefile.am --- a/src/api/Makefile.am
+++ b/api/Makefile.am +++ b/src/api/Makefile.am
@@ -42,7 +42,7 @@ libtesseract_api_la_CPPFLAGS = $(AM_CPPFLAGS) @@ -42,7 +42,7 @@ libtesseract_api_la_CPPFLAGS = $(AM_CPPFLAGS)
if VISIBILITY if VISIBILITY
libtesseract_api_la_CPPFLAGS += -DTESS_EXPORTS libtesseract_api_la_CPPFLAGS += -DTESS_EXPORTS

View File

@ -45,6 +45,12 @@ buildPythonApplication rec {
cp -r linux-package/{bin,share,lib} $out cp -r linux-package/{bin,share,lib} $out
wrapProgram "$out/bin/kitty" --prefix PATH : "$out/bin:${stdenv.lib.makeBinPath [ imagemagick xsel ]}" wrapProgram "$out/bin/kitty" --prefix PATH : "$out/bin:${stdenv.lib.makeBinPath [ imagemagick xsel ]}"
runHook postInstall runHook postInstall
# ZSH completions need to be invoked with `source`:
# https://github.com/kovidgoyal/kitty/blob/8ceb941051b89b7c50850778634f0b6137aa5e6e/docs/index.rst#zsh
mkdir -p "$out/share/"{bash-completion/completions,fish/vendor_completions.d,zsh/site-functions}
"$out/bin/kitty" + complete setup fish > "$out/share/fish/vendor_completions.d/kitty.fish"
"$out/bin/kitty" + complete setup bash > "$out/share/bash-completion/completions/kitty.bash"
''; '';
postInstall = '' postInstall = ''

View File

@ -3,12 +3,12 @@
mkDerivation rec { mkDerivation rec {
pname = "latte-dock"; pname = "latte-dock";
version = "0.8.4"; version = "0.8.5";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "https://download.kde.org/stable/${pname}/${name}.tar.xz"; url = "https://download.kde.org/stable/${pname}/${name}.tar.xz";
sha256 = "0zm2xckyaymd53a38mf1bh9in4bh2bshbr3z8z9gn6mp7c60jay3"; sha256 = "1yhnmppp65xy8skainn438q3hwlpsz8qcj4ksvl8xdz5jzn7gs7k";
name = "${name}.tar.xz"; name = "${name}.tar.xz";
}; };

View File

@ -67,7 +67,7 @@ in stdenv.mkDerivation rec {
Name: mupdf Name: mupdf
Description: Library for rendering PDF documents Description: Library for rendering PDF documents
Version: ${version} Version: ${version}
Libs: -L$out/lib -lmupdf -lmupdfthird Libs: -L$out/lib -lmupdf -lmupdf-third
Cflags: -I$dev/include Cflags: -I$dev/include
EOF EOF

View File

@ -13,12 +13,12 @@ let
inherit (python2.pkgs) paramiko pycairo pyodbc; inherit (python2.pkgs) paramiko pycairo pyodbc;
in stdenv.mkDerivation rec { in stdenv.mkDerivation rec {
pname = "mysql-workbench"; pname = "mysql-workbench";
version = "8.0.13"; version = "8.0.14";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = fetchurl { src = fetchurl {
url = "http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-workbench-community-${version}-src.tar.gz"; url = "http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-workbench-community-${version}-src.tar.gz";
sha256 = "1p4xy2a5cin1l06j4ixpgp1ynhjdj5gax4fjhznspch3c63jp9hj"; sha256 = "0mz615drx18h0frc6fq9nknqbpq7lr0xlsfmxd5irw2jz629lj76";
}; };
patches = [ patches = [

View File

@ -3,7 +3,7 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "notejot"; pname = "notejot";
version = "1.5.3"; version = "1.5.4";
name = "${pname}-${version}"; name = "${pname}-${version}";
@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
owner = "lainsce"; owner = "lainsce";
repo = pname; repo = pname;
rev = version; rev = version;
sha256 = "1n41sg9a38p9qp8pz3lx9rnb8kc069vkbwf963zzpzs2745h6s9v"; sha256 = "1lv4s2mqddi6lz414kqpp4vcwnkjibc0k2xhnczaa1wf3azlxjgf";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View File

@ -7,15 +7,17 @@
, speechd, brltty, setproctitle, gst_all_1, gst-python , speechd, brltty, setproctitle, gst_all_1, gst-python
}: }:
buildPythonApplication rec { let
pname = "orca"; pname = "orca";
version = "3.30.1"; version = "3.30.2";
in buildPythonApplication rec {
name = "${pname}-${version}";
format = "other"; format = "other";
src = fetchurl { src = fetchurl {
url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
sha256 = "1b9s69frjmghjm1p9a4rrvknl9m0qlwr7mr4lsxkvjnblhsnw0g7"; sha256 = "17asibc46i5gr2fw04jvvdi85zzmxwlnhyq7r6cr3m5prrdr8a53";
}; };
patches = [ patches = [

View File

@ -4,13 +4,13 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "${product}-${version}"; name = "${product}-${version}";
product = "pdfpc"; product = "pdfpc";
version = "4.3.1_0"; version = "4.3.2";
src = fetchFromGitHub { src = fetchFromGitHub {
repo = "pdfpc"; repo = product;
owner = "pdfpc"; owner = product;
rev = "v${version}"; rev = "v${version}";
sha256 = "04bvgpdy3l030jd1f87a94lz4lky29skpak3k0bzazsajwpywprd"; sha256 = "15y6g92fp6x6dwwhrhkfny5z20w7pq9c8w19fh2vzff9aa6m2h9z";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View File

@ -0,0 +1,29 @@
{ stdenv, fetchFromGitHub, pkgconfig, cmake, libeb, lzo, qtbase
, qtmultimedia, qttools, qtwebengine }:
stdenv.mkDerivation rec {
name = "qolibri-${version}";
version = "2018-11-14";
src = fetchFromGitHub {
owner = "ludios";
repo = "qolibri";
rev = "133a1c33e74d931ad54407f70d84a0016d96981f";
sha256 = "16ifix0q8ww4l3xflgxr9j81c0lzlnkjr8fj961x3nxz7288pdg2";
};
nativeBuildInputs = [ pkgconfig cmake ];
buildInputs = [
libeb lzo qtbase qtmultimedia qttools qtwebengine
];
enableParallelBuilding = true;
meta = with stdenv.lib; {
homepage = https://github.com/ludios/qolibri;
description = "EPWING reader for viewing Japanese dictionaries";
platforms = platforms.linux;
maintainers = with maintainers; [ ivan ];
license = licenses.gpl2;
};
}

View File

@ -19,7 +19,8 @@ python3Packages.buildPythonApplication rec {
LC_ALL = "en_US.UTF-8"; LC_ALL = "en_US.UTF-8";
checkInputs = with python3Packages; [ pytest ]; checkInputs = with python3Packages; [ pytest ];
propagatedBuildInputs = [ file ]; propagatedBuildInputs = [ file ]
++ lib.optional (imagePreviewSupport) [ python3Packages.pillow ];
checkPhase = '' checkPhase = ''
py.test tests py.test tests

View File

@ -4,11 +4,11 @@
with stdenv.lib; with stdenv.lib;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "st-0.8.1"; name = "st-0.8.2";
src = fetchurl { src = fetchurl {
url = "https://dl.suckless.org/st/${name}.tar.gz"; url = "https://dl.suckless.org/st/${name}.tar.gz";
sha256 = "09k94v3n20gg32xy7y68p96x9dq5msl80gknf9gbvlyjp3i0zyy4"; sha256 = "0ddz2mdp1c7q67rd5vrvws9r0493ln0mlqyc3d73dv8im884xdxf";
}; };
inherit patches; inherit patches;

View File

@ -5,14 +5,14 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "xastir-${version}"; pname = "xastir";
version = "208"; version = "2.1.0";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Xastir"; owner = pname;
repo = "Xastir"; repo = pname;
rev = "707f3aa8c7ca3e3fecd32d5a4af3f742437e5dce"; rev = "Release-${version}";
sha256 = "1mm22vn3hws7dmg9wpaj4s0zkzb77i3aqa2ay3q6kqjkdhv25brl"; sha256 = "16zsgy3589snawr8f1fa22ymvpnjy6njvxmsck7q8p2xmmz2ry7r";
}; };
buildInputs = [ buildInputs = [

View File

@ -1,11 +1,11 @@
{ stdenv, fetchurl, glib, gtk2, pkgconfig, hamlib }: { stdenv, fetchurl, glib, gtk2, pkgconfig, hamlib }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "xlog-${version}"; pname = "xlog";
version = "2.0.15"; version = "2.0.17";
src = fetchurl { src = fetchurl {
url = "https://download.savannah.gnu.org/releases/xlog/${name}.tar.gz"; url = "https://download.savannah.gnu.org/releases/xlog/${pname}-${version}.tar.gz";
sha256 = "0an883wqw3zwpw8nqinm9cb17hp2xw9vf603k4l2345p61jqdw2j"; sha256 = "0vmn8518zk7qk1mbp1h8dm0f8fx0z0jvmy42c1n15il714lj7vsl";
}; };
buildInputs = [ glib pkgconfig gtk2 hamlib ]; buildInputs = [ glib pkgconfig gtk2 hamlib ];
@ -18,12 +18,11 @@ stdenv.mkDerivation rec {
and EDI (ARRL VHF/UHF contest format) and can import twlog, editest and OH1AA logbook files. and EDI (ARRL VHF/UHF contest format) and can import twlog, editest and OH1AA logbook files.
Xlog is able to do DXCC lookups and will display country information, CQ and ITU zone, Xlog is able to do DXCC lookups and will display country information, CQ and ITU zone,
location in latitude and longitude and distance and heading in kilometers or miles, location in latitude and longitude and distance and heading in kilometers or miles,
both for short and long path. both for short and long path.
''; '';
homepage = https://www.nongnu.org/xlog; homepage = https://www.nongnu.org/xlog;
maintainers = [ maintainers.mafo ]; maintainers = [ maintainers.mafo ];
license = licenses.gpl3; license = licenses.gpl3;
platforms = platforms.unix; platforms = platforms.unix;
}; };
} }

View File

@ -0,0 +1,36 @@
{ lib, stdenv, fetchFromGitHub, cmake, makeWrapper, pkgconfig
, glib, libwnck3, procps }:
with lib;
stdenv.mkDerivation rec {
name = "xsuspender-${version}";
version = "1.1";
src = fetchFromGitHub {
owner = "kernc";
repo = "xsuspender";
rev = version;
sha256 = "03lbga68dxg89d227sdwk1f5xj4r1pmj0qh2kasi2cqh8ll7qv4b";
};
outputs = [ "out" "man" "doc" ];
nativeBuildInputs = [ cmake pkgconfig makeWrapper ];
buildInputs = [ glib libwnck3 ];
enableParallelBuilding = true;
postInstall = ''
wrapProgram $out/bin/xsuspender \
--prefix PATH : "${makeBinPath [ procps ]}"
'';
meta = {
description = "Auto-suspend inactive X11 applications.";
homepage = "https://kernc.github.io/xsuspender/";
license = licenses.wtfpl;
maintainers = with maintainers; [ offline ];
platforms = platforms.linux;
};
}

View File

@ -76,11 +76,11 @@ let rpath = lib.makeLibraryPath [
in stdenv.mkDerivation rec { in stdenv.mkDerivation rec {
pname = "brave"; pname = "brave";
version = "0.58.21"; version = "0.59.34";
src = fetchurl { src = fetchurl {
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb"; url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb";
sha256 = "0mml8zjpm8gjw3krppr57y4p10ky975v0s4wyyx7ixr1lzk2qp11"; sha256 = "1i14y01387q0h12w6h780v9d98qygmx0w0vbygy4w9x9aj5nnask";
}; };
dontConfigure = true; dontConfigure = true;

View File

@ -2,7 +2,7 @@
buildGoPackage rec { buildGoPackage rec {
name = "kube-router-${version}"; name = "kube-router-${version}";
version = "0.2.3"; version = "0.2.5";
rev = "v${version}"; rev = "v${version}";
goPackagePath = "github.com/cloudnativelabs/kube-router"; goPackagePath = "github.com/cloudnativelabs/kube-router";
@ -11,7 +11,7 @@ buildGoPackage rec {
inherit rev; inherit rev;
owner = "cloudnativelabs"; owner = "cloudnativelabs";
repo = "kube-router"; repo = "kube-router";
sha256 = "1dsr76dq6sycwgh75glrcb4scv52lrrd0aivskhc7mwq30plafcj"; sha256 = "1j6q6kg4qj75v2mdy9ivvwq8mx9fpdf0w08959l8imrp5byd56wv";
}; };
buildFlagsArray = '' buildFlagsArray = ''

View File

@ -15,13 +15,13 @@ with lib;
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "kubernetes-${version}"; name = "kubernetes-${version}";
version = "1.13.2"; version = "1.13.3";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "kubernetes"; owner = "kubernetes";
repo = "kubernetes"; repo = "kubernetes";
rev = "v${version}"; rev = "v${version}";
sha256 = "1j5yyzn3c481ba6bbyx6gsa41zhg3x35sdbajlnxmbnid0g21g8g"; sha256 = "1fcp27c501ql4v7fl7rl5qyjlw1awk139rwwm0jqdpgh3sd22l2z";
}; };
buildInputs = [ removeReferencesTo makeWrapper which go rsync go-bindata ]; buildInputs = [ removeReferencesTo makeWrapper which go rsync go-bindata ];

View File

@ -2,8 +2,7 @@
let let
stableVersion = "2.1.12"; stableVersion = "2.1.12";
# Currently there is no preview version. previewVersion = "2.2.0a1";
previewVersion = stableVersion;
addVersion = args: addVersion = args:
let version = if args.stable then stableVersion else previewVersion; let version = if args.stable then stableVersion else previewVersion;
branch = if args.stable then "stable" else "preview"; branch = if args.stable then "stable" else "preview";
@ -19,7 +18,7 @@ in {
}; };
guiPreview = mkGui { guiPreview = mkGui {
stable = false; stable = false;
sha256Hash = guiSrcHash; sha256Hash = "16jjgfbdi7b3349wrqalf40qcaqzw3d4vdjbwcy8dbqblg48hn5w";
}; };
serverStable = mkServer { serverStable = mkServer {
@ -28,6 +27,6 @@ in {
}; };
serverPreview = mkServer { serverPreview = mkServer {
stable = false; stable = false;
sha256Hash = serverSrcHash; sha256Hash = "0bcsjljy947grfn3y9xyi3dbzdw5wkljq1nr66cqfkidx9f4fzni";
}; };
} }

View File

@ -20,7 +20,7 @@ in pythonPackages.buildPythonPackage rec {
raven psutil jsonschema # tox for check raven psutil jsonschema # tox for check
# Runtime dependencies # Runtime dependencies
sip (pyqt5.override { withWebSockets = true; }) sip (pyqt5.override { withWebSockets = true; })
]; ] ++ stdenv.lib.optional (!stable) pythonPackages.distro;
doCheck = false; # Failing doCheck = false; # Failing

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