commit
76a439239e
@ -0,0 +1,47 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.services.prometheus.xmpp-alerts; |
||||
|
||||
configFile = pkgs.writeText "prometheus-xmpp-alerts.yml" (builtins.toJSON cfg.configuration); |
||||
|
||||
in |
||||
|
||||
{ |
||||
options.services.prometheus.xmpp-alerts = { |
||||
|
||||
enable = mkEnableOption "XMPP Web hook service for Alertmanager"; |
||||
|
||||
configuration = mkOption { |
||||
type = types.attrs; |
||||
description = "Configuration as attribute set which will be converted to YAML"; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
systemd.services.prometheus-xmpp-alerts = { |
||||
wantedBy = [ "multi-user.target" ]; |
||||
after = [ "network-online.target" ]; |
||||
wants = [ "network-online.target" ]; |
||||
serviceConfig = { |
||||
ExecStart = "${pkgs.prometheus-xmpp-alerts}/bin/prometheus-xmpp-alerts --config ${configFile}"; |
||||
Restart = "on-failure"; |
||||
DynamicUser = true; |
||||
PrivateTmp = true; |
||||
PrivateDevices = true; |
||||
ProtectHome = true; |
||||
ProtectSystem = "strict"; |
||||
ProtectKernelTunables = true; |
||||
ProtectKernelModules = true; |
||||
ProtectControlGroups = true; |
||||
NoNewPrivileges = true; |
||||
SystemCallArchitectures = "native"; |
||||
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ]; |
||||
SystemCallFilter = [ "@system-service" ]; |
||||
}; |
||||
}; |
||||
}; |
||||
} |
@ -1,328 +0,0 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.services.dnscrypt-proxy; |
||||
|
||||
stateDirectory = "/var/lib/dnscrypt-proxy"; |
||||
|
||||
# The minisign public key used to sign the upstream resolver list. |
||||
# This is somewhat more flexible than preloading the key as an |
||||
# embedded string. |
||||
upstreamResolverListPubKey = pkgs.fetchurl { |
||||
url = https://raw.githubusercontent.com/dyne/dnscrypt-proxy/master/minisign.pub; |
||||
sha256 = "18lnp8qr6ghfc2sd46nn1rhcpr324fqlvgsp4zaigw396cd7vnnh"; |
||||
}; |
||||
|
||||
# Internal flag indicating whether the upstream resolver list is used. |
||||
useUpstreamResolverList = cfg.customResolver == null; |
||||
|
||||
# The final local address. |
||||
localAddress = "${cfg.localAddress}:${toString cfg.localPort}"; |
||||
|
||||
# The final resolvers list path. |
||||
resolverList = "${stateDirectory}/dnscrypt-resolvers.csv"; |
||||
|
||||
# Build daemon command line |
||||
|
||||
resolverArgs = |
||||
if (cfg.customResolver == null) |
||||
then |
||||
[ "-L ${resolverList}" |
||||
"-R ${cfg.resolverName}" |
||||
] |
||||
else with cfg.customResolver; |
||||
[ "-N ${name}" |
||||
"-k ${key}" |
||||
"-r ${address}:${toString port}" |
||||
]; |
||||
|
||||
daemonArgs = |
||||
[ "-a ${localAddress}" ] |
||||
++ resolverArgs |
||||
++ cfg.extraArgs; |
||||
in |
||||
|
||||
{ |
||||
meta = { |
||||
maintainers = with maintainers; [ joachifm ]; |
||||
doc = ./dnscrypt-proxy.xml; |
||||
}; |
||||
|
||||
options = { |
||||
# Before adding another option, consider whether it could |
||||
# equally well be passed via extraArgs. |
||||
|
||||
services.dnscrypt-proxy = { |
||||
enable = mkOption { |
||||
default = false; |
||||
type = types.bool; |
||||
description = "Whether to enable the DNSCrypt client proxy"; |
||||
}; |
||||
|
||||
localAddress = mkOption { |
||||
default = "127.0.0.1"; |
||||
type = types.str; |
||||
description = '' |
||||
Listen for DNS queries to relay on this address. The only reason to |
||||
change this from its default value is to proxy queries on behalf |
||||
of other machines (typically on the local network). |
||||
''; |
||||
}; |
||||
|
||||
localPort = mkOption { |
||||
default = 53; |
||||
type = types.int; |
||||
description = '' |
||||
Listen for DNS queries to relay on this port. The default value |
||||
assumes that the DNSCrypt proxy should relay DNS queries directly. |
||||
When running as a forwarder for another DNS client, set this option |
||||
to a different value; otherwise leave the default. |
||||
''; |
||||
}; |
||||
|
||||
resolverName = mkOption { |
||||
default = "random"; |
||||
example = "dnscrypt.eu-nl"; |
||||
type = types.nullOr types.str; |
||||
description = '' |
||||
The name of the DNSCrypt resolver to use, taken from |
||||
<filename>${resolverList}</filename>. The default is to |
||||
pick a random non-logging resolver that supports DNSSEC. |
||||
''; |
||||
}; |
||||
|
||||
customResolver = mkOption { |
||||
default = null; |
||||
description = '' |
||||
Use an unlisted resolver (e.g., a private DNSCrypt provider). For |
||||
advanced users only. If specified, this option takes precedence. |
||||
''; |
||||
type = types.nullOr (types.submodule ({ ... }: { options = { |
||||
address = mkOption { |
||||
type = types.str; |
||||
description = "IP address"; |
||||
example = "208.67.220.220"; |
||||
}; |
||||
|
||||
port = mkOption { |
||||
type = types.int; |
||||
description = "Port"; |
||||
default = 443; |
||||
}; |
||||
|
||||
name = mkOption { |
||||
type = types.str; |
||||
description = "Fully qualified domain name"; |
||||
example = "2.dnscrypt-cert.example.com"; |
||||
}; |
||||
|
||||
key = mkOption { |
||||
type = types.str; |
||||
description = "Public key"; |
||||
example = "B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79"; |
||||
}; |
||||
}; })); |
||||
}; |
||||
|
||||
extraArgs = mkOption { |
||||
default = []; |
||||
type = types.listOf types.str; |
||||
description = '' |
||||
Additional command-line arguments passed verbatim to the daemon. |
||||
See <citerefentry><refentrytitle>dnscrypt-proxy</refentrytitle> |
||||
<manvolnum>8</manvolnum></citerefentry> for details. |
||||
''; |
||||
example = [ "-X libdcplugin_example_cache.so,--min-ttl=60" ]; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable (mkMerge [{ |
||||
assertions = [ |
||||
{ assertion = (cfg.customResolver != null) || (cfg.resolverName != null); |
||||
message = "please configure upstream DNSCrypt resolver"; |
||||
} |
||||
]; |
||||
|
||||
# make man 8 dnscrypt-proxy work |
||||
environment.systemPackages = [ pkgs.dnscrypt-proxy ]; |
||||
|
||||
users.users.dnscrypt-proxy = { |
||||
description = "dnscrypt-proxy daemon user"; |
||||
isSystemUser = true; |
||||
group = "dnscrypt-proxy"; |
||||
}; |
||||
users.groups.dnscrypt-proxy = {}; |
||||
|
||||
systemd.sockets.dnscrypt-proxy = { |
||||
description = "dnscrypt-proxy listening socket"; |
||||
documentation = [ "man:dnscrypt-proxy(8)" ]; |
||||
|
||||
wantedBy = [ "sockets.target" ]; |
||||
|
||||
socketConfig = { |
||||
ListenStream = localAddress; |
||||
ListenDatagram = localAddress; |
||||
}; |
||||
}; |
||||
|
||||
systemd.services.dnscrypt-proxy = { |
||||
description = "dnscrypt-proxy daemon"; |
||||
documentation = [ "man:dnscrypt-proxy(8)" ]; |
||||
|
||||
before = [ "nss-lookup.target" ]; |
||||
after = [ "network.target" ]; |
||||
requires = [ "dnscrypt-proxy.socket "]; |
||||
|
||||
serviceConfig = { |
||||
NonBlocking = "true"; |
||||
ExecStart = "${pkgs.dnscrypt-proxy}/bin/dnscrypt-proxy ${toString daemonArgs}"; |
||||
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; |
||||
|
||||
User = "dnscrypt-proxy"; |
||||
|
||||
PrivateTmp = true; |
||||
PrivateDevices = true; |
||||
ProtectHome = true; |
||||
}; |
||||
}; |
||||
} |
||||
|
||||
(mkIf config.security.apparmor.enable { |
||||
systemd.services.dnscrypt-proxy.after = [ "apparmor.service" ]; |
||||
|
||||
security.apparmor.profiles = singleton (pkgs.writeText "apparmor-dnscrypt-proxy" '' |
||||
${pkgs.dnscrypt-proxy}/bin/dnscrypt-proxy { |
||||
/dev/null rw, |
||||
/dev/random r, |
||||
/dev/urandom r, |
||||
|
||||
/etc/passwd r, |
||||
/etc/group r, |
||||
${config.environment.etc."nsswitch.conf".source} r, |
||||
|
||||
${getLib pkgs.glibc}/lib/*.so mr, |
||||
${pkgs.tzdata}/share/zoneinfo/** r, |
||||
|
||||
network inet stream, |
||||
network inet6 stream, |
||||
network inet dgram, |
||||
network inet6 dgram, |
||||
|
||||
${getLib pkgs.dnscrypt-proxy}/lib/dnscrypt-proxy/libdcplugin*.so mr, |
||||
|
||||
${getLib pkgs.gcc.cc}/lib/libssp.so.* mr, |
||||
${getLib pkgs.libsodium}/lib/libsodium.so.* mr, |
||||
${getLib pkgs.systemd}/lib/libsystemd.so.* mr, |
||||
${getLib pkgs.utillinuxMinimal.out}/lib/libmount.so.* mr, |
||||
${getLib pkgs.utillinuxMinimal.out}/lib/libblkid.so.* mr, |
||||
${getLib pkgs.utillinuxMinimal.out}/lib/libuuid.so.* mr, |
||||
${getLib pkgs.xz}/lib/liblzma.so.* mr, |
||||
${getLib pkgs.libgcrypt}/lib/libgcrypt.so.* mr, |
||||
${getLib pkgs.libgpgerror}/lib/libgpg-error.so.* mr, |
||||
${getLib pkgs.libcap}/lib/libcap.so.* mr, |
||||
${getLib pkgs.lz4}/lib/liblz4.so.* mr, |
||||
${getLib pkgs.attr}/lib/libattr.so.* mr, # */ |
||||
|
||||
${resolverList} r, |
||||
|
||||
/run/systemd/notify rw, |
||||
} |
||||
''); |
||||
}) |
||||
|
||||
(mkIf useUpstreamResolverList { |
||||
systemd.services.init-dnscrypt-proxy-statedir = { |
||||
description = "Initialize dnscrypt-proxy state directory"; |
||||
|
||||
wantedBy = [ "dnscrypt-proxy.service" ]; |
||||
before = [ "dnscrypt-proxy.service" ]; |
||||
|
||||
script = '' |
||||
mkdir -pv ${stateDirectory} |
||||
chown -c dnscrypt-proxy:dnscrypt-proxy ${stateDirectory} |
||||
cp -uv \ |
||||
${pkgs.dnscrypt-proxy}/share/dnscrypt-proxy/dnscrypt-resolvers.csv \ |
||||
${stateDirectory} |
||||
''; |
||||
|
||||
serviceConfig = { |
||||
Type = "oneshot"; |
||||
RemainAfterExit = true; |
||||
}; |
||||
}; |
||||
|
||||
systemd.services.update-dnscrypt-resolvers = { |
||||
description = "Update list of DNSCrypt resolvers"; |
||||
|
||||
requires = [ "init-dnscrypt-proxy-statedir.service" ]; |
||||
after = [ "init-dnscrypt-proxy-statedir.service" ]; |
||||
|
||||
path = with pkgs; [ curl diffutils dnscrypt-proxy minisign ]; |
||||
script = '' |
||||
cd ${stateDirectory} |
||||
domain=raw.githubusercontent.com |
||||
get="curl -fSs --resolve $domain:443:$(hostip -r 8.8.8.8 $domain | head -1)" |
||||
$get -o dnscrypt-resolvers.csv.tmp \ |
||||
https://$domain/dyne/dnscrypt-proxy/master/dnscrypt-resolvers.csv |
||||
$get -o dnscrypt-resolvers.csv.minisig.tmp \ |
||||
https://$domain/dyne/dnscrypt-proxy/master/dnscrypt-resolvers.csv.minisig |
||||
mv dnscrypt-resolvers.csv.minisig{.tmp,} |
||||
if ! minisign -q -V -p ${upstreamResolverListPubKey} \ |
||||
-m dnscrypt-resolvers.csv.tmp -x dnscrypt-resolvers.csv.minisig ; then |
||||
echo "failed to verify resolver list!" >&2 |
||||
exit 1 |
||||
fi |
||||
[[ -f dnscrypt-resolvers.csv ]] && mv dnscrypt-resolvers.csv{,.old} |
||||
mv dnscrypt-resolvers.csv{.tmp,} |
||||
if cmp dnscrypt-resolvers.csv{,.old} ; then |
||||
echo "no change" |
||||
else |
||||
echo "resolver list updated" |
||||
fi |
||||
''; |
||||
|
||||
serviceConfig = { |
||||
PrivateTmp = true; |
||||
PrivateDevices = true; |
||||
ProtectHome = true; |
||||
ProtectSystem = "strict"; |
||||
ReadWritePaths = "${dirOf stateDirectory} ${stateDirectory}"; |
||||
SystemCallFilter = "~@mount"; |
||||
}; |
||||
}; |
||||
|
||||
systemd.timers.update-dnscrypt-resolvers = { |
||||
wantedBy = [ "timers.target" ]; |
||||
timerConfig = { |
||||
OnBootSec = "5min"; |
||||
OnUnitActiveSec = "6h"; |
||||
}; |
||||
}; |
||||
}) |
||||
]); |
||||
|
||||
imports = [ |
||||
(mkRenamedOptionModule [ "services" "dnscrypt-proxy" "port" ] [ "services" "dnscrypt-proxy" "localPort" ]) |
||||
|
||||
(mkChangedOptionModule |
||||
[ "services" "dnscrypt-proxy" "tcpOnly" ] |
||||
[ "services" "dnscrypt-proxy" "extraArgs" ] |
||||
(config: |
||||
let val = getAttrFromPath [ "services" "dnscrypt-proxy" "tcpOnly" ] config; in |
||||
optional val "-T")) |
||||
|
||||
(mkChangedOptionModule |
||||
[ "services" "dnscrypt-proxy" "ephemeralKeys" ] |
||||
[ "services" "dnscrypt-proxy" "extraArgs" ] |
||||
(config: |
||||
let val = getAttrFromPath [ "services" "dnscrypt-proxy" "ephemeralKeys" ] config; in |
||||
optional val "-E")) |
||||
|
||||
(mkRemovedOptionModule [ "services" "dnscrypt-proxy" "resolverList" ] '' |
||||
The current resolver listing from upstream is always used |
||||
unless a custom resolver is specified. |
||||
'') |
||||
]; |
||||
} |
@ -1,66 +0,0 @@ |
||||
<chapter xmlns="http://docbook.org/ns/docbook" |
||||
xmlns:xlink="http://www.w3.org/1999/xlink" |
||||
xmlns:xi="http://www.w3.org/2001/XInclude" |
||||
version="5.0" |
||||
xml:id="sec-dnscrypt-proxy"> |
||||
<title>DNSCrypt client proxy</title> |
||||
<para> |
||||
The DNSCrypt client proxy relays DNS queries to a DNSCrypt enabled upstream |
||||
resolver. The traffic between the client and the upstream resolver is |
||||
encrypted and authenticated, mitigating the risk of MITM attacks, DNS |
||||
poisoning attacks, and third-party snooping (assuming the upstream is |
||||
trustworthy). |
||||
</para> |
||||
<sect1 xml:id="sec-dnscrypt-proxy-configuration"> |
||||
<title>Basic configuration</title> |
||||
|
||||
<para> |
||||
To enable the client proxy, set |
||||
<programlisting> |
||||
<xref linkend="opt-services.dnscrypt-proxy.enable"/> = true; |
||||
</programlisting> |
||||
</para> |
||||
|
||||
<para> |
||||
Enabling the client proxy does not alter the system nameserver; to relay |
||||
local queries, prepend <literal>127.0.0.1</literal> to |
||||
<option>networking.nameservers</option>. |
||||
</para> |
||||
</sect1> |
||||
<sect1 xml:id="sec-dnscrypt-proxy-forwarder"> |
||||
<title>As a forwarder for another DNS client</title> |
||||
|
||||
<para> |
||||
To run the DNSCrypt proxy client as a forwarder for another DNS client, |
||||
change the default proxy listening port to a non-standard value and point |
||||
the other client to it: |
||||
<programlisting> |
||||
<xref linkend="opt-services.dnscrypt-proxy.localPort"/> = 43; |
||||
</programlisting> |
||||
</para> |
||||
|
||||
<sect2 xml:id="sec-dnscrypt-proxy-forwarder-dsnmasq"> |
||||
<title>dnsmasq</title> |
||||
<para> |
||||
<programlisting> |
||||
{ |
||||
<xref linkend="opt-services.dnsmasq.enable"/> = true; |
||||
<xref linkend="opt-services.dnsmasq.servers"/> = [ "127.0.0.1#43" ]; |
||||
} |
||||
</programlisting> |
||||
</para> |
||||
</sect2> |
||||
|
||||
<sect2 xml:id="sec-dnscrypt-proxy-forwarder-unbound"> |
||||
<title>unbound</title> |
||||
<para> |
||||
<programlisting> |
||||
{ |
||||
<xref linkend="opt-services.unbound.enable"/> = true; |
||||
<xref linkend="opt-services.unbound.forwardAddresses"/> = [ "127.0.0.1@43" ]; |
||||
} |
||||
</programlisting> |
||||
</para> |
||||
</sect2> |
||||
</sect1> |
||||
</chapter> |
@ -0,0 +1,61 @@ |
||||
{ config, lib, pkgs, ... }: with lib; |
||||
|
||||
let |
||||
cfg = config.services.dnscrypt-proxy2; |
||||
in |
||||
|
||||
{ |
||||
options.services.dnscrypt-proxy2 = { |
||||
enable = mkEnableOption "dnscrypt-proxy2"; |
||||
|
||||
settings = mkOption { |
||||
description = '' |
||||
Attrset that is converted and passed as TOML config file. |
||||
For available params, see: <link xlink:href="https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/dnscrypt-proxy/example-dnscrypt-proxy.toml"/> |
||||
''; |
||||
example = literalExample '' |
||||
{ |
||||
sources.public-resolvers = { |
||||
urls = [ "https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md" ]; |
||||
cache_file = "public-resolvers.md"; |
||||
minisign_key = "RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3"; |
||||
refresh_delay = 72; |
||||
}; |
||||
} |
||||
''; |
||||
type = types.attrs; |
||||
default = {}; |
||||
}; |
||||
|
||||
configFile = mkOption { |
||||
description = '' |
||||
Path to TOML config file. See: <link xlink:href="https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/dnscrypt-proxy/example-dnscrypt-proxy.toml"/> |
||||
If this option is set, it will override any configuration done in options.services.dnscrypt-proxy2.settings. |
||||
''; |
||||
example = "/etc/dnscrypt-proxy/dnscrypt-proxy.toml"; |
||||
type = types.path; |
||||
default = pkgs.runCommand "dnscrypt-proxy.toml" { |
||||
json = builtins.toJSON cfg.settings; |
||||
passAsFile = [ "json" ]; |
||||
} '' |
||||
${pkgs.remarshal}/bin/json2toml < $jsonPath > $out |
||||
''; |
||||
defaultText = literalExample "TOML file generated from services.dnscrypt-proxy2.settings"; |
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
|
||||
networking.nameservers = lib.mkDefault [ "127.0.0.1" ]; |
||||
|
||||
systemd.services.dnscrypt-proxy2 = { |
||||
after = [ "network.target" ]; |
||||
wantedBy = [ "multi-user.target" ]; |
||||
serviceConfig = { |
||||
AmbientCapabilities = "CAP_NET_BIND_SERVICE"; |
||||
DynamicUser = true; |
||||
ExecStart = "${pkgs.dnscrypt-proxy2}/bin/dnscrypt-proxy -config ${cfg.configFile}"; |
||||
}; |
||||
}; |
||||
}; |
||||
} |
@ -0,0 +1,28 @@ |
||||
{ lib, rustPlatform, fetchFromGitHub, installShellFiles }: |
||||
|
||||
rustPlatform.buildRustPackage rec { |
||||
pname = "pueue"; |
||||
version = "0.1.5"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "Nukesor"; |
||||
repo = pname; |
||||
rev = "v${version}"; |
||||
sha256 = "03aj4vw8kvwqk1i1a4kah5b574ahs930ij7xmqsvdy7f8c2g6pbq"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ installShellFiles ]; |
||||
|
||||
cargoSha256 = "1y33n0dmrssv35l0apfq1mchyh92cfbzjarh0m8zb2nxwhvk7paw"; |
||||
|
||||
postInstall = '' |
||||
installShellCompletion utils/completions/pueue.{bash,fish} --zsh utils/completions/_pueue |
||||
''; |
||||
|
||||
meta = with lib; { |
||||
description = "A daemon for managing long running shell commands"; |
||||
homepage = "https://github.com/Nukesor/pueue"; |
||||
license = licenses.mit; |
||||
maintainers = [ maintainers.marsam ]; |
||||
}; |
||||
} |
@ -1,27 +0,0 @@ |
||||
{ stdenv, cmake, fetchFromGitHub |
||||
, qtbase, qtmultimedia, qtwebengine, qtxmlpatterns |
||||
, version ? "1.0.01" |
||||
, sourceSha ? "1jw8bj3lcqngr0mqwvz1gf47qjxbwiyda7x4sm96a6ckga7pcwyb" |
||||
}: |
||||
stdenv.mkDerivation { |
||||
pname = "otter-browser"; |
||||
inherit version; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "OtterBrowser"; |
||||
repo = "otter-browser"; |
||||
rev = "v${version}"; |
||||
sha256 = sourceSha; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
|
||||
buildInputs = [ qtbase qtmultimedia qtwebengine qtxmlpatterns ]; |
||||
|
||||
meta = with stdenv.lib; { |
||||
homepage = https://otter-browser.org; |
||||
license = licenses.gpl3Plus; |
||||
description = "Browser aiming to recreate the best aspects of the classic Opera (12.x) UI using Qt5"; |
||||
maintainers = with maintainers; [ lheckemann ]; |
||||
}; |
||||
} |
@ -0,0 +1,71 @@ |
||||
{ stdenv, fetchFromGitHub, fetchpatch |
||||
, meson, ninja, pkgconfig, desktop-file-utils |
||||
, python3, vala, wrapGAppsHook |
||||
, evolution-data-server |
||||
, libical |
||||
, libgee |
||||
, json-glib |
||||
, glib |
||||
, sqlite |
||||
, libsoup |
||||
, gtk3 |
||||
, pantheon /* granite, icons, maintainers */ |
||||
, webkitgtk |
||||
}: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
pname = "elementary-planner"; |
||||
version = "2.1.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "alainm23"; |
||||
repo = "planner"; |
||||
rev = version; |
||||
sha256 = "0swj94pqf00wwzsgjap8z19k33gg1wj2b78ba1aj9h791j8lmaim"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ |
||||
desktop-file-utils |
||||
meson |
||||
ninja |
||||
pkgconfig |
||||
python3 |
||||
vala |
||||
wrapGAppsHook |
||||
]; |
||||
|
||||
buildInputs = [ |
||||
evolution-data-server |
||||
libical |
||||
libgee |
||||
json-glib |
||||
glib |
||||
sqlite |
||||
libsoup |
||||
gtk3 |
||||
pantheon.granite |
||||
webkitgtk |
||||
pantheon.elementary-icon-theme |
||||
]; |
||||
|
||||
# Fix version string, remove in next update! |
||||
patches = [ |
||||
(fetchpatch { |
||||
url = "https://github.com/alainm23/planner/pull/194/commits/3d0a2197087b13fe90fa6f85f817ba56798d632c.patch"; |
||||
sha256 = "077q5jddi8jaw2ypc6szbd1c50i4x3b21jvmvi3w7g5zhjwpkmf5"; |
||||
}) |
||||
]; |
||||
|
||||
postPatch = '' |
||||
chmod +x build-aux/meson/post_install.py |
||||
patchShebangs build-aux/meson/post_install.py |
||||
''; |
||||
|
||||
meta = with stdenv.lib; { |
||||
description = "Task and project manager designed to elementary OS"; |
||||
homepage = "https://planner-todo.web.app"; |
||||
license = licenses.gpl3; |
||||
maintainers = with maintainers; [ dtzWill ] ++ pantheon.maintainers; |
||||
}; |
||||
} |
||||
|
@ -0,0 +1,32 @@ |
||||
{ mkDerivation, lib, fetchurl, cmake, pkgconfig, extra-cmake-modules, |
||||
kconfig, kconfigwidgets, kdbusaddons, kdoctools, ki18n, kidletime, |
||||
kjobwidgets, kio, knotifications, kwindowsystem, kxmlgui, ktextwidgets, |
||||
kcalendarcore |
||||
}: |
||||
|
||||
mkDerivation rec { |
||||
pname = "ktimetracker"; |
||||
version = "5.0.1"; |
||||
|
||||
src = fetchurl { |
||||
url = "mirror://kde/stable/${pname}/${version}/src/${pname}-${version}.tar.xz"; |
||||
sha256 = "0jp63fby052rapjjaz413b1wjz4qsgpxh82y2d75jzimch0n5s02"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ |
||||
cmake pkgconfig extra-cmake-modules |
||||
]; |
||||
|
||||
buildInputs = [ |
||||
kconfig kconfigwidgets kdbusaddons kdoctools ki18n kidletime kjobwidgets |
||||
kio knotifications kwindowsystem kxmlgui ktextwidgets |
||||
kcalendarcore |
||||
]; |
||||
|
||||
meta = with lib; { |
||||
description = "Todo management and time tracking application"; |
||||
license = licenses.gpl2; |
||||
homepage = "https://userbase.kde.org/KTimeTracker"; |
||||
maintainers = with maintainers; [ dtzWill ]; |
||||
}; |
||||
} |
@ -0,0 +1,36 @@ |
||||
{ lib, fetchFromGitHub, buildGoModule, installShellFiles }: |
||||
|
||||
buildGoModule rec { |
||||
pname = "gh"; |
||||
version = "0.5.3"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "cli"; |
||||
repo = "cli"; |
||||
rev = "v${version}"; |
||||
sha256 = "033y9bwdaj8735nmj22k8lrgkgimji7hyly9i4jyp11iaa7cgd7a"; |
||||
}; |
||||
|
||||
modSha256 = "0ina3m2ixkkz2fws6ifwy34pmp6kn5s3j7w40alz6vmybn2smy1h"; |
||||
|
||||
buildFlagsArray = [ |
||||
"-ldflags=-X github.com/cli/cli/command.Version=${version}" |
||||
]; |
||||
|
||||
subPackages = [ "cmd/gh" ]; |
||||
|
||||
nativeBuildInputs = [ installShellFiles ]; |
||||
postInstall = '' |
||||
for shell in bash fish zsh; do |
||||
$out/bin/gh completion -s $shell > gh.$shell |
||||
installShellCompletion gh.$shell |
||||
done |
||||
''; |
||||
|
||||
meta = with lib; { |
||||
description = "GitHub CLI tool"; |
||||
homepage = "https://github.com/cli/cli"; |
||||
license = licenses.mit; |
||||
maintainers = with maintainers; [ zowoq ]; |
||||
}; |
||||
} |
@ -1,169 +0,0 @@ |
||||
--- a/src/display/utils.rs
|
||||
+++ b/src/display/utils.rs
|
||||
@@ -53,166 +53,3 @@
|
||||
_ => ColorMode::TwoTone,
|
||||
}
|
||||
}
|
||||
-
|
||||
-#[cfg(all(windows, test))]
|
||||
-mod tests {
|
||||
- use crate::display::color_mode::ColorMode;
|
||||
- use crate::display::utils::detect_color_mode;
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_windows() {
|
||||
- assert_eq!(detect_color_mode(2), ColorMode::ThreeBit);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-#[cfg(all(unix, test))]
|
||||
-mod tests {
|
||||
- use crate::display::color_mode::ColorMode;
|
||||
- use crate::display::utils::detect_color_mode;
|
||||
- use std::env::{remove_var, set_var};
|
||||
-
|
||||
- fn clear_env() {
|
||||
- remove_var("COLORTERM");
|
||||
- remove_var("VTE_VERSION");
|
||||
- remove_var("TERM_PROGRAM");
|
||||
- remove_var("TERM");
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_2_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(2), ColorMode::TwoTone);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_8_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(8), ColorMode::ThreeBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_less_8_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(7), ColorMode::TwoTone);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_16_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(16), ColorMode::FourBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_less_16_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(15), ColorMode::ThreeBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_256_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(256), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_less_256_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(255), ColorMode::FourBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_no_env_more_256_colors() {
|
||||
- clear_env();
|
||||
- assert_eq!(detect_color_mode(257), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_term_env_no_256() {
|
||||
- clear_env();
|
||||
- set_var("TERM", "XTERM");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TwoTone);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_term_env_with_256() {
|
||||
- clear_env();
|
||||
- set_var("TERM", "XTERM-256");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_term_program_env_apple_terminal() {
|
||||
- clear_env();
|
||||
- set_var("TERM_PROGRAM", "Apple_Terminal");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_term_program_env_iterm() {
|
||||
- clear_env();
|
||||
- set_var("TERM_PROGRAM", "iTerm.app");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_term_program_env_other() {
|
||||
- clear_env();
|
||||
- set_var("TERM_PROGRAM", "other");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TwoTone);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_vte_version_0_36_00() {
|
||||
- clear_env();
|
||||
- set_var("VTE_VERSION", "3600");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TrueColor);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_vte_version_greater_0_36_00() {
|
||||
- clear_env();
|
||||
- set_var("VTE_VERSION", "3601");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TrueColor);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_vte_version_less_0_36_00() {
|
||||
- clear_env();
|
||||
- set_var("VTE_VERSION", "1");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::EightBit);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_vte_version_0() {
|
||||
- clear_env();
|
||||
- set_var("VTE_VERSION", "0");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TwoTone);
|
||||
- }
|
||||
- #[test]
|
||||
- fn detect_color_mode_vte_version_invalid() {
|
||||
- clear_env();
|
||||
- set_var("VTE_VERSION", "invalid");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TwoTone);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_colorterm_env_is_truecolor() {
|
||||
- clear_env();
|
||||
- set_var("COLORTERM", "truecolor");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TrueColor);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_colorterm_env_is_24bit() {
|
||||
- clear_env();
|
||||
- set_var("COLORTERM", "24bit");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TrueColor);
|
||||
- }
|
||||
-
|
||||
- #[test]
|
||||
- fn detect_color_mode_colorterm_env_is_other() {
|
||||
- clear_env();
|
||||
- set_var("COLORTERM", "other");
|
||||
- assert_eq!(detect_color_mode(0), ColorMode::TwoTone);
|
||||
- }
|
||||
-}
|
@ -0,0 +1,12 @@ |
||||
--- a/src/client/connection.rs 2020-02-04 12:48:43.845299096 +0100
|
||||
+++ b/src/client/connection.rs 2020-02-04 12:50:00.140329310 +0100
|
||||
@@ -546,8 +546,8 @@
|
||||
&[msg::NEWKEYS],
|
||||
&mut session.0.write_buffer,
|
||||
);
|
||||
- session.0.kex = Some(Kex::NewKeys(newkeys));
|
||||
newkeys.sent = true;
|
||||
+ session.0.kex = Some(Kex::NewKeys(newkeys));
|
||||
}
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,27 @@ |
||||
{ lib, fetchFromGitHub }: |
||||
|
||||
let |
||||
pname = "TT2020"; |
||||
version = "2020-01-05"; |
||||
in |
||||
fetchFromGitHub { |
||||
name = "${pname}-${version}"; |
||||
owner = "ctrlcctrlv"; |
||||
repo = pname; |
||||
rev = "2b418fab5f99f72a18b3b2e7e2745ac4e03aa612"; |
||||
sha256 = "1z0nizvs0gp0xl7pn6xcjvsysxhnfm7aqfamplkyvya3fxvhncds"; |
||||
|
||||
postFetch = '' |
||||
tar xf $downloadedFile --strip=1 |
||||
install -Dm644 -t $out/share/fonts/truetype dist/*.ttf |
||||
install -Dm644 -t $out/share/fonts/woff2 dist/*.woff2 |
||||
''; |
||||
|
||||
meta = with lib; { |
||||
description = "An advanced, open source, hyperrealistic, multilingual typewriter font for a new decade"; |
||||
homepage = "https://ctrlcctrlv.github.io/TT2020"; |
||||
license = licenses.ofl; |
||||
maintainers = with maintainers; [ sikmir ]; |
||||
platforms = platforms.all; |
||||
}; |
||||
} |
@ -1,6 +1,6 @@ |
||||
import ./generic.nix { |
||||
major_version = "4"; |
||||
minor_version = "10"; |
||||
patch_version = "0+beta1"; |
||||
sha256 = "18jrgww98v1famb2x5jhbsnm4ngph2rvq0z4cxpqxfn06yb53jyf"; |
||||
patch_version = "0+beta2"; |
||||
sha256 = "106y4jarwib6xxy0vhd7766mxhnlr1zq05jchisklyrgjly0g3ry"; |
||||
} |
||||
|
@ -0,0 +1,112 @@ |
||||
{ stdenv, fetchurl, writeText, sbclBootstrap |
||||
, sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit" |
||||
, threadSupport ? (stdenv.isi686 || stdenv.isx86_64 || "aarch64-linux" == stdenv.hostPlatform.system) |
||||
# Meant for sbcl used for creating binaries portable to non-NixOS via save-lisp-and-die. |
||||
# Note that the created binaries still need `patchelf --set-interpreter ...` |
||||
# to get rid of ${glibc} dependency. |
||||
, purgeNixReferences ? false |
||||
, texinfo |
||||
}: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
pname = "sbcl"; |
||||
version = "2.0.0"; |
||||
|
||||
src = fetchurl { |
||||
url = "mirror://sourceforge/project/sbcl/sbcl/${version}/${pname}-${version}-source.tar.bz2"; |
||||
sha256 = "1krgd69cirp4ili2pfsh1a0mfvq722jbknlvmf17qhsxh1b94dlh"; |
||||
}; |
||||
|
||||
buildInputs = [texinfo]; |
||||
|
||||
patchPhase = '' |
||||
echo '"${version}.nixos"' > version.lisp-expr |
||||
echo " |
||||
(lambda (features) |
||||
(flet ((enable (x) |
||||
(pushnew x features)) |
||||
(disable (x) |
||||
(setf features (remove x features)))) |
||||
'' |
||||
+ (if threadSupport then "(enable :sb-thread)" else "(disable :sb-thread)") |
||||
+ stdenv.lib.optionalString stdenv.isAarch32 "(enable :arm)" |
||||
+ '' |
||||
)) " > customize-target-features.lisp |
||||
|
||||
pwd |
||||
|
||||
# SBCL checks whether files are up-to-date in many places.. |
||||
# Unfortunately, same timestamp is not good enough |
||||
sed -e 's@> x y@>= x y@' -i contrib/sb-aclrepl/repl.lisp |
||||
#sed -e '/(date)/i((= date 2208988801) 2208988800)' -i contrib/asdf/asdf.lisp |
||||
sed -i src/cold/slam.lisp -e \ |
||||
'/file-write-date input/a)' |
||||
sed -i src/cold/slam.lisp -e \ |
||||
'/file-write-date output/i(or (and (= 2208988801 (file-write-date output)) (= 2208988801 (file-write-date input)))' |
||||
sed -i src/code/target-load.lisp -e \ |
||||
'/date defaulted-fasl/a)' |
||||
sed -i src/code/target-load.lisp -e \ |
||||
'/date defaulted-source/i(or (and (= 2208988801 (file-write-date defaulted-source-truename)) (= 2208988801 (file-write-date defaulted-fasl-truename)))' |
||||
|
||||
# Fix the tests |
||||
sed -e '5,$d' -i contrib/sb-bsd-sockets/tests.lisp |
||||
sed -e '5,$d' -i contrib/sb-simple-streams/*test*.lisp |
||||
|
||||
# Use whatever `cc` the stdenv provides |
||||
substituteInPlace src/runtime/Config.x86-64-darwin --replace gcc cc |
||||
|
||||
substituteInPlace src/runtime/Config.x86-64-darwin \ |
||||
--replace mmacosx-version-min=10.4 mmacosx-version-min=10.5 |
||||
'' |
||||
+ (if purgeNixReferences |
||||
then |
||||
# This is the default location to look for the core; by default in $out/lib/sbcl |
||||
'' |
||||
sed 's@^\(#define SBCL_HOME\) .*$@\1 "/no-such-path"@' \ |
||||
-i src/runtime/runtime.c |
||||
'' |
||||
else |
||||
# Fix software version retrieval |
||||
'' |
||||
sed -e "s@/bin/uname@$(command -v uname)@g" -i src/code/*-os.lisp \ |
||||
src/code/run-program.lisp |
||||
'' |
||||
); |
||||
|
||||
|
||||
preBuild = '' |
||||
export INSTALL_ROOT=$out |
||||
mkdir -p test-home |
||||
export HOME=$PWD/test-home |
||||
''; |
||||
|
||||
buildPhase = '' |
||||
sh make.sh --prefix=$out --xc-host="${sbclBootstrapHost}" |
||||
(cd doc/manual ; make info) |
||||
''; |
||||
|
||||
installPhase = '' |
||||
INSTALL_ROOT=$out sh install.sh |
||||
'' |
||||
+ stdenv.lib.optionalString (!purgeNixReferences) '' |
||||
cp -r src $out/lib/sbcl |
||||
cp -r contrib $out/lib/sbcl |
||||
cat >$out/lib/sbcl/sbclrc <<EOF |
||||
(setf (logical-pathname-translations "SYS") |
||||
'(("SYS:SRC;**;*.*.*" #P"$out/lib/sbcl/src/**/*.*") |
||||
("SYS:CONTRIB;**;*.*.*" #P"$out/lib/sbcl/contrib/**/*.*"))) |
||||
EOF |
||||
''; |
||||
|
||||
setupHook = stdenv.lib.optional purgeNixReferences (writeText "setupHook.sh" '' |
||||
addEnvHooks "$targetOffset" _setSbclHome |
||||
_setSbclHome() { |
||||
export SBCL_HOME='@out@/lib/sbcl/' |
||||
} |
||||
''); |
||||
|
||||
meta = sbclBootstrap.meta // { |
||||
inherit version; |
||||
updateWalker = true; |
||||
}; |
||||
} |
@ -0,0 +1,45 @@ |
||||
{ stdenv |
||||
, lib |
||||
, fetchFromGitHub |
||||
, cmake |
||||
, openblas |
||||
# Check Inputs |
||||
, python2 |
||||
}: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
pname = "libcint"; |
||||
version = "3.0.19"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "sunqm"; |
||||
repo = "libcint"; |
||||
rev = "v${version}"; |
||||
sha256 = "0x613f2hiqi2vbhp20fcl7rhxb07f2714lplzd0vkvv07phagip9"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
buildInputs = [ openblas ]; |
||||
cmakeFlags = [ |
||||
"-DENABLE_TEST=1" |
||||
"-DQUICK_TEST=1" |
||||
"-DCMAKE_INSTALL_PREFIX=" # ends up double-adding /nix/store/... prefix, this avoids issue |
||||
]; |
||||
|
||||
doCheck = true; |
||||
# Test syntax (like print statements) is written in python2. Fixed when #33 merged: https://github.com/sunqm/libcint/pull/33 |
||||
checkInputs = [ python2.pkgs.numpy ]; |
||||
|
||||
meta = with lib; { |
||||
description = "General GTO integrals for quantum chemistry"; |
||||
longDescription = '' |
||||
libcint is an open source library for analytical Gaussian integrals. |
||||
It provides C/Fortran API to evaluate one-electron / two-electron |
||||
integrals for Cartesian / real-spheric / spinor Gaussian type functions. |
||||
''; |
||||
homepage = "http://wiki.sunqm.net/libcint"; |
||||
downloadPage = "https://github.com/sunqm/libcint"; |
||||
license = licenses.bsd2; |
||||
maintainers = with maintainers; [ drewrisinger ]; |
||||
}; |
||||
} |
@ -1,6 +1,6 @@ |
||||
{ callPackage, ... }: |
||||
|
||||
callPackage ./generic-v3.nix { |
||||
version = "3.11.1"; |
||||
sha256 = "1mq8dp94mlp72ri27bgvc2i370r8kfig87wfai7vxjdnh3vng0y1"; |
||||
version = "3.11.3"; |
||||
sha256 = "0cn6h6fg5h64q5h3ncfwr3m7yszf5n9gpvgpv7s1csndp0ffzmin"; |
||||
} |
||||
|
@ -0,0 +1,20 @@ |
||||
{ lib, buildDunePackage, fetchzip }: |
||||
|
||||
buildDunePackage rec { |
||||
pname = "parmap"; |
||||
version = "1.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://github.com/rdicosmo/${pname}/releases/download/${version}/${pname}-${version}.tbz"; |
||||
sha256 = "13ahqaga1palf0s0dll512cl7k43sllmwvw6r03y70kfmky1j114"; |
||||
}; |
||||
|
||||
doCheck = true; |
||||
|
||||
meta = with lib; { |
||||
description = "Library for multicore parallel programming"; |
||||
homepage = "https://rdicosmo.github.io/parmap"; |
||||
maintainers = [ maintainers.bcdarwin ]; |
||||
license = licenses.lgpl2; |
||||
}; |
||||
} |
@ -0,0 +1,44 @@ |
||||
{ lib |
||||
, buildPythonPackage |
||||
, fetchPypi |
||||
, mock |
||||
, jsonpickle |
||||
, ordered-set |
||||
, numpy |
||||
, pytestCheckHook |
||||
}: |
||||
|
||||
buildPythonPackage rec { |
||||
pname = "deepdiff"; |
||||
version = "4.0.9"; |
||||
|
||||
src = fetchPypi { |
||||
inherit pname version; |
||||
sha256 = "5e2343398e90538edaa59c0c99207e996a3a834fdc878c666376f632a760c35a"; |
||||
}; |
||||
|
||||
# # Extra packages (may not be necessary) |
||||
checkInputs = [ |
||||
mock |
||||
numpy |
||||
pytestCheckHook |
||||
]; |
||||
|
||||
disabledTests = [ |
||||
# skipped tests require murmur module |
||||
"test_prep_str_murmur3_64bit" |
||||
"test_prep_str_murmur3_128bit" |
||||
]; |
||||
|
||||
propagatedBuildInputs = [ |
||||
jsonpickle |
||||
ordered-set |
||||
]; |
||||
|
||||
meta = with lib; { |
||||
description = "Deep Difference and Search of any Python object/data"; |
||||
homepage = "https://github.com/seperman/deepdiff"; |
||||
license = licenses.mit; |
||||
maintainers = [ maintainers.mic92 ]; |
||||
}; |
||||
} |
@ -1,17 +1,17 @@ |
||||
{ stdenv |
||||
, fetchFromGitHub |
||||
}: rec { |
||||
version = "2.6.0"; |
||||
version = "2.7.0"; |
||||
src = fetchFromGitHub { |
||||
owner = "openrazer"; |
||||
repo = "openrazer"; |
||||
rev = "v${version}"; |
||||
sha256 = "1s5irs3avrlp891mxan3z8p55ias9rq26rqp2qrlcc6i4vl29di0"; |
||||
sha256 = "013r9q4xg2xjmyxybx07zsl2b5lm9vw843anx22ygpvxz1qgz9hp"; |
||||
}; |
||||
meta = with stdenv.lib; { |
||||
homepage = https://openrazer.github.io/; |
||||
license = licenses.gpl2; |
||||
maintainers = with maintainers; [ roelvandijk ]; |
||||
maintainers = with maintainers; [ roelvandijk evanjs ]; |
||||
platforms = platforms.linux; |
||||
}; |
||||
} |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue