Merge remote-tracking branch 'upstream/master' into staging
This commit is contained in:
commit
7319013ea1
|
@ -47,9 +47,13 @@
|
|||
|
||||
<para>
|
||||
In Nixpkgs, these three platforms are defined as attribute sets under the
|
||||
names <literal>buildPlatform</literal>, <literal>hostPlatform</literal>, and
|
||||
<literal>targetPlatform</literal>. They are always defined as attributes in
|
||||
the standard environment. That means one can access them like:
|
||||
names <literal>buildPlatform</literal>, <literal>hostPlatform</literal>,
|
||||
and <literal>targetPlatform</literal>. All three are always defined as
|
||||
attributes in the standard environment, and at the top level. That means
|
||||
one can get at them just like a dependency in a function that is imported
|
||||
with <literal>callPackage</literal>:
|
||||
<programlisting>{ stdenv, buildPlatform, hostPlatform, fooDep, barDep, .. }: ...buildPlatform...</programlisting>
|
||||
, or just off <varname>stdenv</varname>:
|
||||
<programlisting>{ stdenv, fooDep, barDep, .. }: ...stdenv.buildPlatform...</programlisting>
|
||||
.
|
||||
</para>
|
||||
|
|
|
@ -64,9 +64,6 @@ When the `Cargo.lock`, provided by upstream, is not in sync with the
|
|||
added in `cargoPatches` will also be prepended to the patches in `patches` at
|
||||
build-time.
|
||||
|
||||
To install crates with nix there is also an experimental project called
|
||||
[nixcrates](https://github.com/fractalide/nixcrates).
|
||||
|
||||
## Compiling Rust crates using Nix instead of Cargo
|
||||
|
||||
### Simple operation
|
||||
|
|
|
@ -5,11 +5,16 @@ date: 2016-06-25
|
|||
---
|
||||
# User's Guide to Vim Plugins/Addons/Bundles/Scripts in Nixpkgs
|
||||
|
||||
You'll get a vim(-your-suffix) in PATH also loading the plugins you want.
|
||||
Both Neovim and Vim can be configured to include your favorite plugins
|
||||
and additional libraries.
|
||||
|
||||
Loading can be deferred; see examples.
|
||||
|
||||
Vim packages, VAM (=vim-addon-manager) and Pathogen are supported to load
|
||||
packages.
|
||||
At the moment we support three different methods for managing plugins:
|
||||
|
||||
- Vim packages (*recommend*)
|
||||
- VAM (=vim-addon-manager)
|
||||
- Pathogen
|
||||
|
||||
## Custom configuration
|
||||
|
||||
|
@ -25,7 +30,19 @@ vim_configurable.customize {
|
|||
}
|
||||
```
|
||||
|
||||
## Vim packages
|
||||
For Neovim the `configure` argument can be overridden to achieve the same:
|
||||
|
||||
```
|
||||
neovim.override {
|
||||
configure = {
|
||||
customRC = ''
|
||||
# here your custom configuration goes!
|
||||
'';
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Managing plugins with Vim packages
|
||||
|
||||
To store you plugins in Vim packages the following example can be used:
|
||||
|
||||
|
@ -38,13 +55,50 @@ vim_configurable.customize {
|
|||
opt = [ phpCompletion elm-vim ];
|
||||
# To automatically load a plugin when opening a filetype, add vimrc lines like:
|
||||
# autocmd FileType php :packadd phpCompletion
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## VAM
|
||||
For Neovim the syntax is
|
||||
|
||||
### dependencies by Vim plugins
|
||||
```
|
||||
neovim.override {
|
||||
configure = {
|
||||
customRC = ''
|
||||
# here your custom configuration goes!
|
||||
'';
|
||||
packages.myVimPackage = with pkgs.vimPlugins; {
|
||||
# see examples below how to use custom packages
|
||||
start = [ ];
|
||||
opt = [ ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The resulting package can be added to `packageOverrides` in `~/.nixpkgs/config.nix` to make it installable:
|
||||
|
||||
```
|
||||
{
|
||||
packageOverrides = pkgs: with pkgs; {
|
||||
myVim = vim_configurable.customize {
|
||||
name = "vim-with-plugins";
|
||||
# add here code from the example section
|
||||
};
|
||||
myNeovim = neovim.override {
|
||||
configure = {
|
||||
# add here code from the example section
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
After that you can install your special grafted `myVim` or `myNeovim` packages.
|
||||
|
||||
## Managing plugins with VAM
|
||||
|
||||
### Handling dependencies of Vim plugins
|
||||
|
||||
VAM introduced .json files supporting dependencies without versioning
|
||||
assuming that "using latest version" is ok most of the time.
|
||||
|
@ -125,6 +179,18 @@ Sample output2:
|
|||
]
|
||||
|
||||
|
||||
## Adding new plugins to nixpkgs
|
||||
|
||||
In `pkgs/misc/vim-plugins/vim-plugin-names` we store the plugin names
|
||||
for all vim plugins we automatically generate plugins for.
|
||||
The format of this file `github username/github repository`:
|
||||
For example https://github.com/scrooloose/nerdtree becomes `scrooloose/nerdtree`.
|
||||
After adding your plugin to this file run the `./update.py` in the same folder.
|
||||
This will updated a file called `generated.nix` and make your plugin accessible in the
|
||||
`vimPlugins` attribute set (`vimPlugins.nerdtree` in our example).
|
||||
If additional steps to the build process of the plugin are required, add an
|
||||
override to the `pkgs/misc/vim-plugins/default.nix` in the same directory.
|
||||
|
||||
## Important repositories
|
||||
|
||||
- [vim-pi](https://bitbucket.org/vimcommunity/vim-pi) is a plugin repository
|
||||
|
|
|
@ -435,12 +435,15 @@ rec {
|
|||
useful for deep-overriding.
|
||||
|
||||
Example:
|
||||
x = { a = { b = 4; c = 3; }; }
|
||||
overrideExisting x { a = { b = 6; d = 2; }; }
|
||||
=> { a = { b = 6; d = 2; }; }
|
||||
overrideExisting {} { a = 1; }
|
||||
=> {}
|
||||
overrideExisting { b = 2; } { a = 1; }
|
||||
=> { b = 2; }
|
||||
overrideExisting { a = 3; b = 2; } { a = 1; }
|
||||
=> { a = 1; b = 2; }
|
||||
*/
|
||||
overrideExisting = old: new:
|
||||
old // listToAttrs (map (attr: nameValuePair attr (attrByPath [attr] old.${attr} new)) (attrNames old));
|
||||
mapAttrs (name: value: new.${name} or value) old;
|
||||
|
||||
/* Get a package output.
|
||||
If no output is found, fallback to `.out` and then to the default.
|
||||
|
|
|
@ -355,6 +355,11 @@ lib.mapAttrs (n: v: v // { shortName = n; }) rec {
|
|||
fullName = "Independent JPEG Group License";
|
||||
};
|
||||
|
||||
imagemagick = spdx {
|
||||
fullName = "ImageMagick License";
|
||||
spdxId = "imagemagick";
|
||||
};
|
||||
|
||||
inria-compcert = {
|
||||
fullName = "INRIA Non-Commercial License Agreement for the CompCert verified compiler";
|
||||
url = "http://compcert.inria.fr/doc/LICENSE";
|
||||
|
|
|
@ -48,7 +48,7 @@ rec {
|
|||
armv7a-android-prebuilt = rec {
|
||||
config = "armv7a-unknown-linux-androideabi";
|
||||
sdkVer = "24";
|
||||
ndkVer = "17";
|
||||
ndkVer = "17c";
|
||||
platform = platforms.armv7a-android;
|
||||
useAndroidPrebuilt = true;
|
||||
};
|
||||
|
@ -56,7 +56,7 @@ rec {
|
|||
aarch64-android-prebuilt = rec {
|
||||
config = "aarch64-unknown-linux-android";
|
||||
sdkVer = "24";
|
||||
ndkVer = "17";
|
||||
ndkVer = "17c";
|
||||
platform = platforms.aarch64-multiplatform;
|
||||
useAndroidPrebuilt = true;
|
||||
};
|
||||
|
|
7
lib/tests/check-eval.nix
Normal file
7
lib/tests/check-eval.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Throws an error if any of our lib tests fail.
|
||||
|
||||
let tests = [ "misc" "systems" ];
|
||||
all = builtins.concatLists (map (f: import (./. + "/${f}.nix")) tests);
|
||||
in if all == []
|
||||
then null
|
||||
else throw (builtins.toJSON all)
|
|
@ -236,6 +236,20 @@ runTests {
|
|||
};
|
||||
};
|
||||
|
||||
testOverrideExistingEmpty = {
|
||||
expr = overrideExisting {} { a = 1; };
|
||||
expected = {};
|
||||
};
|
||||
|
||||
testOverrideExistingDisjoint = {
|
||||
expr = overrideExisting { b = 2; } { a = 1; };
|
||||
expected = { b = 2; };
|
||||
};
|
||||
|
||||
testOverrideExistingOverride = {
|
||||
expr = overrideExisting { a = 3; b = 2; } { a = 1; };
|
||||
expected = { a = 1; b = 2; };
|
||||
};
|
||||
|
||||
# GENERATORS
|
||||
# these tests assume attributes are converted to lists
|
||||
|
|
|
@ -227,7 +227,7 @@
|
|||
name = "Andrew Morsillo";
|
||||
};
|
||||
AndersonTorres = {
|
||||
email = "torres.anderson.85@gmail.com";
|
||||
email = "torres.anderson.85@protonmail.com";
|
||||
github = "AndersonTorres";
|
||||
name = "Anderson Torres";
|
||||
};
|
||||
|
@ -1847,6 +1847,11 @@
|
|||
github = "jerith666";
|
||||
name = "Matt McHenry";
|
||||
};
|
||||
jethro = {
|
||||
email = "jethrokuan95@gmail.com";
|
||||
github = "jethrokuan";
|
||||
name = "Jethro Kuan";
|
||||
};
|
||||
jfb = {
|
||||
email = "james@yamtime.com";
|
||||
github = "tftio";
|
||||
|
@ -4163,6 +4168,11 @@
|
|||
github = "tomsmeets";
|
||||
name = "Tom Smeets";
|
||||
};
|
||||
toonn = {
|
||||
email = "nnoot@toonn.io";
|
||||
github = "toonn";
|
||||
name = "Toon Nolten";
|
||||
};
|
||||
travisbhartwell = {
|
||||
email = "nafai@travishartwell.net";
|
||||
github = "travisbhartwell";
|
||||
|
@ -4518,6 +4528,11 @@
|
|||
github = "y0no";
|
||||
name = "Yoann Ono";
|
||||
};
|
||||
yarny = {
|
||||
email = "41838844+Yarny0@users.noreply.github.com";
|
||||
github = "Yarny0";
|
||||
name = "Yarny";
|
||||
};
|
||||
yarr = {
|
||||
email = "savraz@gmail.com";
|
||||
github = "Eternity-Yarr";
|
||||
|
|
|
@ -19,6 +19,7 @@ starting VDE switch for network 1
|
|||
> startAll
|
||||
> testScript
|
||||
> $machine->succeed("touch /tmp/foo")
|
||||
> print($machine->succeed("pwd"), "\n") # Show stdout of command
|
||||
</screen>
|
||||
The function <command>testScript</command> executes the entire test script
|
||||
and drops you back into the test driver command line upon its completion.
|
||||
|
@ -33,8 +34,11 @@ $ nix-build nixos/tests/login.nix -A driver
|
|||
$ ./result/bin/nixos-run-vms
|
||||
</screen>
|
||||
The script <command>nixos-run-vms</command> starts the virtual machines
|
||||
defined by test. The root file system of the VMs is created on the fly and
|
||||
kept across VM restarts in
|
||||
<filename>./</filename><varname>hostname</varname><filename>.qcow2</filename>.
|
||||
defined by test.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The machine state is kept across VM restarts in
|
||||
<filename>/tmp/vm-state-</filename><varname>machinename</varname>.
|
||||
</para>
|
||||
</section>
|
||||
|
|
|
@ -108,7 +108,7 @@ xlink:href="https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualis
|
|||
<programlisting>
|
||||
$machine->start;
|
||||
$machine->waitForUnit("default.target");
|
||||
$machine->succeed("uname") =~ /Linux/;
|
||||
die unless $machine->succeed("uname") =~ /Linux/;
|
||||
</programlisting>
|
||||
The first line is actually unnecessary; machines are implicitly started when
|
||||
you first execute an action on them (such as <literal>waitForUnit</literal>
|
||||
|
|
|
@ -52,10 +52,13 @@
|
|||
</listitem>
|
||||
</itemizedlist>
|
||||
To see what channels are available, go to
|
||||
<link
|
||||
xlink:href="https://nixos.org/channels"/>. (Note that the URIs of the
|
||||
<link xlink:href="https://nixos.org/channels"/>. (Note that the URIs of the
|
||||
various channels redirect to a directory that contains the channel’s latest
|
||||
version and includes ISO images and VirtualBox appliances.)
|
||||
version and includes ISO images and VirtualBox appliances.) Please note that
|
||||
during the release process, channels that are not yet released will be
|
||||
present here as well. See the Getting NixOS page
|
||||
<link xlink:href="https://nixos.org/nixos/download.html"/> to find the newest
|
||||
supported stable release.
|
||||
</para>
|
||||
<para>
|
||||
When you first install NixOS, you’re automatically subscribed to the NixOS
|
||||
|
|
|
@ -451,6 +451,14 @@ inherit (pkgs.nixos {
|
|||
deprecated. Use <literal>networking.networkmanager.dns</literal> instead.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The Kubernetes package has been bumped to major version 1.11.
|
||||
Please consult the
|
||||
<link xlink:href="https://github.com/kubernetes/kubernetes/blob/release-1.11/CHANGELOG-1.11.md">release notes</link>
|
||||
for details on new features and api changes.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The option
|
||||
|
|
|
@ -7,7 +7,7 @@ with lib;
|
|||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to install files to support the
|
||||
Whether to install files to support the
|
||||
<link xlink:href="https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html">XDG Shared MIME-info specification</link> and the
|
||||
<link xlink:href="https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html">XDG MIME Applications specification</link>.
|
||||
'';
|
||||
|
@ -17,18 +17,18 @@ with lib;
|
|||
config = mkIf config.xdg.mime.enable {
|
||||
environment.pathsToLink = [ "/share/mime" ];
|
||||
|
||||
environment.systemPackages = [
|
||||
# this package also installs some useful data, as well as its utilities
|
||||
pkgs.shared-mime-info
|
||||
environment.systemPackages = [
|
||||
# this package also installs some useful data, as well as its utilities
|
||||
pkgs.shared-mime-info
|
||||
];
|
||||
|
||||
environment.extraSetup = ''
|
||||
if [ -w $out/share/mime ] && [ -d $out/share/mime/packages ]; then
|
||||
XDG_DATA_DIRS=$out/share ${pkgs.shared-mime-info}/bin/update-mime-database -V $out/share/mime > /dev/null
|
||||
XDG_DATA_DIRS=$out/share ${pkgs.shared-mime-info}/bin/update-mime-database -V $out/share/mime > /dev/null
|
||||
fi
|
||||
|
||||
if [ -w $out/share/applications ]; then
|
||||
${pkgs.desktop-file-utils}/bin/update-desktop-database $out/share/applications
|
||||
${pkgs.desktop-file-utils}/bin/update-desktop-database $out/share/applications
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
tomcat = 16;
|
||||
#audio = 17; # unused
|
||||
#floppy = 18; # unused
|
||||
#uucp = 19; # unused
|
||||
uucp = 19;
|
||||
#lp = 20; # unused
|
||||
#proc = 21; # unused
|
||||
pulseaudio = 22; # must match `pulseaudio' GID
|
||||
|
@ -329,6 +329,7 @@
|
|||
# kvm = 302; # unused
|
||||
# render = 303; # unused
|
||||
zeronet = 304;
|
||||
lirc = 305;
|
||||
|
||||
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
|
||||
|
||||
|
@ -618,6 +619,7 @@
|
|||
kvm = 302; # default udev rules from systemd requires these
|
||||
render = 303; # default udev rules from systemd requires these
|
||||
zeronet = 304;
|
||||
lirc = 305;
|
||||
|
||||
# When adding a gid, make sure it doesn't match an existing
|
||||
# uid. Users and groups with the same name should have equal
|
||||
|
|
|
@ -272,6 +272,7 @@
|
|||
./services/hardware/interception-tools.nix
|
||||
./services/hardware/irqbalance.nix
|
||||
./services/hardware/lcd.nix
|
||||
./services/hardware/lirc.nix
|
||||
./services/hardware/nvidia-optimus.nix
|
||||
./services/hardware/pcscd.nix
|
||||
./services/hardware/pommed.nix
|
||||
|
@ -496,6 +497,7 @@
|
|||
./services/networking/dnsdist.nix
|
||||
./services/networking/dnsmasq.nix
|
||||
./services/networking/ejabberd.nix
|
||||
./services/networking/epmd.nix
|
||||
./services/networking/fakeroute.nix
|
||||
./services/networking/ferm.nix
|
||||
./services/networking/firefox/sync-server.nix
|
||||
|
@ -517,6 +519,7 @@
|
|||
./services/networking/heyefi.nix
|
||||
./services/networking/hostapd.nix
|
||||
./services/networking/htpdate.nix
|
||||
./services/networking/hylafax/default.nix
|
||||
./services/networking/i2pd.nix
|
||||
./services/networking/i2p.nix
|
||||
./services/networking/iodine.nix
|
||||
|
@ -555,6 +558,7 @@
|
|||
./services/networking/nsd.nix
|
||||
./services/networking/ntopng.nix
|
||||
./services/networking/ntpd.nix
|
||||
./services/networking/nullidentdmod.nix
|
||||
./services/networking/nylon.nix
|
||||
./services/networking/ocserv.nix
|
||||
./services/networking/oidentd.nix
|
||||
|
@ -679,6 +683,7 @@
|
|||
./services/web-apps/atlassian/confluence.nix
|
||||
./services/web-apps/atlassian/crowd.nix
|
||||
./services/web-apps/atlassian/jira.nix
|
||||
./services/web-apps/codimd.nix
|
||||
./services/web-apps/frab.nix
|
||||
./services/web-apps/mattermost.nix
|
||||
./services/web-apps/nexus.nix
|
||||
|
|
|
@ -302,15 +302,15 @@ in
|
|||
workdir="$(mktemp -d)"
|
||||
|
||||
# Create CA
|
||||
openssl genrsa -des3 -passout pass:x -out $workdir/ca.pass.key 2048
|
||||
openssl rsa -passin pass:x -in $workdir/ca.pass.key -out $workdir/ca.key
|
||||
openssl genrsa -des3 -passout pass:xxxx -out $workdir/ca.pass.key 2048
|
||||
openssl rsa -passin pass:xxxx -in $workdir/ca.pass.key -out $workdir/ca.key
|
||||
openssl req -new -key $workdir/ca.key -out $workdir/ca.csr \
|
||||
-subj "/C=UK/ST=Warwickshire/L=Leamington/O=OrgName/OU=Security Department/CN=example.com"
|
||||
openssl x509 -req -days 1 -in $workdir/ca.csr -signkey $workdir/ca.key -out $workdir/ca.crt
|
||||
|
||||
# Create key
|
||||
openssl genrsa -des3 -passout pass:x -out $workdir/server.pass.key 2048
|
||||
openssl rsa -passin pass:x -in $workdir/server.pass.key -out $workdir/server.key
|
||||
openssl genrsa -des3 -passout pass:xxxx -out $workdir/server.pass.key 2048
|
||||
openssl rsa -passin pass:xxxx -in $workdir/server.pass.key -out $workdir/server.key
|
||||
openssl req -new -key $workdir/server.key -out $workdir/server.csr \
|
||||
-subj "/C=UK/ST=Warwickshire/L=Leamington/O=OrgName/OU=IT Department/CN=example.com"
|
||||
openssl x509 -req -days 1 -in $workdir/server.csr -CA $workdir/ca.crt \
|
||||
|
|
|
@ -8,6 +8,7 @@ let
|
|||
# configuration file can be generated by http://slurm.schedmd.com/configurator.html
|
||||
configFile = pkgs.writeTextDir "slurm.conf"
|
||||
''
|
||||
ClusterName=${cfg.clusterName}
|
||||
${optionalString (cfg.controlMachine != null) ''controlMachine=${cfg.controlMachine}''}
|
||||
${optionalString (cfg.controlAddr != null) ''controlAddr=${cfg.controlAddr}''}
|
||||
${optionalString (cfg.nodeName != null) ''nodeName=${cfg.nodeName}''}
|
||||
|
@ -105,6 +106,15 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
clusterName = mkOption {
|
||||
type = types.str;
|
||||
default = "default";
|
||||
example = "myCluster";
|
||||
description = ''
|
||||
Necessary to distinguish accounting records in a multi-cluster environment.
|
||||
'';
|
||||
};
|
||||
|
||||
nodeName = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
|
|
85
nixos/modules/services/hardware/lirc.nix
Normal file
85
nixos/modules/services/hardware/lirc.nix
Normal file
|
@ -0,0 +1,85 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.lirc;
|
||||
in {
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
services.lirc = {
|
||||
|
||||
enable = mkEnableOption "LIRC daemon";
|
||||
|
||||
options = mkOption {
|
||||
type = types.lines;
|
||||
example = ''
|
||||
[lircd]
|
||||
nodaemon = False
|
||||
'';
|
||||
description = "LIRC default options descriped in man:lircd(8) (<filename>lirc_options.conf</filename>)";
|
||||
};
|
||||
|
||||
configs = mkOption {
|
||||
type = types.listOf types.lines;
|
||||
description = "Configurations for lircd to load, see man:lircd.conf(5) for details (<filename>lircd.conf</filename>)";
|
||||
};
|
||||
|
||||
extraArguments = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "Extra arguments to lircd.";
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
# Note: LIRC executables raises a warning, if lirc_options.conf do not exists
|
||||
environment.etc."lirc/lirc_options.conf".text = cfg.options;
|
||||
|
||||
environment.systemPackages = [ pkgs.lirc ];
|
||||
|
||||
systemd.sockets.lircd = {
|
||||
description = "LIRC daemon socket";
|
||||
wantedBy = [ "sockets.target" ];
|
||||
socketConfig = {
|
||||
ListenStream = "/run/lirc/lircd";
|
||||
SocketUser = "lirc";
|
||||
SocketMode = "0660";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.lircd = let
|
||||
configFile = pkgs.writeText "lircd.conf" (builtins.concatStringsSep "\n" cfg.configs);
|
||||
in {
|
||||
description = "LIRC daemon service";
|
||||
after = [ "network.target" ];
|
||||
|
||||
unitConfig.Documentation = [ "man:lircd(8)" ];
|
||||
|
||||
serviceConfig = {
|
||||
RuntimeDirectory = "lirc";
|
||||
ExecStart = ''
|
||||
${pkgs.lirc}/bin/lircd --nodaemon \
|
||||
${escapeShellArgs cfg.extraArguments} \
|
||||
${configFile}
|
||||
'';
|
||||
User = "lirc";
|
||||
};
|
||||
};
|
||||
|
||||
users.users.lirc = {
|
||||
uid = config.ids.uids.lirc;
|
||||
group = "lirc";
|
||||
description = "LIRC user for lircd";
|
||||
};
|
||||
|
||||
users.groups.lirc.gid = config.ids.gids.lirc;
|
||||
};
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
let
|
||||
inherit (lib) mkIf mkOption singleton types;
|
||||
inherit (pkgs) coreutils exim;
|
||||
inherit (pkgs) coreutils;
|
||||
cfg = config.services.exim;
|
||||
in
|
||||
|
||||
|
@ -57,6 +57,16 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.exim;
|
||||
defaultText = "pkgs.exim";
|
||||
description = ''
|
||||
The Exim derivation to use.
|
||||
This can be used to enable features such as LDAP or PAM support.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
@ -74,7 +84,7 @@ in
|
|||
spool_directory = ${cfg.spoolDir}
|
||||
${cfg.config}
|
||||
'';
|
||||
systemPackages = [ exim ];
|
||||
systemPackages = [ cfg.package ];
|
||||
};
|
||||
|
||||
users.users = singleton {
|
||||
|
@ -89,14 +99,14 @@ in
|
|||
gid = config.ids.gids.exim;
|
||||
};
|
||||
|
||||
security.wrappers.exim.source = "${exim}/bin/exim";
|
||||
security.wrappers.exim.source = "${cfg.package}/bin/exim";
|
||||
|
||||
systemd.services.exim = {
|
||||
description = "Exim Mail Daemon";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
restartTriggers = [ config.environment.etc."exim.conf".source ];
|
||||
serviceConfig = {
|
||||
ExecStart = "${exim}/bin/exim -bdf -q30m";
|
||||
ExecStart = "${cfg.package}/bin/exim -bdf -q30m";
|
||||
ExecReload = "${coreutils}/bin/kill -HUP $MAINPID";
|
||||
};
|
||||
preStart = ''
|
||||
|
|
|
@ -73,6 +73,24 @@ in {
|
|||
${cfg.home}/transcoders.
|
||||
'';
|
||||
};
|
||||
|
||||
jvmOptions = mkOption {
|
||||
description = ''
|
||||
Extra command line options for the JVM running AirSonic.
|
||||
Useful for sending jukebox output to non-default alsa
|
||||
devices.
|
||||
'';
|
||||
default = [
|
||||
];
|
||||
type = types.listOf types.str;
|
||||
example = [
|
||||
"-Djavax.sound.sampled.Clip='#CODEC [plughw:1,0]'"
|
||||
"-Djavax.sound.sampled.Port='#Port CODEC [hw:1]'"
|
||||
"-Djavax.sound.sampled.SourceDataLine='#CODEC [plughw:1,0]'"
|
||||
"-Djavax.sound.sampled.TargetDataLine='#CODEC [plughw:1,0]'"
|
||||
];
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -98,6 +116,7 @@ in {
|
|||
-Dserver.port=${toString cfg.port} \
|
||||
-Dairsonic.contextPath=${cfg.contextPath} \
|
||||
-Djava.awt.headless=true \
|
||||
${toString cfg.jvmOptions} \
|
||||
-verbose:gc \
|
||||
-jar ${pkgs.airsonic}/webapps/airsonic.war
|
||||
'';
|
||||
|
|
|
@ -8,7 +8,6 @@ let
|
|||
ddConf = {
|
||||
dd_url = "https://app.datadoghq.com";
|
||||
skip_ssl_validation = "no";
|
||||
api_key = "";
|
||||
confd_path = "/etc/datadog-agent/conf.d";
|
||||
additional_checksd = "/etc/datadog-agent/checks.d";
|
||||
use_dogstatsd = true;
|
||||
|
@ -16,6 +15,7 @@ let
|
|||
// optionalAttrs (cfg.logLevel != null) { log_level = cfg.logLevel; }
|
||||
// optionalAttrs (cfg.hostname != null) { inherit (cfg) hostname; }
|
||||
// optionalAttrs (cfg.tags != null ) { tags = concatStringsSep ", " cfg.tags; }
|
||||
// optionalAttrs (cfg.enableLiveProcessCollection) { process_config = { enabled = "true"; }; }
|
||||
// cfg.extraConfig;
|
||||
|
||||
# Generate Datadog configuration files for each configured checks.
|
||||
|
@ -125,6 +125,13 @@ in {
|
|||
'';
|
||||
};
|
||||
|
||||
enableLiveProcessCollection = mkOption {
|
||||
description = ''
|
||||
Whether to enable the live process collection agent.
|
||||
'';
|
||||
default = false;
|
||||
type = types.bool;
|
||||
};
|
||||
checks = mkOption {
|
||||
description = ''
|
||||
Configuration for all Datadog checks. Keys of this attribute
|
||||
|
@ -229,6 +236,15 @@ in {
|
|||
path = [ datadogPkg pkgs.python pkgs.sysstat pkgs.procps pkgs.jdk ];
|
||||
serviceConfig.ExecStart = "${datadogPkg}/bin/dd-jmxfetch";
|
||||
});
|
||||
|
||||
datadog-process-agent = lib.mkIf cfg.enableLiveProcessCollection (makeService {
|
||||
description = "Datadog Live Process Agent";
|
||||
path = [ ];
|
||||
script = ''
|
||||
export DD_API_KEY=$(head -n 1 ${cfg.apiKeyFile})
|
||||
${pkgs.datadog-process-agent}/bin/agent --config /etc/datadog-agent/datadog.yaml
|
||||
'';
|
||||
});
|
||||
};
|
||||
|
||||
environment.etc = etcfiles;
|
||||
|
|
|
@ -235,7 +235,7 @@ in {
|
|||
but without GF_ prefix
|
||||
'';
|
||||
default = {};
|
||||
type = types.attrsOf types.str;
|
||||
type = with types; attrsOf (either str path);
|
||||
};
|
||||
};
|
||||
|
||||
|
|
56
nixos/modules/services/networking/epmd.nix
Normal file
56
nixos/modules/services/networking/epmd.nix
Normal file
|
@ -0,0 +1,56 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.epmd;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
options.services.epmd = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to enable socket activation for Erlang Port Mapper Daemon (epmd),
|
||||
which acts as a name server on all hosts involved in distributed
|
||||
Erlang computations.
|
||||
'';
|
||||
};
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.erlang;
|
||||
description = ''
|
||||
The Erlang package to use to get epmd binary. That way you can re-use
|
||||
an Erlang runtime that is already installed for other purposes.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
config = mkIf cfg.enable {
|
||||
systemd.sockets.epmd = rec {
|
||||
description = "Erlang Port Mapper Daemon Activation Socket";
|
||||
wantedBy = [ "sockets.target" ];
|
||||
before = wantedBy;
|
||||
socketConfig = {
|
||||
ListenStream = "4369";
|
||||
Accept = "false";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.epmd = {
|
||||
description = "Erlang Port Mapper Daemon";
|
||||
after = [ "network.target" ];
|
||||
requires = [ "epmd.socket" ];
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
ExecStart = "${cfg.package}/bin/epmd -systemd";
|
||||
Type = "notify";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
29
nixos/modules/services/networking/hylafax/default.nix
Normal file
29
nixos/modules/services/networking/hylafax/default.nix
Normal file
|
@ -0,0 +1,29 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
imports = [
|
||||
./options.nix
|
||||
./systemd.nix
|
||||
];
|
||||
|
||||
config = lib.modules.mkIf config.services.hylafax.enable {
|
||||
environment.systemPackages = [ pkgs.hylafaxplus ];
|
||||
users.users.uucp = {
|
||||
uid = config.ids.uids.uucp;
|
||||
group = "uucp";
|
||||
description = "Unix-to-Unix CoPy system";
|
||||
isSystemUser = true;
|
||||
inherit (config.users.users.nobody) home;
|
||||
};
|
||||
assertions = [{
|
||||
assertion = config.services.hylafax.modems != {};
|
||||
message = ''
|
||||
HylaFAX cannot be used without modems.
|
||||
Please define at least one modem with
|
||||
<option>config.services.hylafax.modems</option>.
|
||||
'';
|
||||
}];
|
||||
};
|
||||
|
||||
}
|
12
nixos/modules/services/networking/hylafax/faxq-default.nix
Normal file
12
nixos/modules/services/networking/hylafax/faxq-default.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
{ ... }:
|
||||
|
||||
# see man:hylafax-config(5)
|
||||
|
||||
{
|
||||
|
||||
ModemGroup = [ ''"any:.*"'' ];
|
||||
ServerTracing = "0x78701";
|
||||
SessionTracing = "0x78701";
|
||||
UUCPLockDir = "/var/lock";
|
||||
|
||||
}
|
29
nixos/modules/services/networking/hylafax/faxq-wait.sh
Executable file
29
nixos/modules/services/networking/hylafax/faxq-wait.sh
Executable file
|
@ -0,0 +1,29 @@
|
|||
#! @shell@ -e
|
||||
|
||||
# skip this if there are no modems at all
|
||||
if ! stat -t "@spoolAreaPath@"/etc/config.* >/dev/null 2>&1
|
||||
then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "faxq started, waiting for modem(s) to initialize..."
|
||||
|
||||
for i in `seq @timeoutSec@0 -1 0` # gracefully timeout
|
||||
do
|
||||
sleep 0.1
|
||||
# done if status files exist, but don't mention initialization
|
||||
if \
|
||||
stat -t "@spoolAreaPath@"/status/* >/dev/null 2>&1 \
|
||||
&& \
|
||||
! grep --silent --ignore-case 'initializing server' \
|
||||
"@spoolAreaPath@"/status/*
|
||||
then
|
||||
echo "modem(s) apparently ready"
|
||||
exit 0
|
||||
fi
|
||||
# if i reached 0, modems probably failed to initialize
|
||||
if test $i -eq 0
|
||||
then
|
||||
echo "warning: modem initialization timed out"
|
||||
fi
|
||||
done
|
10
nixos/modules/services/networking/hylafax/hfaxd-default.nix
Normal file
10
nixos/modules/services/networking/hylafax/hfaxd-default.nix
Normal file
|
@ -0,0 +1,10 @@
|
|||
{ ... }:
|
||||
|
||||
# see man:hfaxd(8)
|
||||
|
||||
{
|
||||
|
||||
ServerTracing = "0x91";
|
||||
XferLogFile = "/clientlog";
|
||||
|
||||
}
|
22
nixos/modules/services/networking/hylafax/modem-default.nix
Normal file
22
nixos/modules/services/networking/hylafax/modem-default.nix
Normal file
|
@ -0,0 +1,22 @@
|
|||
{ pkgs, ... }:
|
||||
|
||||
# see man:hylafax-config(5)
|
||||
|
||||
{
|
||||
|
||||
TagLineFont = "etc/LiberationSans-25.pcf";
|
||||
TagLineLocale = ''en_US.UTF-8'';
|
||||
|
||||
AdminGroup = "root"; # groups that can change server config
|
||||
AnswerRotary = "fax"; # don't accept anything else but faxes
|
||||
LogFileMode = "0640";
|
||||
PriorityScheduling = true;
|
||||
RecvFileMode = "0640";
|
||||
ServerTracing = "0x78701";
|
||||
SessionTracing = "0x78701";
|
||||
UUCPLockDir = "/var/lock";
|
||||
|
||||
SendPageCmd = ''${pkgs.coreutils}/bin/false''; # prevent pager transmit
|
||||
SendUUCPCmd = ''${pkgs.coreutils}/bin/false''; # prevent UUCP transmit
|
||||
|
||||
}
|
375
nixos/modules/services/networking/hylafax/options.nix
Normal file
375
nixos/modules/services/networking/hylafax/options.nix
Normal file
|
@ -0,0 +1,375 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
|
||||
inherit (lib.options) literalExample mkEnableOption mkOption;
|
||||
inherit (lib.types) bool enum int lines loaOf nullOr path str submodule;
|
||||
inherit (lib.modules) mkDefault mkIf mkMerge;
|
||||
|
||||
commonDescr = ''
|
||||
Values can be either strings or integers
|
||||
(which will be added to the config file verbatimly)
|
||||
or lists thereof
|
||||
(which will be translated to multiple
|
||||
lines with the same configuration key).
|
||||
Boolean values are translated to "Yes" or "No".
|
||||
The default contains some reasonable
|
||||
configuration to yield an operational system.
|
||||
'';
|
||||
|
||||
str1 = lib.types.addCheck str (s: s!=""); # non-empty string
|
||||
int1 = lib.types.addCheck int (i: i>0); # positive integer
|
||||
|
||||
configAttrType =
|
||||
# Options in HylaFAX configuration files can be
|
||||
# booleans, strings, integers, or list thereof
|
||||
# representing multiple config directives with the same key.
|
||||
# This type definition resolves all
|
||||
# those types into a list of strings.
|
||||
let
|
||||
inherit (lib.types) attrsOf coercedTo listOf;
|
||||
innerType = coercedTo bool (x: if x then "Yes" else "No")
|
||||
(coercedTo int (toString) str);
|
||||
in
|
||||
attrsOf (coercedTo innerType lib.singleton (listOf innerType));
|
||||
|
||||
cfg = config.services.hylafax;
|
||||
|
||||
modemConfigOptions = { name, config, ... }: {
|
||||
options = {
|
||||
name = mkOption {
|
||||
type = str1;
|
||||
example = "ttyS1";
|
||||
description = ''
|
||||
Name of modem device,
|
||||
will be searched for in <filename>/dev</filename>.
|
||||
'';
|
||||
};
|
||||
type = mkOption {
|
||||
type = str1;
|
||||
example = "cirrus";
|
||||
description = ''
|
||||
Name of modem configuration file,
|
||||
will be searched for in <filename>config</filename>
|
||||
in the spooling area directory.
|
||||
'';
|
||||
};
|
||||
config = mkOption {
|
||||
type = configAttrType;
|
||||
example = {
|
||||
AreaCode = "49";
|
||||
LocalCode = "30";
|
||||
FAXNumber = "123456";
|
||||
LocalIdentifier = "LostInBerlin";
|
||||
};
|
||||
description = ''
|
||||
Attribute set of values for the given modem.
|
||||
${commonDescr}
|
||||
Options defined here override options in
|
||||
<option>commonModemConfig</option> for this modem.
|
||||
'';
|
||||
};
|
||||
};
|
||||
config.name = mkDefault name;
|
||||
config.config.Include = [ "config/${config.type}" ];
|
||||
};
|
||||
|
||||
defaultConfig =
|
||||
let
|
||||
inherit (config.security) wrapperDir;
|
||||
inherit (config.services.mail.sendmailSetuidWrapper) program;
|
||||
mkIfDefault = cond: value: mkIf cond (mkDefault value);
|
||||
noWrapper = config.services.mail.sendmailSetuidWrapper==null;
|
||||
# If a sendmail setuid wrapper exists,
|
||||
# we add the path to the default configuration file.
|
||||
# Otherwise, we use `false` to provoke
|
||||
# an error if hylafax tries to use it.
|
||||
c.sendmailPath = mkMerge [
|
||||
(mkIfDefault noWrapper ''${pkgs.coreutils}/bin/false'')
|
||||
(mkIfDefault (!noWrapper) ''${wrapperDir}/${program}'')
|
||||
];
|
||||
importDefaultConfig = file:
|
||||
lib.attrsets.mapAttrs
|
||||
(lib.trivial.const mkDefault)
|
||||
(import file { inherit pkgs; });
|
||||
c.commonModemConfig = importDefaultConfig ./modem-default.nix;
|
||||
c.faxqConfig = importDefaultConfig ./faxq-default.nix;
|
||||
c.hfaxdConfig = importDefaultConfig ./hfaxd-default.nix;
|
||||
in
|
||||
c;
|
||||
|
||||
localConfig =
|
||||
let
|
||||
c.hfaxdConfig.UserAccessFile = cfg.userAccessFile;
|
||||
c.faxqConfig = lib.attrsets.mapAttrs
|
||||
(lib.trivial.const (v: mkIf (v!=null) v))
|
||||
{
|
||||
AreaCode = cfg.areaCode;
|
||||
CountryCode = cfg.countryCode;
|
||||
LongDistancePrefix = cfg.longDistancePrefix;
|
||||
InternationalPrefix = cfg.internationalPrefix;
|
||||
};
|
||||
c.commonModemConfig = c.faxqConfig;
|
||||
in
|
||||
c;
|
||||
|
||||
in
|
||||
|
||||
|
||||
{
|
||||
|
||||
|
||||
options.services.hylafax = {
|
||||
|
||||
enable = mkEnableOption ''HylaFAX server'';
|
||||
|
||||
autostart = mkOption {
|
||||
type = bool;
|
||||
default = true;
|
||||
example = false;
|
||||
description = ''
|
||||
Autostart the HylaFAX queue manager at system start.
|
||||
If this is <literal>false</literal>, the queue manager
|
||||
will still be started if there are pending
|
||||
jobs or if a user tries to connect to it.
|
||||
'';
|
||||
};
|
||||
|
||||
countryCode = mkOption {
|
||||
type = nullOr str1;
|
||||
default = null;
|
||||
example = "49";
|
||||
description = ''Country code for server and all modems.'';
|
||||
};
|
||||
|
||||
areaCode = mkOption {
|
||||
type = nullOr str1;
|
||||
default = null;
|
||||
example = "30";
|
||||
description = ''Area code for server and all modems.'';
|
||||
};
|
||||
|
||||
longDistancePrefix = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "0";
|
||||
description = ''Long distance prefix for server and all modems.'';
|
||||
};
|
||||
|
||||
internationalPrefix = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "00";
|
||||
description = ''International prefix for server and all modems.'';
|
||||
};
|
||||
|
||||
spoolAreaPath = mkOption {
|
||||
type = path;
|
||||
default = "/var/spool/fax";
|
||||
description = ''
|
||||
The spooling area will be created/maintained
|
||||
at the location given here.
|
||||
'';
|
||||
};
|
||||
|
||||
userAccessFile = mkOption {
|
||||
type = path;
|
||||
default = "/etc/hosts.hfaxd";
|
||||
description = ''
|
||||
The <filename>hosts.hfaxd</filename>
|
||||
file entry in the spooling area
|
||||
will be symlinked to the location given here.
|
||||
This file must exist and be
|
||||
readable only by the <literal>uucp</literal> user.
|
||||
See hosts.hfaxd(5) for details.
|
||||
This configuration permits access for all users:
|
||||
<literal>
|
||||
environment.etc."hosts.hfaxd" = {
|
||||
mode = "0600";
|
||||
user = "uucp";
|
||||
text = ".*";
|
||||
};
|
||||
</literal>
|
||||
Note that host-based access can be controlled with
|
||||
<option>config.systemd.sockets.hylafax-hfaxd.listenStreams</option>;
|
||||
by default, only 127.0.0.1 is permitted to connect.
|
||||
'';
|
||||
};
|
||||
|
||||
sendmailPath = mkOption {
|
||||
type = path;
|
||||
example = literalExample "''${pkgs.postfix}/bin/sendmail";
|
||||
# '' ; # fix vim
|
||||
description = ''
|
||||
Path to <filename>sendmail</filename> program.
|
||||
The default uses the local sendmail wrapper
|
||||
(see <option>config.services.mail.sendmailSetuidWrapper</option>),
|
||||
otherwise the <filename>false</filename>
|
||||
binary to cause an error if used.
|
||||
'';
|
||||
};
|
||||
|
||||
hfaxdConfig = mkOption {
|
||||
type = configAttrType;
|
||||
example.RecvqProtection = "0400";
|
||||
description = ''
|
||||
Attribute set of lines for the global
|
||||
hfaxd config file <filename>etc/hfaxd.conf</filename>.
|
||||
${commonDescr}
|
||||
'';
|
||||
};
|
||||
|
||||
faxqConfig = mkOption {
|
||||
type = configAttrType;
|
||||
example = {
|
||||
InternationalPrefix = "00";
|
||||
LongDistancePrefix = "0";
|
||||
};
|
||||
description = ''
|
||||
Attribute set of lines for the global
|
||||
faxq config file <filename>etc/config</filename>.
|
||||
${commonDescr}
|
||||
'';
|
||||
};
|
||||
|
||||
commonModemConfig = mkOption {
|
||||
type = configAttrType;
|
||||
example = {
|
||||
InternationalPrefix = "00";
|
||||
LongDistancePrefix = "0";
|
||||
};
|
||||
description = ''
|
||||
Attribute set of default values for
|
||||
modem config files <filename>etc/config.*</filename>.
|
||||
${commonDescr}
|
||||
Think twice before changing
|
||||
paths of fax-processing scripts.
|
||||
'';
|
||||
};
|
||||
|
||||
modems = mkOption {
|
||||
type = loaOf (submodule [ modemConfigOptions ]);
|
||||
default = {};
|
||||
example.ttyS1 = {
|
||||
type = "cirrus";
|
||||
config = {
|
||||
FAXNumber = "123456";
|
||||
LocalIdentifier = "Smith";
|
||||
};
|
||||
};
|
||||
description = ''
|
||||
Description of installed modems.
|
||||
At least on modem must be defined
|
||||
to enable the HylaFAX server.
|
||||
'';
|
||||
};
|
||||
|
||||
spoolExtraInit = mkOption {
|
||||
type = lines;
|
||||
default = "";
|
||||
example = ''chmod 0755 . # everyone may read my faxes'';
|
||||
description = ''
|
||||
Additional shell code that is executed within the
|
||||
spooling area directory right after its setup.
|
||||
'';
|
||||
};
|
||||
|
||||
faxcron.enable.spoolInit = mkEnableOption ''
|
||||
Purge old files from the spooling area with
|
||||
<filename>faxcron</filename>
|
||||
each time the spooling area is initialized.
|
||||
'';
|
||||
faxcron.enable.frequency = mkOption {
|
||||
type = nullOr str1;
|
||||
default = null;
|
||||
example = "daily";
|
||||
description = ''
|
||||
Purge old files from the spooling area with
|
||||
<filename>faxcron</filename> with the given frequency
|
||||
(see systemd.time(7)).
|
||||
'';
|
||||
};
|
||||
faxcron.infoDays = mkOption {
|
||||
type = int1;
|
||||
default = 30;
|
||||
description = ''
|
||||
Set the expiration time for data in the
|
||||
remote machine information directory in days.
|
||||
'';
|
||||
};
|
||||
faxcron.logDays = mkOption {
|
||||
type = int1;
|
||||
default = 30;
|
||||
description = ''
|
||||
Set the expiration time for
|
||||
session trace log files in days.
|
||||
'';
|
||||
};
|
||||
faxcron.rcvDays = mkOption {
|
||||
type = int1;
|
||||
default = 7;
|
||||
description = ''
|
||||
Set the expiration time for files in
|
||||
the received facsimile queue in days.
|
||||
'';
|
||||
};
|
||||
|
||||
faxqclean.enable.spoolInit = mkEnableOption ''
|
||||
Purge old files from the spooling area with
|
||||
<filename>faxqclean</filename>
|
||||
each time the spooling area is initialized.
|
||||
'';
|
||||
faxqclean.enable.frequency = mkOption {
|
||||
type = nullOr str1;
|
||||
default = null;
|
||||
example = "daily";
|
||||
description = ''
|
||||
Purge old files from the spooling area with
|
||||
<filename>faxcron</filename> with the given frequency
|
||||
(see systemd.time(7)).
|
||||
'';
|
||||
};
|
||||
faxqclean.archiving = mkOption {
|
||||
type = enum [ "never" "as-flagged" "always" ];
|
||||
default = "as-flagged";
|
||||
example = "always";
|
||||
description = ''
|
||||
Enable or suppress job archiving:
|
||||
<literal>never</literal> disables job archiving,
|
||||
<literal>as-flagged</literal> archives jobs that
|
||||
have been flagged for archiving by sendfax,
|
||||
<literal>always</literal> forces archiving of all jobs.
|
||||
See also sendfax(1) and faxqclean(8).
|
||||
'';
|
||||
};
|
||||
faxqclean.doneqMinutes = mkOption {
|
||||
type = int1;
|
||||
default = 15;
|
||||
example = literalExample ''24*60'';
|
||||
description = ''
|
||||
Set the job
|
||||
age threshold (in minutes) that controls how long
|
||||
jobs may reside in the doneq directory.
|
||||
'';
|
||||
};
|
||||
faxqclean.docqMinutes = mkOption {
|
||||
type = int1;
|
||||
default = 60;
|
||||
example = literalExample ''24*60'';
|
||||
description = ''
|
||||
Set the document
|
||||
age threshold (in minutes) that controls how long
|
||||
unreferenced files may reside in the docq directory.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config.services.hylafax =
|
||||
mkIf
|
||||
(config.services.hylafax.enable)
|
||||
(mkMerge [ defaultConfig localConfig ])
|
||||
;
|
||||
|
||||
}
|
111
nixos/modules/services/networking/hylafax/spool.sh
Executable file
111
nixos/modules/services/networking/hylafax/spool.sh
Executable file
|
@ -0,0 +1,111 @@
|
|||
#! @shell@ -e
|
||||
|
||||
# The following lines create/update the HylaFAX spool directory:
|
||||
# Subdirectories/files with persistent data are kept,
|
||||
# other directories/files are removed/recreated,
|
||||
# mostly from the template spool
|
||||
# directory in the HylaFAX package.
|
||||
|
||||
# This block explains how the spool area is
|
||||
# derived from the spool template in the HylaFAX package:
|
||||
#
|
||||
# + capital letter: directory; file otherwise
|
||||
# + P/p: persistent directory
|
||||
# + F/f: directory with symlinks per entry
|
||||
# + T/t: temporary data
|
||||
# + S/s: single symlink into package
|
||||
# |
|
||||
# | + u: change ownership to uucp:uucp
|
||||
# | + U: ..also change access mode to user-only
|
||||
# | |
|
||||
# archive P U
|
||||
# bin S
|
||||
# client T u (client connection info)
|
||||
# config S
|
||||
# COPYRIGHT s
|
||||
# dev T u (maybe some FIFOs)
|
||||
# docq P U
|
||||
# doneq P U
|
||||
# etc F contains customized config files!
|
||||
# etc/hosts.hfaxd f
|
||||
# etc/xferfaxlog f
|
||||
# info P u (database of called devices)
|
||||
# log P u (communication logs)
|
||||
# pollq P U
|
||||
# recvq P u
|
||||
# sendq P U
|
||||
# status T u (modem status info files)
|
||||
# tmp T U
|
||||
|
||||
|
||||
shopt -s dotglob # if bash sees "*", it also includes dot files
|
||||
lnsym () { ln --symbol "$@" ; }
|
||||
lnsymfrc () { ln --symbolic --force "$@" ; }
|
||||
cprd () { cp --remove-destination "$@" ; }
|
||||
update () { install --owner=@faxuser@ --group=@faxgroup@ "$@" ; }
|
||||
|
||||
|
||||
## create/update spooling area
|
||||
|
||||
update --mode=0750 -d "@spoolAreaPath@"
|
||||
cd "@spoolAreaPath@"
|
||||
|
||||
persist=(archive docq doneq info log pollq recvq sendq)
|
||||
|
||||
# remove entries that don't belong here
|
||||
touch dummy # ensure "*" resolves to something
|
||||
for k in *
|
||||
do
|
||||
keep=0
|
||||
for j in "${persist[@]}" xferfaxlog clientlog faxcron.lastrun
|
||||
do
|
||||
if test "$k" == "$j"
|
||||
then
|
||||
keep=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test "$keep" == "0"
|
||||
then
|
||||
rm --recursive "$k"
|
||||
fi
|
||||
done
|
||||
|
||||
# create persistent data directories (unless they exist already)
|
||||
update --mode=0700 -d "${persist[@]}"
|
||||
chmod 0755 info log recvq
|
||||
|
||||
# create ``xferfaxlog``, ``faxcron.lastrun``, ``clientlog``
|
||||
touch clientlog faxcron.lastrun xferfaxlog
|
||||
chown @faxuser@:@faxgroup@ clientlog faxcron.lastrun xferfaxlog
|
||||
|
||||
# create symlinks for frozen directories/files
|
||||
lnsym --target-directory=. "@hylafax@"/spool/{COPYRIGHT,bin,config}
|
||||
|
||||
# create empty temporary directories
|
||||
update --mode=0700 -d client dev status
|
||||
update -d tmp
|
||||
|
||||
|
||||
## create and fill etc
|
||||
|
||||
install -d "@spoolAreaPath@/etc"
|
||||
cd "@spoolAreaPath@/etc"
|
||||
|
||||
# create symlinks to all files in template's etc
|
||||
lnsym --target-directory=. "@hylafax@/spool/etc"/*
|
||||
|
||||
# set LOCKDIR in setup.cache
|
||||
sed --regexp-extended 's|^(UUCP_LOCKDIR=).*$|\1'"'@lockPath@'|g" --in-place setup.cache
|
||||
|
||||
# etc/{xferfaxlog,lastrun} are stored in the spool root
|
||||
lnsymfrc --target-directory=. ../xferfaxlog
|
||||
lnsymfrc --no-target-directory ../faxcron.lastrun lastrun
|
||||
|
||||
# etc/hosts.hfaxd is provided by the NixOS configuration
|
||||
lnsymfrc --no-target-directory "@userAccessFile@" hosts.hfaxd
|
||||
|
||||
# etc/config and etc/config.${DEVID} must be copied:
|
||||
# hfaxd reads these file after locking itself up in a chroot
|
||||
cprd --no-target-directory "@globalConfigPath@" config
|
||||
cprd --target-directory=. "@modemConfigPath@"/*
|
249
nixos/modules/services/networking/hylafax/systemd.nix
Normal file
249
nixos/modules/services/networking/hylafax/systemd.nix
Normal file
|
@ -0,0 +1,249 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
|
||||
let
|
||||
|
||||
inherit (lib) mkIf mkMerge;
|
||||
inherit (lib) concatStringsSep optionalString;
|
||||
|
||||
cfg = config.services.hylafax;
|
||||
mapModems = lib.flip map (lib.attrValues cfg.modems);
|
||||
|
||||
mkConfigFile = name: conf:
|
||||
# creates hylafax config file,
|
||||
# makes sure "Include" is listed *first*
|
||||
let
|
||||
mkLines = conf:
|
||||
(lib.concatLists
|
||||
(lib.flip lib.mapAttrsToList conf
|
||||
(k: map (v: ''${k}: ${v}'')
|
||||
)));
|
||||
include = mkLines { Include = conf.Include or []; };
|
||||
other = mkLines ( conf // { Include = []; } );
|
||||
in
|
||||
pkgs.writeText ''hylafax-config${name}''
|
||||
(concatStringsSep "\n" (include ++ other));
|
||||
|
||||
globalConfigPath = mkConfigFile "" cfg.faxqConfig;
|
||||
|
||||
modemConfigPath =
|
||||
let
|
||||
mkModemConfigFile = { config, name, ... }:
|
||||
mkConfigFile ''.${name}''
|
||||
(cfg.commonModemConfig // config);
|
||||
mkLine = { name, type, ... }@modem: ''
|
||||
# check if modem config file exists:
|
||||
test -f "${pkgs.hylafaxplus}/spool/config/${type}"
|
||||
ln \
|
||||
--symbolic \
|
||||
--no-target-directory \
|
||||
"${mkModemConfigFile modem}" \
|
||||
"$out/config.${name}"
|
||||
'';
|
||||
in
|
||||
pkgs.runCommand "hylafax-config-modems" {}
|
||||
''mkdir --parents "$out/" ${concatStringsSep "\n" (mapModems mkLine)}'';
|
||||
|
||||
setupSpoolScript = pkgs.substituteAll {
|
||||
name = "hylafax-setup-spool.sh";
|
||||
src = ./spool.sh;
|
||||
isExecutable = true;
|
||||
inherit (pkgs.stdenv) shell;
|
||||
hylafax = pkgs.hylafaxplus;
|
||||
faxuser = "uucp";
|
||||
faxgroup = "uucp";
|
||||
lockPath = "/var/lock";
|
||||
inherit globalConfigPath modemConfigPath;
|
||||
inherit (cfg) sendmailPath spoolAreaPath userAccessFile;
|
||||
};
|
||||
|
||||
waitFaxqScript = pkgs.substituteAll {
|
||||
# This script checks the modems status files
|
||||
# and waits until all modems report readiness.
|
||||
name = "hylafax-faxq-wait-start.sh";
|
||||
src = ./faxq-wait.sh;
|
||||
isExecutable = true;
|
||||
timeoutSec = toString 10;
|
||||
inherit (pkgs.stdenv) shell;
|
||||
inherit (cfg) spoolAreaPath;
|
||||
};
|
||||
|
||||
sockets."hylafax-hfaxd" = {
|
||||
description = "HylaFAX server socket";
|
||||
documentation = [ "man:hfaxd(8)" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
listenStreams = [ "127.0.0.1:4559" ];
|
||||
socketConfig.FreeBind = true;
|
||||
socketConfig.Accept = true;
|
||||
};
|
||||
|
||||
paths."hylafax-faxq" = {
|
||||
description = "HylaFAX queue manager sendq watch";
|
||||
documentation = [ "man:faxq(8)" "man:sendq(5)" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
pathConfig.PathExistsGlob = [ ''${cfg.spoolAreaPath}/sendq/q*'' ];
|
||||
};
|
||||
|
||||
timers = mkMerge [
|
||||
(
|
||||
mkIf (cfg.faxcron.enable.frequency!=null)
|
||||
{ "hylafax-faxcron".timerConfig.Persistent = true; }
|
||||
)
|
||||
(
|
||||
mkIf (cfg.faxqclean.enable.frequency!=null)
|
||||
{ "hylafax-faxqclean".timerConfig.Persistent = true; }
|
||||
)
|
||||
];
|
||||
|
||||
hardenService =
|
||||
# Add some common systemd service hardening settings,
|
||||
# but allow each service (here) to override
|
||||
# settings by explicitely setting those to `null`.
|
||||
# More hardening would be nice but makes
|
||||
# customizing hylafax setups very difficult.
|
||||
# If at all, it should only be added along
|
||||
# with some options to customize it.
|
||||
let
|
||||
hardening = {
|
||||
PrivateDevices = true; # breaks /dev/tty...
|
||||
PrivateNetwork = true;
|
||||
PrivateTmp = true;
|
||||
ProtectControlGroups = true;
|
||||
#ProtectHome = true; # breaks custom spool dirs
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
#ProtectSystem = "strict"; # breaks custom spool dirs
|
||||
RestrictNamespaces = true;
|
||||
RestrictRealtime = true;
|
||||
};
|
||||
filter = key: value: (value != null) || ! (lib.hasAttr key hardening);
|
||||
apply = service: lib.filterAttrs filter (hardening // (service.serviceConfig or {}));
|
||||
in
|
||||
service: service // { serviceConfig = apply service; };
|
||||
|
||||
services."hylafax-spool" = {
|
||||
description = "HylaFAX spool area preparation";
|
||||
documentation = [ "man:hylafax-server(4)" ];
|
||||
script = ''
|
||||
${setupSpoolScript}
|
||||
cd "${cfg.spoolAreaPath}"
|
||||
${cfg.spoolExtraInit}
|
||||
if ! test -f "${cfg.spoolAreaPath}/etc/hosts.hfaxd"
|
||||
then
|
||||
echo hosts.hfaxd is missing
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
serviceConfig.ExecStop = ''${setupSpoolScript}'';
|
||||
serviceConfig.RemainAfterExit = true;
|
||||
serviceConfig.Type = "oneshot";
|
||||
unitConfig.RequiresMountsFor = [ cfg.spoolAreaPath ];
|
||||
};
|
||||
|
||||
services."hylafax-faxq" = {
|
||||
description = "HylaFAX queue manager";
|
||||
documentation = [ "man:faxq(8)" ];
|
||||
requires = [ "hylafax-spool.service" ];
|
||||
after = [ "hylafax-spool.service" ];
|
||||
wants = mapModems ( { name, ... }: ''hylafax-faxgetty@${name}.service'' );
|
||||
wantedBy = mkIf cfg.autostart [ "multi-user.target" ];
|
||||
serviceConfig.Type = "forking";
|
||||
serviceConfig.ExecStart = ''${pkgs.hylafaxplus}/spool/bin/faxq -q "${cfg.spoolAreaPath}"'';
|
||||
# This delays the "readiness" of this service until
|
||||
# all modems are initialized (or a timeout is reached).
|
||||
# Otherwise, sending a fax with the fax service
|
||||
# stopped will always yield a failed send attempt:
|
||||
# The fax service is started when the job is created with
|
||||
# `sendfax`, but modems need some time to initialize.
|
||||
serviceConfig.ExecStartPost = [ ''${waitFaxqScript}'' ];
|
||||
# faxquit fails if the pipe is already gone
|
||||
# (e.g. the service is already stopping)
|
||||
serviceConfig.ExecStop = ''-${pkgs.hylafaxplus}/spool/bin/faxquit -q "${cfg.spoolAreaPath}"'';
|
||||
# disable some systemd hardening settings
|
||||
serviceConfig.PrivateDevices = null;
|
||||
serviceConfig.RestrictRealtime = null;
|
||||
};
|
||||
|
||||
services."hylafax-hfaxd@" = {
|
||||
description = "HylaFAX server";
|
||||
documentation = [ "man:hfaxd(8)" ];
|
||||
after = [ "hylafax-faxq.service" ];
|
||||
requires = [ "hylafax-faxq.service" ];
|
||||
serviceConfig.StandardInput = "socket";
|
||||
serviceConfig.StandardOutput = "socket";
|
||||
serviceConfig.ExecStart = ''${pkgs.hylafaxplus}/spool/bin/hfaxd -q "${cfg.spoolAreaPath}" -d -I'';
|
||||
unitConfig.RequiresMountsFor = [ cfg.userAccessFile ];
|
||||
# disable some systemd hardening settings
|
||||
serviceConfig.PrivateDevices = null;
|
||||
serviceConfig.PrivateNetwork = null;
|
||||
};
|
||||
|
||||
services."hylafax-faxcron" = rec {
|
||||
description = "HylaFAX spool area maintenance";
|
||||
documentation = [ "man:faxcron(8)" ];
|
||||
after = [ "hylafax-spool.service" ];
|
||||
requires = [ "hylafax-spool.service" ];
|
||||
wantedBy = mkIf cfg.faxcron.enable.spoolInit requires;
|
||||
startAt = mkIf (cfg.faxcron.enable.frequency!=null) cfg.faxcron.enable.frequency;
|
||||
serviceConfig.ExecStart = concatStringsSep " " [
|
||||
''${pkgs.hylafaxplus}/spool/bin/faxcron''
|
||||
''-q "${cfg.spoolAreaPath}"''
|
||||
''-info ${toString cfg.faxcron.infoDays}''
|
||||
''-log ${toString cfg.faxcron.logDays}''
|
||||
''-rcv ${toString cfg.faxcron.rcvDays}''
|
||||
];
|
||||
};
|
||||
|
||||
services."hylafax-faxqclean" = rec {
|
||||
description = "HylaFAX spool area queue cleaner";
|
||||
documentation = [ "man:faxqclean(8)" ];
|
||||
after = [ "hylafax-spool.service" ];
|
||||
requires = [ "hylafax-spool.service" ];
|
||||
wantedBy = mkIf cfg.faxqclean.enable.spoolInit requires;
|
||||
startAt = mkIf (cfg.faxqclean.enable.frequency!=null) cfg.faxqclean.enable.frequency;
|
||||
serviceConfig.ExecStart = concatStringsSep " " [
|
||||
''${pkgs.hylafaxplus}/spool/bin/faxqclean''
|
||||
''-q "${cfg.spoolAreaPath}"''
|
||||
''-v''
|
||||
(optionalString (cfg.faxqclean.archiving!="never") ''-a'')
|
||||
(optionalString (cfg.faxqclean.archiving=="always") ''-A'')
|
||||
''-j ${toString (cfg.faxqclean.doneqMinutes*60)}''
|
||||
''-d ${toString (cfg.faxqclean.docqMinutes*60)}''
|
||||
];
|
||||
};
|
||||
|
||||
mkFaxgettyService = { name, ... }:
|
||||
lib.nameValuePair ''hylafax-faxgetty@${name}'' rec {
|
||||
description = "HylaFAX faxgetty for %I";
|
||||
documentation = [ "man:faxgetty(8)" ];
|
||||
bindsTo = [ "dev-%i.device" ];
|
||||
requires = [ "hylafax-spool.service" ];
|
||||
after = bindsTo ++ requires;
|
||||
before = [ "hylafax-faxq.service" "getty.target" ];
|
||||
unitConfig.StopWhenUnneeded = true;
|
||||
unitConfig.AssertFileNotEmpty = ''${cfg.spoolAreaPath}/etc/config.%I'';
|
||||
serviceConfig.UtmpIdentifier = "%I";
|
||||
serviceConfig.TTYPath = "/dev/%I";
|
||||
serviceConfig.Restart = "always";
|
||||
serviceConfig.KillMode = "process";
|
||||
serviceConfig.IgnoreSIGPIPE = false;
|
||||
serviceConfig.ExecStart = ''-${pkgs.hylafaxplus}/spool/bin/faxgetty -q "${cfg.spoolAreaPath}" /dev/%I'';
|
||||
# faxquit fails if the pipe is already gone
|
||||
# (e.g. the service is already stopping)
|
||||
serviceConfig.ExecStop = ''-${pkgs.hylafaxplus}/spool/bin/faxquit -q "${cfg.spoolAreaPath}" %I'';
|
||||
# disable some systemd hardening settings
|
||||
serviceConfig.PrivateDevices = null;
|
||||
serviceConfig.RestrictRealtime = null;
|
||||
};
|
||||
|
||||
modemServices =
|
||||
lib.listToAttrs (mapModems mkFaxgettyService);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
config.systemd = mkIf cfg.enable {
|
||||
inherit sockets timers paths;
|
||||
services = lib.mapAttrs (lib.const hardenService) (services // modemServices);
|
||||
};
|
||||
}
|
|
@ -8,6 +8,17 @@ let
|
|||
|
||||
homeDir = "/var/lib/i2pd";
|
||||
|
||||
strOpt = k: v: k + " = " + v;
|
||||
boolOpt = k: v: k + " = " + boolToString v;
|
||||
intOpt = k: v: k + " = " + toString v;
|
||||
lstOpt = k: xs: k + " = " + concatStringsSep "," xs;
|
||||
optionalNullString = o: s: optional (! isNull s) (strOpt o s);
|
||||
optionalNullBool = o: b: optional (! isNull b) (boolOpt o b);
|
||||
optionalNullInt = o: i: optional (! isNull i) (intOpt o i);
|
||||
optionalEmptyList = o: l: optional ([] != l) (lstOpt o l);
|
||||
|
||||
mkEnableTrueOption = name: mkEnableOption name // { default = true; };
|
||||
|
||||
mkEndpointOpt = name: addr: port: {
|
||||
enable = mkEnableOption name;
|
||||
name = mkOption {
|
||||
|
@ -18,42 +29,54 @@ let
|
|||
address = mkOption {
|
||||
type = types.str;
|
||||
default = addr;
|
||||
description = "Bind address for ${name} endpoint. Default: " + addr;
|
||||
description = "Bind address for ${name} endpoint.";
|
||||
};
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = port;
|
||||
description = "Bind port for ${name} endoint. Default: " + toString port;
|
||||
description = "Bind port for ${name} endoint.";
|
||||
};
|
||||
};
|
||||
|
||||
mkKeyedEndpointOpt = name: addr: port: keyFile:
|
||||
i2cpOpts = name: {
|
||||
length = mkOption {
|
||||
type = types.int;
|
||||
description = "Guaranteed minimum hops for ${name} tunnels.";
|
||||
default = 3;
|
||||
};
|
||||
quantity = mkOption {
|
||||
type = types.int;
|
||||
description = "Number of simultaneous ${name} tunnels.";
|
||||
default = 5;
|
||||
};
|
||||
};
|
||||
|
||||
mkKeyedEndpointOpt = name: addr: port: keyloc:
|
||||
(mkEndpointOpt name addr port) // {
|
||||
keys = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
type = with types; nullOr str;
|
||||
default = keyloc;
|
||||
description = ''
|
||||
File to persist ${lib.toUpper name} keys.
|
||||
'';
|
||||
};
|
||||
inbound = i2cpOpts name;
|
||||
outbound = i2cpOpts name;
|
||||
latency.min = mkOption {
|
||||
type = with types; nullOr int;
|
||||
description = "Min latency for tunnels.";
|
||||
default = null;
|
||||
};
|
||||
latency.max = mkOption {
|
||||
type = with types; nullOr int;
|
||||
description = "Max latency for tunnels.";
|
||||
default = null;
|
||||
};
|
||||
};
|
||||
|
||||
commonTunOpts = let
|
||||
i2cpOpts = {
|
||||
length = mkOption {
|
||||
type = types.int;
|
||||
description = "Guaranteed minimum hops.";
|
||||
default = 3;
|
||||
};
|
||||
quantity = mkOption {
|
||||
type = types.int;
|
||||
description = "Number of simultaneous tunnels.";
|
||||
default = 5;
|
||||
};
|
||||
};
|
||||
in name: {
|
||||
outbound = i2cpOpts;
|
||||
inbound = i2cpOpts;
|
||||
commonTunOpts = name: {
|
||||
outbound = i2cpOpts name;
|
||||
inbound = i2cpOpts name;
|
||||
crypto.tagsToSend = mkOption {
|
||||
type = types.int;
|
||||
description = "Number of ElGamal/AES tags to send.";
|
||||
|
@ -70,94 +93,142 @@ let
|
|||
};
|
||||
} // mkEndpointOpt name "127.0.0.1" 0;
|
||||
|
||||
i2pdConf = pkgs.writeText "i2pd.conf" ''
|
||||
# DO NOT EDIT -- this file has been generated automatically.
|
||||
loglevel = ${cfg.logLevel}
|
||||
|
||||
ipv4 = ${boolToString cfg.enableIPv4}
|
||||
ipv6 = ${boolToString cfg.enableIPv6}
|
||||
notransit = ${boolToString cfg.notransit}
|
||||
floodfill = ${boolToString cfg.floodfill}
|
||||
netid = ${toString cfg.netid}
|
||||
${if isNull cfg.bandwidth then "" else "bandwidth = ${toString cfg.bandwidth}" }
|
||||
${if isNull cfg.port then "" else "port = ${toString cfg.port}"}
|
||||
|
||||
[limits]
|
||||
transittunnels = ${toString cfg.limits.transittunnels}
|
||||
|
||||
[upnp]
|
||||
enabled = ${boolToString cfg.upnp.enable}
|
||||
name = ${cfg.upnp.name}
|
||||
|
||||
[precomputation]
|
||||
elgamal = ${boolToString cfg.precomputation.elgamal}
|
||||
|
||||
[reseed]
|
||||
verify = ${boolToString cfg.reseed.verify}
|
||||
file = ${cfg.reseed.file}
|
||||
urls = ${builtins.concatStringsSep "," cfg.reseed.urls}
|
||||
|
||||
[addressbook]
|
||||
defaulturl = ${cfg.addressbook.defaulturl}
|
||||
subscriptions = ${builtins.concatStringsSep "," cfg.addressbook.subscriptions}
|
||||
|
||||
${flip concatMapStrings
|
||||
sec = name: "\n[" + name + "]";
|
||||
notice = "# DO NOT EDIT -- this file has been generated automatically.";
|
||||
i2pdConf = let
|
||||
opts = [
|
||||
notice
|
||||
(strOpt "loglevel" cfg.logLevel)
|
||||
(boolOpt "logclftime" cfg.logCLFTime)
|
||||
(boolOpt "ipv4" cfg.enableIPv4)
|
||||
(boolOpt "ipv6" cfg.enableIPv6)
|
||||
(boolOpt "notransit" cfg.notransit)
|
||||
(boolOpt "floodfill" cfg.floodfill)
|
||||
(intOpt "netid" cfg.netid)
|
||||
] ++ (optionalNullInt "bandwidth" cfg.bandwidth)
|
||||
++ (optionalNullInt "port" cfg.port)
|
||||
++ (optionalNullString "family" cfg.family)
|
||||
++ (optionalNullString "datadir" cfg.dataDir)
|
||||
++ (optionalNullInt "share" cfg.share)
|
||||
++ (optionalNullBool "ssu" cfg.ssu)
|
||||
++ (optionalNullBool "ntcp" cfg.ntcp)
|
||||
++ (optionalNullString "ntcpproxy" cfg.ntcpProxy)
|
||||
++ (optionalNullString "ifname" cfg.ifname)
|
||||
++ (optionalNullString "ifname4" cfg.ifname4)
|
||||
++ (optionalNullString "ifname6" cfg.ifname6)
|
||||
++ [
|
||||
(sec "limits")
|
||||
(intOpt "transittunnels" cfg.limits.transittunnels)
|
||||
(intOpt "coresize" cfg.limits.coreSize)
|
||||
(intOpt "openfiles" cfg.limits.openFiles)
|
||||
(intOpt "ntcphard" cfg.limits.ntcpHard)
|
||||
(intOpt "ntcpsoft" cfg.limits.ntcpSoft)
|
||||
(intOpt "ntcpthreads" cfg.limits.ntcpThreads)
|
||||
(sec "upnp")
|
||||
(boolOpt "enabled" cfg.upnp.enable)
|
||||
(sec "precomputation")
|
||||
(boolOpt "elgamal" cfg.precomputation.elgamal)
|
||||
(sec "reseed")
|
||||
(boolOpt "verify" cfg.reseed.verify)
|
||||
] ++ (optionalNullString "file" cfg.reseed.file)
|
||||
++ (optionalEmptyList "urls" cfg.reseed.urls)
|
||||
++ (optionalNullString "floodfill" cfg.reseed.floodfill)
|
||||
++ (optionalNullString "zipfile" cfg.reseed.zipfile)
|
||||
++ (optionalNullString "proxy" cfg.reseed.proxy)
|
||||
++ [
|
||||
(sec "trust")
|
||||
(boolOpt "enabled" cfg.trust.enable)
|
||||
(boolOpt "hidden" cfg.trust.hidden)
|
||||
] ++ (optionalEmptyList "routers" cfg.trust.routers)
|
||||
++ (optionalNullString "family" cfg.trust.family)
|
||||
++ [
|
||||
(sec "websockets")
|
||||
(boolOpt "enabled" cfg.websocket.enable)
|
||||
(strOpt "address" cfg.websocket.address)
|
||||
(intOpt "port" cfg.websocket.port)
|
||||
(sec "exploratory")
|
||||
(intOpt "inbound.length" cfg.exploratory.inbound.length)
|
||||
(intOpt "inbound.quantity" cfg.exploratory.inbound.quantity)
|
||||
(intOpt "outbound.length" cfg.exploratory.outbound.length)
|
||||
(intOpt "outbound.quantity" cfg.exploratory.outbound.quantity)
|
||||
(sec "ntcp2")
|
||||
(boolOpt "enabled" cfg.ntcp2.enable)
|
||||
(boolOpt "published" cfg.ntcp2.published)
|
||||
(intOpt "port" cfg.ntcp2.port)
|
||||
(sec "addressbook")
|
||||
(strOpt "defaulturl" cfg.addressbook.defaulturl)
|
||||
] ++ (optionalEmptyList "subscriptions" cfg.addressbook.subscriptions)
|
||||
++ (flip map
|
||||
(collect (proto: proto ? port && proto ? address && proto ? name) cfg.proto)
|
||||
(proto: ''
|
||||
[${proto.name}]
|
||||
enabled = ${boolToString proto.enable}
|
||||
address = ${proto.address}
|
||||
port = ${toString proto.port}
|
||||
${if proto ? keys then "keys = ${proto.keys}" else ""}
|
||||
${if proto ? auth then "auth = ${boolToString proto.auth}" else ""}
|
||||
${if proto ? user then "user = ${proto.user}" else ""}
|
||||
${if proto ? pass then "pass = ${proto.pass}" else ""}
|
||||
${if proto ? outproxy then "outproxy = ${proto.outproxy}" else ""}
|
||||
${if proto ? outproxyPort then "outproxyport = ${toString proto.outproxyPort}" else ""}
|
||||
'')
|
||||
}
|
||||
'';
|
||||
(proto: let protoOpts = [
|
||||
(sec proto.name)
|
||||
(boolOpt "enabled" proto.enable)
|
||||
(strOpt "address" proto.address)
|
||||
(intOpt "port" proto.port)
|
||||
] ++ (if proto ? keys then optionalNullString "keys" proto.keys else [])
|
||||
++ (if proto ? auth then optionalNullBool "auth" proto.auth else [])
|
||||
++ (if proto ? user then optionalNullString "user" proto.user else [])
|
||||
++ (if proto ? pass then optionalNullString "pass" proto.pass else [])
|
||||
++ (if proto ? strictHeaders then optionalNullBool "strictheaders" proto.strictHeaders else [])
|
||||
++ (if proto ? hostname then optionalNullString "hostname" proto.hostname else [])
|
||||
++ (if proto ? outproxy then optionalNullString "outproxy" proto.outproxy else [])
|
||||
++ (if proto ? outproxyPort then optionalNullInt "outproxyport" proto.outproxyPort else [])
|
||||
++ (if proto ? outproxyEnable then optionalNullBool "outproxy.enabled" proto.outproxyEnable else []);
|
||||
in (concatStringsSep "\n" protoOpts)
|
||||
));
|
||||
in
|
||||
pkgs.writeText "i2pd.conf" (concatStringsSep "\n" opts);
|
||||
|
||||
i2pdTunnelConf = pkgs.writeText "i2pd-tunnels.conf" ''
|
||||
# DO NOT EDIT -- this file has been generated automatically.
|
||||
${flip concatMapStrings
|
||||
tunnelConf = let opts = [
|
||||
notice
|
||||
(flip map
|
||||
(collect (tun: tun ? port && tun ? destination) cfg.outTunnels)
|
||||
(tun: ''
|
||||
[${tun.name}]
|
||||
type = client
|
||||
destination = ${tun.destination}
|
||||
destinationport = ${toString tun.destinationPort}
|
||||
keys = ${tun.keys}
|
||||
address = ${tun.address}
|
||||
port = ${toString tun.port}
|
||||
inbound.length = ${toString tun.inbound.length}
|
||||
outbound.length = ${toString tun.outbound.length}
|
||||
inbound.quantity = ${toString tun.inbound.quantity}
|
||||
outbound.quantity = ${toString tun.outbound.quantity}
|
||||
crypto.tagsToSend = ${toString tun.crypto.tagsToSend}
|
||||
'')
|
||||
}
|
||||
${flip concatMapStrings
|
||||
(tun: let outTunOpts = [
|
||||
(sec tun.name)
|
||||
"type = client"
|
||||
(intOpt "port" tun.port)
|
||||
(strOpt "destination" tun.destination)
|
||||
] ++ (if tun ? destinationPort then optionalNullInt "destinationport" tun.destinationPort else [])
|
||||
++ (if tun ? keys then
|
||||
optionalNullString "keys" tun.keys else [])
|
||||
++ (if tun ? address then
|
||||
optionalNullString "address" tun.address else [])
|
||||
++ (if tun ? inbound.length then
|
||||
optionalNullInt "inbound.length" tun.inbound.length else [])
|
||||
++ (if tun ? inbound.quantity then
|
||||
optionalNullInt "inbound.quantity" tun.inbound.quantity else [])
|
||||
++ (if tun ? outbound.length then
|
||||
optionalNullInt "outbound.length" tun.outbound.length else [])
|
||||
++ (if tun ? outbound.quantity then
|
||||
optionalNullInt "outbound.quantity" tun.outbound.quantity else [])
|
||||
++ (if tun ? crypto.tagsToSend then
|
||||
optionalNullInt "crypto.tagstosend" tun.crypto.tagsToSend else []);
|
||||
in concatStringsSep "\n" outTunOpts))
|
||||
(flip map
|
||||
(collect (tun: tun ? port && tun ? address) cfg.inTunnels)
|
||||
(tun: ''
|
||||
[${tun.name}]
|
||||
type = server
|
||||
destination = ${tun.destination}
|
||||
keys = ${tun.keys}
|
||||
host = ${tun.address}
|
||||
port = ${toString tun.port}
|
||||
inport = ${toString tun.inPort}
|
||||
accesslist = ${builtins.concatStringsSep "," tun.accessList}
|
||||
'')
|
||||
}
|
||||
'';
|
||||
(tun: let inTunOpts = [
|
||||
(sec tun.name)
|
||||
"type = server"
|
||||
(intOpt "port" tun.port)
|
||||
(strOpt "host" tun.address)
|
||||
] ++ (if tun ? destination then
|
||||
optionalNullString "destination" tun.destination else [])
|
||||
++ (if tun ? keys then
|
||||
optionalNullString "keys" tun.keys else [])
|
||||
++ (if tun ? inPort then
|
||||
optionalNullInt "inport" tun.inPort else [])
|
||||
++ (if tun ? accessList then
|
||||
optionalEmptyList "accesslist" tun.accessList else []);
|
||||
in concatStringsSep "\n" inTunOpts))];
|
||||
in pkgs.writeText "i2pd-tunnels.conf" opts;
|
||||
|
||||
i2pdSh = pkgs.writeScriptBin "i2pd" ''
|
||||
#!/bin/sh
|
||||
exec ${pkgs.i2pd}/bin/i2pd \
|
||||
${if isNull cfg.address then "" else "--host="+cfg.address} \
|
||||
--service \
|
||||
--conf=${i2pdConf} \
|
||||
--tunconf=${i2pdTunnelConf}
|
||||
--tunconf=${tunnelConf}
|
||||
'';
|
||||
|
||||
in
|
||||
|
@ -170,9 +241,7 @@ in
|
|||
|
||||
services.i2pd = {
|
||||
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
enable = mkEnableOption "I2Pd daemon" // {
|
||||
description = ''
|
||||
Enables I2Pd as a running service upon activation.
|
||||
Please read http://i2pd.readthedocs.io/en/latest/ for further
|
||||
|
@ -192,6 +261,8 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
logCLFTime = mkEnableOption "Full CLF-formatted date and time to log";
|
||||
|
||||
address = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
|
@ -200,17 +271,72 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
notransit = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
family = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Specify a family the router belongs to.
|
||||
'';
|
||||
};
|
||||
|
||||
dataDir = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Alternative path to storage of i2pd data (RI, keys, peer profiles, ...)
|
||||
'';
|
||||
};
|
||||
|
||||
share = mkOption {
|
||||
type = types.int;
|
||||
default = 100;
|
||||
description = ''
|
||||
Limit of transit traffic from max bandwidth in percents.
|
||||
'';
|
||||
};
|
||||
|
||||
ifname = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Network interface to bind to.
|
||||
'';
|
||||
};
|
||||
|
||||
ifname4 = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
IPv4 interface to bind to.
|
||||
'';
|
||||
};
|
||||
|
||||
ifname6 = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
IPv6 interface to bind to.
|
||||
'';
|
||||
};
|
||||
|
||||
ntcpProxy = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Proxy URL for NTCP transport.
|
||||
'';
|
||||
};
|
||||
|
||||
ntcp = mkEnableTrueOption "ntcp";
|
||||
ssu = mkEnableTrueOption "ssu";
|
||||
|
||||
notransit = mkEnableOption "notransit" // {
|
||||
description = ''
|
||||
Tells the router to not accept transit tunnels during startup.
|
||||
'';
|
||||
};
|
||||
|
||||
floodfill = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
floodfill = mkEnableOption "floodfill" // {
|
||||
description = ''
|
||||
If the router is declared to be unreachable and needs introduction nodes.
|
||||
'';
|
||||
|
@ -241,51 +367,20 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
enableIPv4 = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
enableIPv4 = mkEnableTrueOption "IPv4 connectivity";
|
||||
enableIPv6 = mkEnableOption "IPv6 connectivity";
|
||||
nat = mkEnableTrueOption "NAT bypass";
|
||||
|
||||
upnp.enable = mkEnableOption "UPnP service discovery";
|
||||
upnp.name = mkOption {
|
||||
type = types.str;
|
||||
default = "I2Pd";
|
||||
description = ''
|
||||
Enables IPv4 connectivity. Enabled by default.
|
||||
Name i2pd appears in UPnP forwardings list.
|
||||
'';
|
||||
};
|
||||
|
||||
enableIPv6 = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enables IPv6 connectivity. Disabled by default.
|
||||
'';
|
||||
};
|
||||
|
||||
nat = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Assume router is NATed. Enabled by default.
|
||||
'';
|
||||
};
|
||||
|
||||
upnp = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enables UPnP.
|
||||
'';
|
||||
};
|
||||
|
||||
name = mkOption {
|
||||
type = types.str;
|
||||
default = "I2Pd";
|
||||
description = ''
|
||||
Name i2pd appears in UPnP forwardings list.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
precomputation.elgamal = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
precomputation.elgamal = mkEnableTrueOption "Precomputed ElGamal tables" // {
|
||||
description = ''
|
||||
Whenever to use precomputated tables for ElGamal.
|
||||
<command>i2pd</command> defaults to <literal>false</literal>
|
||||
|
@ -296,76 +391,154 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
reseed = {
|
||||
verify = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Request SU3 signature verification
|
||||
'';
|
||||
};
|
||||
reseed.verify = mkEnableOption "SU3 signature verification";
|
||||
|
||||
file = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Full path to SU3 file to reseed from
|
||||
'';
|
||||
};
|
||||
|
||||
urls = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [
|
||||
"https://reseed.i2p-project.de/"
|
||||
"https://i2p.mooo.com/netDb/"
|
||||
"https://netdb.i2p2.no/"
|
||||
"https://us.reseed.i2p2.no:444/"
|
||||
"https://uk.reseed.i2p2.no:444/"
|
||||
"https://i2p.manas.ca:8443/"
|
||||
];
|
||||
description = ''
|
||||
Reseed URLs
|
||||
'';
|
||||
};
|
||||
reseed.file = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Full path to SU3 file to reseed from.
|
||||
'';
|
||||
};
|
||||
|
||||
addressbook = {
|
||||
defaulturl = mkOption {
|
||||
type = types.str;
|
||||
default = "http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt";
|
||||
description = ''
|
||||
AddressBook subscription URL for initial setup
|
||||
'';
|
||||
};
|
||||
subscriptions = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [
|
||||
"http://inr.i2p/export/alive-hosts.txt"
|
||||
"http://i2p-projekt.i2p/hosts.txt"
|
||||
"http://stats.i2p/cgi-bin/newhosts.txt"
|
||||
];
|
||||
description = ''
|
||||
AddressBook subscription URLs
|
||||
'';
|
||||
};
|
||||
reseed.urls = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [];
|
||||
description = ''
|
||||
Reseed URLs.
|
||||
'';
|
||||
};
|
||||
|
||||
reseed.floodfill = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to router info of floodfill to reseed from.
|
||||
'';
|
||||
};
|
||||
|
||||
reseed.zipfile = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to local .zip file to reseed from.
|
||||
'';
|
||||
};
|
||||
|
||||
reseed.proxy = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
URL for reseed proxy, supports http/socks.
|
||||
'';
|
||||
};
|
||||
|
||||
addressbook.defaulturl = mkOption {
|
||||
type = types.str;
|
||||
default = "http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt";
|
||||
description = ''
|
||||
AddressBook subscription URL for initial setup
|
||||
'';
|
||||
};
|
||||
addressbook.subscriptions = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [
|
||||
"http://inr.i2p/export/alive-hosts.txt"
|
||||
"http://i2p-projekt.i2p/hosts.txt"
|
||||
"http://stats.i2p/cgi-bin/newhosts.txt"
|
||||
];
|
||||
description = ''
|
||||
AddressBook subscription URLs
|
||||
'';
|
||||
};
|
||||
|
||||
trust.enable = mkEnableOption "Explicit trust options";
|
||||
|
||||
trust.family = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Router Familiy to trust for first hops.
|
||||
'';
|
||||
};
|
||||
|
||||
trust.routers = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [];
|
||||
description = ''
|
||||
Only connect to the listed routers.
|
||||
'';
|
||||
};
|
||||
|
||||
trust.hidden = mkEnableOption "Router concealment.";
|
||||
|
||||
websocket = mkEndpointOpt "websockets" "127.0.0.1" 7666;
|
||||
|
||||
exploratory.inbound = i2cpOpts "exploratory";
|
||||
exploratory.outbound = i2cpOpts "exploratory";
|
||||
|
||||
ntcp2.enable = mkEnableTrueOption "NTCP2.";
|
||||
ntcp2.published = mkEnableOption "NTCP2 publication.";
|
||||
ntcp2.port = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = ''
|
||||
Port to listen for incoming NTCP2 connections (0=auto).
|
||||
'';
|
||||
};
|
||||
|
||||
limits.transittunnels = mkOption {
|
||||
type = types.int;
|
||||
default = 2500;
|
||||
description = ''
|
||||
Maximum number of active transit sessions
|
||||
Maximum number of active transit sessions.
|
||||
'';
|
||||
};
|
||||
|
||||
limits.coreSize = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = ''
|
||||
Maximum size of corefile in Kb (0 - use system limit).
|
||||
'';
|
||||
};
|
||||
|
||||
limits.openFiles = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = ''
|
||||
Maximum number of open files (0 - use system default).
|
||||
'';
|
||||
};
|
||||
|
||||
limits.ntcpHard = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = ''
|
||||
Maximum number of active transit sessions.
|
||||
'';
|
||||
};
|
||||
|
||||
limits.ntcpSoft = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = ''
|
||||
Threshold to start probabalistic backoff with ntcp sessions (default: use system limit).
|
||||
'';
|
||||
};
|
||||
|
||||
limits.ntcpThreads = mkOption {
|
||||
type = types.int;
|
||||
default = 1;
|
||||
description = ''
|
||||
Maximum number of threads used by NTCP DH worker.
|
||||
'';
|
||||
};
|
||||
|
||||
proto.http = (mkEndpointOpt "http" "127.0.0.1" 7070) // {
|
||||
auth = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable authentication for webconsole.
|
||||
'';
|
||||
};
|
||||
|
||||
auth = mkEnableOption "Webconsole authentication";
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "i2pd";
|
||||
|
@ -373,6 +546,7 @@ in
|
|||
Username for webconsole access
|
||||
'';
|
||||
};
|
||||
|
||||
pass = mkOption {
|
||||
type = types.str;
|
||||
default = "i2pd";
|
||||
|
@ -380,11 +554,35 @@ in
|
|||
Password for webconsole access.
|
||||
'';
|
||||
};
|
||||
|
||||
strictHeaders = mkOption {
|
||||
type = with types; nullOr bool;
|
||||
default = null;
|
||||
description = ''
|
||||
Enable strict host checking on WebUI.
|
||||
'';
|
||||
};
|
||||
|
||||
hostname = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Expected hostname for WebUI.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
proto.httpProxy = mkKeyedEndpointOpt "httpproxy" "127.0.0.1" 4444 "";
|
||||
proto.socksProxy = (mkKeyedEndpointOpt "socksproxy" "127.0.0.1" 4447 "")
|
||||
proto.httpProxy = (mkKeyedEndpointOpt "httpproxy" "127.0.0.1" 4444 "httpproxy-keys.dat")
|
||||
// {
|
||||
outproxy = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
description = "Upstream outproxy bind address.";
|
||||
};
|
||||
};
|
||||
proto.socksProxy = (mkKeyedEndpointOpt "socksproxy" "127.0.0.1" 4447 "socksproxy-keys.dat")
|
||||
// {
|
||||
outproxyEnable = mkEnableOption "SOCKS outproxy";
|
||||
outproxy = mkOption {
|
||||
type = types.str;
|
||||
default = "127.0.0.1";
|
||||
|
@ -408,8 +606,8 @@ in
|
|||
{ name, ... }: {
|
||||
options = {
|
||||
destinationPort = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
type = with types; nullOr int;
|
||||
default = null;
|
||||
description = "Connect to particular port at destination.";
|
||||
};
|
||||
} // commonTunOpts name;
|
||||
|
|
34
nixos/modules/services/networking/nullidentdmod.nix
Normal file
34
nixos/modules/services/networking/nullidentdmod.nix
Normal file
|
@ -0,0 +1,34 @@
|
|||
{ config, lib, pkgs, ... }: with lib; let
|
||||
cfg = config.services.nullidentdmod;
|
||||
|
||||
in {
|
||||
options.services.nullidentdmod = with types; {
|
||||
enable = mkEnableOption "Enable the nullidentdmod identd daemon";
|
||||
|
||||
userid = mkOption {
|
||||
type = nullOr str;
|
||||
description = "User ID to return. Set to null to return a random string each time.";
|
||||
default = null;
|
||||
example = "alice";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.sockets.nullidentdmod = {
|
||||
description = "Socket for identd (NullidentdMod)";
|
||||
listenStreams = [ "113" ];
|
||||
socketConfig.Accept = true;
|
||||
wantedBy = [ "sockets.target" ];
|
||||
};
|
||||
|
||||
systemd.services."nullidentdmod@" = {
|
||||
description = "NullidentdMod service";
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
ExecStart = "${pkgs.nullidentdmod}/bin/nullidentdmod${optionalString (cfg.userid != null) " ${cfg.userid}"}";
|
||||
StandardInput = "socket";
|
||||
StandardOutput = "socket";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -12,6 +12,8 @@ let
|
|||
log_dir = ${cfg.logDir}
|
||||
'' + lib.optionalString (cfg.port != null) ''
|
||||
ui_port = ${toString cfg.port}
|
||||
'' + lib.optionalString (cfg.torAlways) ''
|
||||
tor = always
|
||||
'' + cfg.extraConfig;
|
||||
};
|
||||
in with lib; {
|
||||
|
@ -35,11 +37,17 @@ in with lib; {
|
|||
port = mkOption {
|
||||
type = types.nullOr types.int;
|
||||
default = null;
|
||||
example = 15441;
|
||||
description = "Optional zeronet port.";
|
||||
example = 43110;
|
||||
description = "Optional zeronet web UI port.";
|
||||
};
|
||||
|
||||
tor = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Use TOR for zeronet traffic where possible.";
|
||||
};
|
||||
|
||||
torAlways = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Use TOR for all zeronet traffic.";
|
||||
|
@ -60,9 +68,13 @@ in with lib; {
|
|||
services.tor = mkIf cfg.tor {
|
||||
enable = true;
|
||||
controlPort = 9051;
|
||||
extraConfig = "CookieAuthentication 1";
|
||||
extraConfig = ''
|
||||
CacheDirectoryGroupReadable 1
|
||||
CookieAuthentication 1
|
||||
CookieAuthFileGroupReadable 1
|
||||
'';
|
||||
};
|
||||
|
||||
|
||||
systemd.services.zeronet = {
|
||||
description = "zeronet";
|
||||
after = [ "network.target" (optionalString cfg.tor "tor.service") ];
|
||||
|
|
|
@ -208,7 +208,7 @@ in
|
|||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Whether to enable tor transaprent proxy";
|
||||
description = "Whether to enable tor transparent proxy";
|
||||
};
|
||||
|
||||
listenAddress = mkOption {
|
||||
|
|
958
nixos/modules/services/web-apps/codimd.nix
Normal file
958
nixos/modules/services/web-apps/codimd.nix
Normal file
|
@ -0,0 +1,958 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.codimd;
|
||||
|
||||
prettyJSON = conf:
|
||||
pkgs.runCommand "codimd-config.json" { } ''
|
||||
echo '${builtins.toJSON conf}' | ${pkgs.jq}/bin/jq \
|
||||
'{production:del(.[]|nulls)|del(.[][]?|nulls)}' > $out
|
||||
'';
|
||||
in
|
||||
{
|
||||
options.services.codimd = {
|
||||
enable = mkEnableOption "the CodiMD Markdown Editor";
|
||||
|
||||
groups = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = ''
|
||||
Groups to which the codimd user should be added.
|
||||
'';
|
||||
};
|
||||
|
||||
workDir = mkOption {
|
||||
type = types.path;
|
||||
default = "/var/lib/codimd";
|
||||
description = ''
|
||||
Working directory for the CodiMD service.
|
||||
'';
|
||||
};
|
||||
|
||||
configuration = {
|
||||
debug = mkEnableOption "debug mode";
|
||||
domain = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "codimd.org";
|
||||
description = ''
|
||||
Domain name for the CodiMD instance.
|
||||
'';
|
||||
};
|
||||
urlPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "/url/path/to/codimd";
|
||||
description = ''
|
||||
Path under which CodiMD is accessible.
|
||||
'';
|
||||
};
|
||||
host = mkOption {
|
||||
type = types.str;
|
||||
default = "localhost";
|
||||
description = ''
|
||||
Address to listen on.
|
||||
'';
|
||||
};
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = 3000;
|
||||
example = "80";
|
||||
description = ''
|
||||
Port to listen on.
|
||||
'';
|
||||
};
|
||||
path = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "/var/run/codimd.sock";
|
||||
description = ''
|
||||
Specify where a UNIX domain socket should be placed.
|
||||
'';
|
||||
};
|
||||
allowOrigin = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "localhost" "codimd.org" ];
|
||||
description = ''
|
||||
List of domains to whitelist.
|
||||
'';
|
||||
};
|
||||
useSSL = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable to use SSL server. This will also enable
|
||||
<option>protocolUseSSL</option>.
|
||||
'';
|
||||
};
|
||||
hsts = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Wheter to enable HSTS if HTTPS is also enabled.
|
||||
'';
|
||||
};
|
||||
maxAgeSeconds = mkOption {
|
||||
type = types.int;
|
||||
default = 31536000;
|
||||
description = ''
|
||||
Max duration for clients to keep the HSTS status.
|
||||
'';
|
||||
};
|
||||
includeSubdomains = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to include subdomains in HSTS.
|
||||
'';
|
||||
};
|
||||
preload = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to allow preloading of the site's HSTS status.
|
||||
'';
|
||||
};
|
||||
};
|
||||
csp = mkOption {
|
||||
type = types.nullOr types.attrs;
|
||||
default = null;
|
||||
example = literalExample ''
|
||||
{
|
||||
enable = true;
|
||||
directives = {
|
||||
scriptSrc = "trustworthy.scripts.example.com";
|
||||
};
|
||||
upgradeInsecureRequest = "auto";
|
||||
addDefaults = true;
|
||||
}
|
||||
'';
|
||||
description = ''
|
||||
Specify the Content Security Policy which is passed to Helmet.
|
||||
For configuration details see <link xlink:href="https://helmetjs.github.io/docs/csp/"
|
||||
>https://helmetjs.github.io/docs/csp/</link>.
|
||||
'';
|
||||
};
|
||||
protocolUseSSL = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable to use TLS for resource paths.
|
||||
This only applies when <option>domain</option> is set.
|
||||
'';
|
||||
};
|
||||
urlAddPort = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable to add the port to callback URLs.
|
||||
This only applies when <option>domain</option> is set
|
||||
and only for ports other than 80 and 443.
|
||||
'';
|
||||
};
|
||||
useCDN = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to use CDN resources or not.
|
||||
'';
|
||||
};
|
||||
allowAnonymous = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to allow anonymous usage.
|
||||
'';
|
||||
};
|
||||
allowAnonymousEdits = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to allow guests to edit existing notes with the `freely' permission,
|
||||
when <option>allowAnonymous</option> is enabled.
|
||||
'';
|
||||
};
|
||||
allowFreeURL = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to allow note creation by accessing a nonexistent note URL.
|
||||
'';
|
||||
};
|
||||
defaultPermission = mkOption {
|
||||
type = types.enum [ "freely" "editable" "limited" "locked" "private" ];
|
||||
default = "editable";
|
||||
description = ''
|
||||
Default permissions for notes.
|
||||
This only applies for signed-in users.
|
||||
'';
|
||||
};
|
||||
dbURL = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = ''
|
||||
postgres://user:pass@host:5432/dbname
|
||||
'';
|
||||
description = ''
|
||||
Specify which database to use.
|
||||
CodiMD supports mysql, postgres, sqlite and mssql.
|
||||
See <link xlink:href="https://sequelize.readthedocs.io/en/v3/">
|
||||
https://sequelize.readthedocs.io/en/v3/</link> for more information.
|
||||
Note: This option overrides <option>db</option>.
|
||||
'';
|
||||
};
|
||||
db = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
example = literalExample ''
|
||||
{
|
||||
dialect = "sqlite";
|
||||
storage = "/var/lib/codimd/db.codimd.sqlite";
|
||||
}
|
||||
'';
|
||||
description = ''
|
||||
Specify the configuration for sequelize.
|
||||
CodiMD supports mysql, postgres, sqlite and mssql.
|
||||
See <link xlink:href="https://sequelize.readthedocs.io/en/v3/">
|
||||
https://sequelize.readthedocs.io/en/v3/</link> for more information.
|
||||
Note: This option overrides <option>db</option>.
|
||||
'';
|
||||
};
|
||||
sslKeyPath= mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "/var/lib/codimd/codimd.key";
|
||||
description = ''
|
||||
Path to the SSL key. Needed when <option>useSSL</option> is enabled.
|
||||
'';
|
||||
};
|
||||
sslCertPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "/var/lib/codimd/codimd.crt";
|
||||
description = ''
|
||||
Path to the SSL cert. Needed when <option>useSSL</option> is enabled.
|
||||
'';
|
||||
};
|
||||
sslCAPath = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "/var/lib/codimd/ca.crt" ];
|
||||
description = ''
|
||||
SSL ca chain. Needed when <option>useSSL</option> is enabled.
|
||||
'';
|
||||
};
|
||||
dhParamPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "/var/lib/codimd/dhparam.pem";
|
||||
description = ''
|
||||
Path to the SSL dh params. Needed when <option>useSSL</option> is enabled.
|
||||
'';
|
||||
};
|
||||
tmpPath = mkOption {
|
||||
type = types.str;
|
||||
default = "/tmp";
|
||||
description = ''
|
||||
Path to the temp directory CodiMD should use.
|
||||
Note that <option>serviceConfig.PrivateTmp</option> is enabled for
|
||||
the CodiMD systemd service by default.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
defaultNotePath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "./public/default.md";
|
||||
description = ''
|
||||
Path to the default Note file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
docsPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "./public/docs";
|
||||
description = ''
|
||||
Path to the docs directory.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
indexPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "./public/views/index.ejs";
|
||||
description = ''
|
||||
Path to the index template file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
hackmdPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "./public/views/hackmd.ejs";
|
||||
description = ''
|
||||
Path to the hackmd template file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
errorPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
defaultText = "./public/views/error.ejs";
|
||||
description = ''
|
||||
Path to the error template file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
prettyPath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
defaultText = "./public/views/pretty.ejs";
|
||||
description = ''
|
||||
Path to the pretty template file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
slidePath = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
defaultText = "./public/views/slide.hbs";
|
||||
description = ''
|
||||
Path to the slide template file.
|
||||
(Non-canonical paths are relative to CodiMD's base directory)
|
||||
'';
|
||||
};
|
||||
uploadsPath = mkOption {
|
||||
type = types.str;
|
||||
default = "${cfg.workDir}/uploads";
|
||||
defaultText = "/var/lib/codimd/uploads";
|
||||
description = ''
|
||||
Path under which uploaded files are saved.
|
||||
'';
|
||||
};
|
||||
sessionName = mkOption {
|
||||
type = types.str;
|
||||
default = "connect.sid";
|
||||
description = ''
|
||||
Specify the name of the session cookie.
|
||||
'';
|
||||
};
|
||||
sessionSecret = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Specify the secret used to sign the session cookie.
|
||||
If unset, one will be generated on startup.
|
||||
'';
|
||||
};
|
||||
sessionLife = mkOption {
|
||||
type = types.int;
|
||||
default = 1209600000;
|
||||
description = ''
|
||||
Session life time in milliseconds.
|
||||
'';
|
||||
};
|
||||
heartbeatInterval = mkOption {
|
||||
type = types.int;
|
||||
default = 5000;
|
||||
description = ''
|
||||
Specify the socket.io heartbeat interval.
|
||||
'';
|
||||
};
|
||||
heartbeatTimeout = mkOption {
|
||||
type = types.int;
|
||||
default = 10000;
|
||||
description = ''
|
||||
Specify the socket.io heartbeat timeout.
|
||||
'';
|
||||
};
|
||||
documentMaxLength = mkOption {
|
||||
type = types.int;
|
||||
default = 100000;
|
||||
description = ''
|
||||
Specify the maximum document length.
|
||||
'';
|
||||
};
|
||||
email = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to enable email sign-in.
|
||||
'';
|
||||
};
|
||||
allowEmailRegister = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Wether to enable email registration.
|
||||
'';
|
||||
};
|
||||
allowGravatar = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to use gravatar as profile picture source.
|
||||
'';
|
||||
};
|
||||
imageUploadType = mkOption {
|
||||
type = types.enum [ "imgur" "s3" "minio" "filesystem" ];
|
||||
default = "filesystem";
|
||||
description = ''
|
||||
Specify where to upload images.
|
||||
'';
|
||||
};
|
||||
minio = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
accessKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Minio access key.
|
||||
'';
|
||||
};
|
||||
secretKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Minio secret key.
|
||||
'';
|
||||
};
|
||||
endpoint = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Minio endpoint.
|
||||
'';
|
||||
};
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = 9000;
|
||||
description = ''
|
||||
Minio listen port.
|
||||
'';
|
||||
};
|
||||
secure = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to use HTTPS for Minio.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the minio third-party integration.";
|
||||
};
|
||||
s3 = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
accessKeyId = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
AWS access key id.
|
||||
'';
|
||||
};
|
||||
secretAccessKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
AWS access key.
|
||||
'';
|
||||
};
|
||||
region = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
AWS S3 region.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the s3 third-party integration.";
|
||||
};
|
||||
s3bucket = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Specify the bucket name for upload types <literal>s3</literal> and <literal>minio</literal>.
|
||||
'';
|
||||
};
|
||||
allowPDFExport = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to enable PDF exports.
|
||||
'';
|
||||
};
|
||||
imgur.clientId = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Imgur API client ID.
|
||||
'';
|
||||
};
|
||||
azure = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
connectionString = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Azure Blob Storage connection string.
|
||||
'';
|
||||
};
|
||||
container = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Azure Blob Storage container name.
|
||||
It will be created if non-existent.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the azure third-party integration.";
|
||||
};
|
||||
oauth2 = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
authorizationURL = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Specify the OAuth authorization URL.
|
||||
'';
|
||||
};
|
||||
tokenURL = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Specify the OAuth token URL.
|
||||
'';
|
||||
};
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Specify the OAuth client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Specify the OAuth client secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the OAuth integration.";
|
||||
};
|
||||
facebook = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Facebook API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Facebook API client secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the facebook third-party integration";
|
||||
};
|
||||
twitter = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
consumerKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Twitter API consumer key.
|
||||
'';
|
||||
};
|
||||
consumerSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Twitter API consumer secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the Twitter third-party integration.";
|
||||
};
|
||||
github = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
GitHub API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Github API client secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the GitHub third-party integration.";
|
||||
};
|
||||
gitlab = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
baseURL = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
GitLab API authentication endpoint.
|
||||
Only needed for other endpoints than gitlab.com.
|
||||
'';
|
||||
};
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
GitLab API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
GitLab API client secret.
|
||||
'';
|
||||
};
|
||||
scope = mkOption {
|
||||
type = types.enum [ "api" "read_user" ];
|
||||
default = "api";
|
||||
description = ''
|
||||
GitLab API requested scope.
|
||||
GitLab snippet import/export requires api scope.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the GitLab third-party integration.";
|
||||
};
|
||||
mattermost = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
baseURL = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Mattermost authentication endpoint.
|
||||
'';
|
||||
};
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Mattermost API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Mattermost API client secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the Mattermost third-party integration.";
|
||||
};
|
||||
dropbox = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Dropbox API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Dropbox API client secret.
|
||||
'';
|
||||
};
|
||||
appKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Dropbox app key.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the Dropbox third-party integration.";
|
||||
};
|
||||
google = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
clientID = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Google API client ID.
|
||||
'';
|
||||
};
|
||||
clientSecret = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Google API client secret.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the Google third-party integration.";
|
||||
};
|
||||
ldap = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
providerName = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Optional name to be displayed at login form, indicating the LDAP provider.
|
||||
'';
|
||||
};
|
||||
url = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "ldap://localhost";
|
||||
description = ''
|
||||
URL of LDAP server.
|
||||
'';
|
||||
};
|
||||
bindDn = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Bind DN for LDAP access.
|
||||
'';
|
||||
};
|
||||
bindCredentials = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Bind credentials for LDAP access.
|
||||
'';
|
||||
};
|
||||
searchBase = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "o=users,dc=example,dc=com";
|
||||
description = ''
|
||||
LDAP directory to begin search from.
|
||||
'';
|
||||
};
|
||||
searchFilter = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "(uid={{username}})";
|
||||
description = ''
|
||||
LDAP filter to search with.
|
||||
'';
|
||||
};
|
||||
searchAttributes = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "displayName" "mail" ];
|
||||
description = ''
|
||||
LDAP attributes to search with.
|
||||
'';
|
||||
};
|
||||
userNameField = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
LDAP field which is used as the username on CodiMD.
|
||||
By default <option>useridField</option> is used.
|
||||
'';
|
||||
};
|
||||
useridField = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "uid";
|
||||
description = ''
|
||||
LDAP field which is a unique identifier for users on CodiMD.
|
||||
'';
|
||||
};
|
||||
tlsca = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "server-cert.pem,root.pem";
|
||||
description = ''
|
||||
Root CA for LDAP TLS in PEM format.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the LDAP integration.";
|
||||
};
|
||||
saml = mkOption {
|
||||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
idpSsoUrl = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "https://idp.example.com/sso";
|
||||
description = ''
|
||||
IdP authentication endpoint.
|
||||
'';
|
||||
};
|
||||
idPCert = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "/path/to/cert.pem";
|
||||
description = ''
|
||||
Path to IdP certificate file in PEM format.
|
||||
'';
|
||||
};
|
||||
issuer = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Optional identity of the service provider.
|
||||
This defaults to the server URL.
|
||||
'';
|
||||
};
|
||||
identifierFormat = mkOption {
|
||||
type = types.str;
|
||||
default = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress";
|
||||
description = ''
|
||||
Optional name identifier format.
|
||||
'';
|
||||
};
|
||||
groupAttribute = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "memberOf";
|
||||
description = ''
|
||||
Optional attribute name for group list.
|
||||
'';
|
||||
};
|
||||
externalGroups = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "Temporary-staff" "External-users" ];
|
||||
description = ''
|
||||
Excluded group names.
|
||||
'';
|
||||
};
|
||||
requiredGroups = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "Hackmd-users" "Codimd-users" ];
|
||||
description = ''
|
||||
Required group names.
|
||||
'';
|
||||
};
|
||||
attribute = {
|
||||
id = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Attribute map for `id'.
|
||||
Defaults to `NameID' of SAML response.
|
||||
'';
|
||||
};
|
||||
username = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Attribute map for `username'.
|
||||
Defaults to `NameID' of SAML response.
|
||||
'';
|
||||
};
|
||||
email = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Attribute map for `email'.
|
||||
Defaults to `NameID' of SAML response if
|
||||
<option>identifierFormat</option> has
|
||||
the default value.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
default = null;
|
||||
description = "Configure the SAML integration.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{ assertion = cfg.configuration.db == {} -> (
|
||||
cfg.configuration.dbURL != "" && cfg.configuration.dbURL != null
|
||||
);
|
||||
message = "Database configuration for CodiMD missing."; }
|
||||
];
|
||||
users.groups.codimd = {};
|
||||
users.users.codimd = {
|
||||
description = "CodiMD service user";
|
||||
group = "codimd";
|
||||
extraGroups = cfg.groups;
|
||||
home = cfg.workDir;
|
||||
createHome = true;
|
||||
};
|
||||
|
||||
systemd.services.codimd = {
|
||||
description = "CodiMD Service";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "networking.target" ];
|
||||
preStart = ''
|
||||
mkdir -p ${cfg.workDir}
|
||||
chown -R codimd: ${cfg.workDir}
|
||||
'';
|
||||
serviceConfig = {
|
||||
WorkingDirectory = cfg.workDir;
|
||||
ExecStart = "${pkgs.codimd}/bin/codimd";
|
||||
Environment = [
|
||||
"CMD_CONFIG_FILE=${prettyJSON cfg.configuration}"
|
||||
"NODE_ENV=production"
|
||||
];
|
||||
Restart = "always";
|
||||
User = "codimd";
|
||||
PermissionsStartOnly = true;
|
||||
PrivateTmp = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -266,7 +266,7 @@ in
|
|||
session. Each session script can set the
|
||||
<varname>waitPID</varname> shell variable to make this script
|
||||
wait until the end of the user session. Each script is used
|
||||
to define either a windows manager or a desktop manager. These
|
||||
to define either a window manager or a desktop manager. These
|
||||
can be differentiated by setting the attribute
|
||||
<varname>manage</varname> either to <literal>"window"</literal>
|
||||
or <literal>"desktop"</literal>.
|
||||
|
|
|
@ -197,7 +197,7 @@ in
|
|||
# lightdm relaunches itself via just `lightdm`, so needs to be on the PATH
|
||||
execCmd = ''
|
||||
export PATH=${lightdm}/sbin:$PATH
|
||||
exec ${lightdm}/sbin/lightdm --log-dir=/var/log --run-dir=/run
|
||||
exec ${lightdm}/sbin/lightdm
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -246,12 +246,19 @@ in
|
|||
'';
|
||||
|
||||
users.users.lightdm = {
|
||||
createHome = true;
|
||||
home = "/var/lib/lightdm-data";
|
||||
home = "/var/lib/lightdm";
|
||||
group = "lightdm";
|
||||
uid = config.ids.uids.lightdm;
|
||||
};
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/run/lightdm 0711 lightdm lightdm 0"
|
||||
"d /var/cache/lightdm 0711 root lightdm -"
|
||||
"d /var/lib/lightdm 1770 lightdm lightdm -"
|
||||
"d /var/lib/lightdm-data 1775 lightdm lightdm -"
|
||||
"d /var/log/lightdm 0711 root lightdm -"
|
||||
];
|
||||
|
||||
users.groups.lightdm.gid = config.ids.gids.lightdm;
|
||||
services.xserver.tty = null; # We might start multiple X servers so let the tty increment themselves..
|
||||
services.xserver.display = null; # We specify our own display (and logfile) in xserver-wrapper up there
|
||||
|
|
|
@ -115,7 +115,7 @@ let
|
|||
|
||||
inherit (pkgs) utillinux coreutils;
|
||||
systemd = config.systemd.package;
|
||||
inherit (pkgs.stdenv) shell;
|
||||
shell = "${pkgs.bash}/bin/sh";
|
||||
|
||||
inherit children;
|
||||
kernelParams = config.boot.kernelParams;
|
||||
|
|
|
@ -341,7 +341,7 @@ in
|
|||
You should try to make this ID unique among your machines. You can
|
||||
generate a random 32-bit ID using the following commands:
|
||||
|
||||
<literal>cksum /etc/machine-id | while read c rest; do printf "%x" $c; done</literal>
|
||||
<literal>head -c 8 /etc/machine-id</literal>
|
||||
|
||||
(this derives it from the machine-id that systemd generates) or
|
||||
|
||||
|
|
|
@ -261,6 +261,7 @@ in rec {
|
|||
tests.chromium = (callSubTestsOnMatchingSystems ["x86_64-linux"] tests/chromium.nix {}).stable or {};
|
||||
tests.cjdns = callTest tests/cjdns.nix {};
|
||||
tests.cloud-init = callTest tests/cloud-init.nix {};
|
||||
tests.codimd = callTest tests/codimd.nix {};
|
||||
tests.containers-ipv4 = callTest tests/containers-ipv4.nix {};
|
||||
tests.containers-ipv6 = callTest tests/containers-ipv6.nix {};
|
||||
tests.containers-bridge = callTest tests/containers-bridge.nix {};
|
||||
|
@ -284,7 +285,8 @@ in rec {
|
|||
tests.ecryptfs = callTest tests/ecryptfs.nix {};
|
||||
tests.etcd = callTestOnMatchingSystems ["x86_64-linux"] tests/etcd.nix {};
|
||||
tests.ec2-nixops = (callSubTestsOnMatchingSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-nixops or {};
|
||||
tests.ec2-config = (callSubTestsOnMatchingSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-config or {};
|
||||
# ec2-config doesn't work in a sandbox as the simulated ec2 instance needs network access
|
||||
#tests.ec2-config = (callSubTestsOnMatchingSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-config or {};
|
||||
tests.elk = callSubTestsOnMatchingSystems ["x86_64-linux"] tests/elk.nix {};
|
||||
tests.env = callTest tests/env.nix {};
|
||||
tests.ferm = callTest tests/ferm.nix {};
|
||||
|
|
56
nixos/tests/codimd.nix
Normal file
56
nixos/tests/codimd.nix
Normal file
|
@ -0,0 +1,56 @@
|
|||
import ./make-test.nix ({ pkgs, lib, ... }:
|
||||
{
|
||||
name = "codimd";
|
||||
|
||||
meta = with lib.maintainers; {
|
||||
maintainers = [ willibutz ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
codimdSqlite = { ... }: {
|
||||
services = {
|
||||
codimd = {
|
||||
enable = true;
|
||||
configuration.dbURL = "sqlite:///var/lib/codimd/codimd.db";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
codimdPostgres = { ... }: {
|
||||
systemd.services.codimd.after = [ "postgresql.service" ];
|
||||
services = {
|
||||
codimd = {
|
||||
enable = true;
|
||||
configuration.dbURL = "postgres://codimd:snakeoilpassword@localhost:5432/codimddb";
|
||||
};
|
||||
postgresql = {
|
||||
enable = true;
|
||||
initialScript = pkgs.writeText "pg-init-script.sql" ''
|
||||
CREATE ROLE codimd LOGIN PASSWORD 'snakeoilpassword';
|
||||
CREATE DATABASE codimddb OWNER codimd;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
startAll();
|
||||
|
||||
subtest "CodiMD sqlite", sub {
|
||||
$codimdSqlite->waitForUnit("codimd.service");
|
||||
$codimdSqlite->waitForOpenPort(3000);
|
||||
$codimdPostgres->succeed("sleep 2"); # avoid 503 during startup
|
||||
$codimdSqlite->succeed("curl -sSf http://localhost:3000/new");
|
||||
};
|
||||
|
||||
subtest "CodiMD postgres", sub {
|
||||
$codimdPostgres->waitForUnit("postgresql.service");
|
||||
$codimdPostgres->waitForUnit("codimd.service");
|
||||
$codimdPostgres->waitForOpenPort(5432);
|
||||
$codimdPostgres->waitForOpenPort(3000);
|
||||
$codimdPostgres->succeed("sleep 2"); # avoid 503 during startup
|
||||
$codimdPostgres->succeed("curl -sSf http://localhost:3000/new");
|
||||
};
|
||||
'';
|
||||
})
|
|
@ -563,6 +563,7 @@ in {
|
|||
"swapon -L swap",
|
||||
"mkfs.ext3 -L nixos /dev/sda2",
|
||||
"mount LABEL=nixos /mnt",
|
||||
"mkdir -p /mnt/tmp",
|
||||
);
|
||||
'';
|
||||
grubVersion = 1;
|
||||
|
|
|
@ -38,6 +38,7 @@ stdenv.mkDerivation rec {
|
|||
homepage = https://bitcoinabc.org/;
|
||||
maintainers = with maintainers; [ lassulus ];
|
||||
license = licenses.mit;
|
||||
broken = stdenv.isDarwin;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ stdenv.mkDerivation rec {
|
|||
homepage = https://bitcoinclassic.com/;
|
||||
maintainers = with maintainers; [ jefdaj ];
|
||||
license = licenses.mit;
|
||||
broken = stdenv.isDarwin;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ stdenv.mkDerivation rec {
|
|||
homepage = https://www.bitcoinunlimited.info/;
|
||||
maintainers = with maintainers; [ DmitryTsygankov ];
|
||||
license = licenses.mit;
|
||||
broken = stdenv.isDarwin;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ stdenv.mkDerivation rec{
|
|||
homepage = https://bitcoinxt.software/;
|
||||
maintainers = with maintainers; [ jefdaj ];
|
||||
license = licenses.mit;
|
||||
broken = stdenv.isDarwin;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
{ stdenv, fetchurl, pkgconfig, autoreconfHook, openssl, db48, boost
|
||||
, zlib, miniupnpc, qt4, utillinux, protobuf, qrencode, libevent
|
||||
, withGui }:
|
||||
{ stdenv, fetchurl, pkgconfig, autoreconfHook, hexdump, openssl, db48
|
||||
, boost, zlib, miniupnpc, qt4, utillinux, protobuf, qrencode, libevent
|
||||
, AppKit
|
||||
, withGui ? !stdenv.isDarwin
|
||||
}:
|
||||
|
||||
with stdenv.lib;
|
||||
stdenv.mkDerivation rec{
|
||||
|
@ -12,11 +14,10 @@ stdenv.mkDerivation rec{
|
|||
sha256 = "0v0g2wb4nsnhddxzb63vj2bc1mgyj05vqm5imicjfz8prvgc0si8";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
buildInputs = [ openssl db48 boost zlib
|
||||
miniupnpc protobuf libevent]
|
||||
++ optionals stdenv.isLinux [ utillinux ]
|
||||
++ optionals withGui [ qt4 qrencode ];
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook hexdump ];
|
||||
buildInputs = [ openssl db48 boost zlib miniupnpc protobuf libevent ]
|
||||
++ optionals withGui [ qt4 qrencode ]
|
||||
++ optional stdenv.isDarwin AppKit;
|
||||
|
||||
configureFlags = [ "--with-boost-libdir=${boost.out}/lib" ]
|
||||
++ optionals withGui [ "--with-gui=qt4" ];
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{ callPackage, boost155, boost165, openssl_1_1_0, haskellPackages, darwin, libsForQt5, miniupnpc_2, python3, buildGo110Package }:
|
||||
{ callPackage, boost155, boost165, openssl_1_1, haskellPackages, darwin, libsForQt5, miniupnpc_2, python3, buildGo110Package }:
|
||||
|
||||
rec {
|
||||
|
||||
|
@ -32,8 +32,11 @@ rec {
|
|||
boost = boost165; withGui = false;
|
||||
};
|
||||
|
||||
btc1 = callPackage ./btc1.nix { boost = boost165; withGui = true; };
|
||||
btc1d = callPackage ./btc1.nix { boost = boost165; withGui = false; };
|
||||
btc1 = callPackage ./btc1.nix {
|
||||
inherit (darwin.apple_sdk.frameworks) AppKit;
|
||||
boost = boost165;
|
||||
};
|
||||
btc1d = btc1.override { withGui = false; };
|
||||
|
||||
cryptop = python3.pkgs.callPackage ./cryptop { };
|
||||
|
||||
|
@ -59,8 +62,10 @@ rec {
|
|||
buildGoPackage = buildGo110Package;
|
||||
};
|
||||
|
||||
litecoin = callPackage ./litecoin.nix { withGui = true; };
|
||||
litecoind = callPackage ./litecoin.nix { withGui = false; };
|
||||
litecoin = callPackage ./litecoin.nix {
|
||||
inherit (darwin.apple_sdk.frameworks) AppKit;
|
||||
};
|
||||
litecoind = litecoin.override { withGui = false; };
|
||||
|
||||
masari = callPackage ./masari.nix { };
|
||||
|
||||
|
@ -85,7 +90,7 @@ rec {
|
|||
|
||||
zcash = callPackage ./zcash {
|
||||
withGui = false;
|
||||
openssl = openssl_1_1_0;
|
||||
openssl = openssl_1_1;
|
||||
};
|
||||
|
||||
parity = callPackage ./parity { };
|
||||
|
|
|
@ -54,6 +54,7 @@ buildGoPackage rec {
|
|||
meta = with stdenv.lib; {
|
||||
homepage = https://github.com/dapphub/ethsign;
|
||||
description = "Make raw signed Ethereum transactions";
|
||||
broken = stdenv.isDarwin; # test with CoreFoundation 10.11
|
||||
license = [licenses.gpl3];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -2,9 +2,12 @@
|
|||
, pkgconfig, autoreconfHook
|
||||
, openssl, db48, boost, zlib, miniupnpc
|
||||
, glib, protobuf, utillinux, qt4, qrencode
|
||||
, withGui, libevent }:
|
||||
, AppKit
|
||||
, withGui ? true, libevent
|
||||
}:
|
||||
|
||||
with stdenv.lib;
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
|
||||
name = "litecoin" + (toString (optional (!withGui) "d")) + "-" + version;
|
||||
|
@ -20,6 +23,7 @@ stdenv.mkDerivation rec {
|
|||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
buildInputs = [ openssl db48 boost zlib
|
||||
miniupnpc glib protobuf utillinux libevent ]
|
||||
++ optionals stdenv.isDarwin [ AppKit ]
|
||||
++ optionals withGui [ qt4 qrencode ];
|
||||
|
||||
configureFlags = [ "--with-boost-libdir=${boost.out}/lib" ]
|
||||
|
@ -39,6 +43,7 @@ stdenv.mkDerivation rec {
|
|||
homepage = https://litecoin.org/;
|
||||
platforms = platforms.unix;
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ offline AndersonTorres ];
|
||||
broken = stdenv.isDarwin;
|
||||
maintainers = with maintainers; [ offline AndersonTorres ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -3,13 +3,13 @@
|
|||
stdenv.mkDerivation rec {
|
||||
|
||||
name = "nano-wallet-${version}";
|
||||
version = "15.2";
|
||||
version = "16.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "nanocurrency";
|
||||
repo = "raiblocks";
|
||||
rev = "V${version}";
|
||||
sha256 = "0ngsnaczw5y709zk52flp6m2c83q3kxfgz0bzi8rzfjxp10ncnz3";
|
||||
sha256 = "0fk8jlas3khdh3nlv40krsjdifxp9agblvzap6k93wmm9y34h41c";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
{ stdenv, lib, fetchurl, intltool, pkgconfig, gstreamer, gst-plugins-base
|
||||
, gst-plugins-good, gst-plugins-bad, gst-plugins-ugly, gst-ffmpeg, glib
|
||||
, mono, mono-addins, dbus-sharp-1_0, dbus-sharp-glib-1_0, notify-sharp, gtk-sharp-2_0
|
||||
, boo, gdata-sharp, taglib-sharp, sqlite, gnome-sharp, gconf, gtk-sharp-beans, gio-sharp
|
||||
, libmtp, libgpod, mono-zeroconf }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "banshee-${version}";
|
||||
version = "2.6.2";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://ftp.gnome.org/pub/GNOME/sources/banshee/2.6/banshee-${version}.tar.xz";
|
||||
sha256 = "1y30p8wxx5li39i5gpq2wib0ympy8llz0gyi6ri9bp730ndhhz7p";
|
||||
};
|
||||
|
||||
dontStrip = true;
|
||||
|
||||
nativeBuildInputs = [ pkgconfig intltool ];
|
||||
buildInputs = [
|
||||
gtk-sharp-2_0.gtk gstreamer gst-plugins-base gst-plugins-good
|
||||
gst-plugins-bad gst-plugins-ugly gst-ffmpeg
|
||||
mono dbus-sharp-1_0 dbus-sharp-glib-1_0 mono-addins notify-sharp
|
||||
gtk-sharp-2_0 boo gdata-sharp taglib-sharp sqlite gnome-sharp gconf gtk-sharp-beans
|
||||
gio-sharp libmtp libgpod mono-zeroconf
|
||||
];
|
||||
|
||||
makeFlags = [ "PREFIX=$(out)" ];
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs data/desktop-files/update-desktop-file.sh
|
||||
patchShebangs build/private-icon-theme-installer
|
||||
sed -i "s,DOCDIR=.*,DOCDIR=$out/lib/monodoc," configure
|
||||
'';
|
||||
|
||||
postInstall = let
|
||||
ldLibraryPath = lib.makeLibraryPath [ gtk-sharp-2_0.gtk gtk-sharp-2_0 sqlite gconf glib gstreamer ];
|
||||
|
||||
monoGACPrefix = lib.concatStringsSep ":" [
|
||||
mono dbus-sharp-1_0 dbus-sharp-glib-1_0 mono-addins notify-sharp gtk-sharp-2_0
|
||||
boo gdata-sharp taglib-sharp sqlite gnome-sharp gconf gtk-sharp-beans
|
||||
gio-sharp libmtp libgpod mono-zeroconf
|
||||
];
|
||||
in ''
|
||||
sed -e '2a export MONO_GAC_PREFIX=${monoGACPrefix}' \
|
||||
-e 's|LD_LIBRARY_PATH=|LD_LIBRARY_PATH=${ldLibraryPath}:|' \
|
||||
-e "s|GST_PLUGIN_PATH=|GST_PLUGIN_PATH=$GST_PLUGIN_SYSTEM_PATH:|" \
|
||||
-e 's| mono | ${mono}/bin/mono |' \
|
||||
-i $out/bin/banshee
|
||||
'';
|
||||
meta = with lib; {
|
||||
homepage = "http://banshee.fm/";
|
||||
description = "A music player written in C# using GNOME technologies";
|
||||
platforms = platforms.linux;
|
||||
maintainers = [ maintainers.zohl ];
|
||||
license = licenses.mit;
|
||||
};
|
||||
}
|
|
@ -3,12 +3,12 @@
|
|||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "0.9.15";
|
||||
version = "0.9.16";
|
||||
name = "drumgizmo-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://www.drumgizmo.org/releases/${name}/${name}.tar.gz";
|
||||
sha256 = "13bgqyw74pq3ss63zd9bjmgr4dah792pcphyqmr7bnvrgfjr6bx6";
|
||||
sha256 = "0ivr61n9gpigsfgn20rh3n09li8sxh1q095r6wiw0shqhn3vaxlg";
|
||||
};
|
||||
|
||||
configureFlags = [ "--enable-lv2" ];
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "jaaa-${version}";
|
||||
version = "0.8.4";
|
||||
version = "0.9.2";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://kokkinizita.linuxaudio.org/linuxaudio/downloads/${name}.tar.bz2";
|
||||
sha256 = "0jyll4rkb6vja2widc340ww078rr24c6nmxbxdqvbxw409nccd01";
|
||||
sha256 = "1czksxx2g8na07k7g57qlz0vvkkgi5bzajcx7vc7jhb94hwmmxbc";
|
||||
};
|
||||
|
||||
buildInputs = [
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
{ stdenv, fetchurl, alsaLib, libjack2, fftwFloat, libclthreads, libclxclient, libX11, libXft, zita-alsa-pcmi, }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "0.8.4";
|
||||
version = "0.9.2";
|
||||
name = "japa-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://kokkinizita.linuxaudio.org/linuxaudio/downloads/${name}.tar.bz2";
|
||||
sha256 = "1jhj7s4vqk5c4lchdall0kslvj5sh91902hhfjvs6r3a5nrhwcp0";
|
||||
sha256 = "1zmi4wg23hwsypg3h6y3qb72cbrihqcs19qrbzgs5a67d13q4897";
|
||||
};
|
||||
|
||||
buildInputs = [ alsaLib libjack2 fftwFloat libclthreads libclxclient libX11 libXft zita-alsa-pcmi ];
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
{ stdenv, fetchgit, meson, ninja, pkgconfig, wrapGAppsHook
|
||||
, appstream-glib, desktop-file-utils, gobjectIntrospection
|
||||
, python36Packages, gnome3, glib, gst_all_1 }:
|
||||
{ stdenv, fetchgit, meson, ninja, pkgconfig
|
||||
, python3, gtk3, gst_all_1, libsecret, libsoup
|
||||
, appstream-glib, desktop-file-utils, gnome3
|
||||
, gobjectIntrospection, wrapGAppsHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
python3.pkgs.buildPythonApplication rec {
|
||||
version = "0.9.522";
|
||||
name = "lollypop-${version}";
|
||||
|
||||
format = "other";
|
||||
doCheck = false;
|
||||
|
||||
src = fetchgit {
|
||||
url = "https://gitlab.gnome.org/World/lollypop";
|
||||
rev = "refs/tags/${version}";
|
||||
|
@ -13,26 +17,30 @@ stdenv.mkDerivation rec {
|
|||
sha256 = "0f2brwv884cvmxj644jcj9sg5hix3wvnjy2ndg0fh5cxyqz0kwn5";
|
||||
};
|
||||
|
||||
nativeBuildInputs = with python36Packages; [
|
||||
nativeBuildInputs = with python3.pkgs; [
|
||||
appstream-glib
|
||||
desktop-file-utils
|
||||
gobjectIntrospection
|
||||
meson
|
||||
ninja
|
||||
python36Packages.python
|
||||
pkgconfig
|
||||
wrapGAppsHook
|
||||
wrapPython
|
||||
];
|
||||
|
||||
buildInputs = [ glib ] ++ (with gnome3; [
|
||||
gsettings-desktop-schemas gtk3 libsecret libsoup totem-pl-parser
|
||||
]) ++ (with gst_all_1; [
|
||||
gst-libav gst-plugins-bad gst-plugins-base gst-plugins-good gst-plugins-ugly
|
||||
buildInputs = with gst_all_1; [
|
||||
gnome3.totem-pl-parser
|
||||
gst-libav
|
||||
gst-plugins-bad
|
||||
gst-plugins-base
|
||||
gst-plugins-good
|
||||
gst-plugins-ugly
|
||||
gstreamer
|
||||
]);
|
||||
gtk3
|
||||
libsecret
|
||||
libsoup
|
||||
];
|
||||
|
||||
pythonPath = with python36Packages; [
|
||||
pythonPath = with python3.pkgs; [
|
||||
beautifulsoup4
|
||||
gst-python
|
||||
pillow
|
||||
|
@ -42,11 +50,14 @@ stdenv.mkDerivation rec {
|
|||
pylast
|
||||
];
|
||||
|
||||
postFixup = "wrapPythonPrograms";
|
||||
|
||||
postPatch = ''
|
||||
chmod +x ./meson_post_install.py
|
||||
patchShebangs ./meson_post_install.py
|
||||
chmod +x meson_post_install.py
|
||||
patchShebangs meson_post_install.py
|
||||
'';
|
||||
|
||||
preFixup = ''
|
||||
buildPythonPath "$out/libexec/lollypop-sp $pythonPath"
|
||||
patchPythonScript "$out/libexec/lollypop-sp"
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
https://bugs.archlinux.org/task/31324
|
||||
https://410333.bugs.gentoo.org/attachment.cgi?id=322456
|
||||
|
||||
diff -ur src.old/compression/DecompressorGZIP.cpp src/compression/DecompressorGZIP.cpp
|
||||
--- src.old/compression/DecompressorGZIP.cpp 2012-08-28 17:54:46.000000000 +0200
|
||||
+++ src/compression/DecompressorGZIP.cpp 2012-08-28 17:55:21.000000000 +0200
|
||||
@@ -57,11 +57,11 @@
|
||||
|
||||
bool DecompressorGZIP::decompress(const PPSystemString& outFileName, Hints hint)
|
||||
{
|
||||
- gzFile *gz_input_file = NULL;
|
||||
+ gzFile gz_input_file = NULL;
|
||||
int len = 0;
|
||||
pp_uint8 *buf;
|
||||
|
||||
- if ((gz_input_file = (void **)gzopen (fileName.getStrBuffer(), "r")) == NULL)
|
||||
+ if ((gz_input_file = gzopen (fileName.getStrBuffer(), "r")) == NULL)
|
||||
return false;
|
||||
|
||||
if ((buf = new pp_uint8[0x10000]) == NULL)
|
|
@ -1,29 +1,26 @@
|
|||
{ stdenv, fetchurl, SDL2, alsaLib, cmake, libjack2, perl
|
||||
, zlib, zziplib, pkgconfig, makeWrapper
|
||||
}:
|
||||
{ stdenv, fetchFromGitHub, cmake, pkgconfig, makeWrapper
|
||||
, SDL2, alsaLib, libjack2, lhasa, perl, rtmidi, zlib, zziplib }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "1.01";
|
||||
version = "1.02.00";
|
||||
name = "milkytracker-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/milkytracker/MilkyTracker/archive/v${version}.00.tar.gz";
|
||||
sha256 = "1dvnddsnn9c83lz4dlm0cfjpc0m524amfkbalxbswdy0qc8cj1wv";
|
||||
src = fetchFromGitHub {
|
||||
owner = "milkytracker";
|
||||
repo = "MilkyTracker";
|
||||
rev = "v${version}";
|
||||
sha256 = "05a6d7l98k9i82dwrgi855dnccm3f2lkb144gi244vhk1156n0ca";
|
||||
};
|
||||
|
||||
preBuild=''
|
||||
export CPATH=${zlib.out}/lib
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [ cmake pkgconfig makeWrapper ];
|
||||
|
||||
buildInputs = [ SDL2 alsaLib libjack2 perl zlib zziplib ];
|
||||
buildInputs = [ SDL2 alsaLib libjack2 lhasa perl rtmidi zlib zziplib ];
|
||||
|
||||
meta = {
|
||||
meta = with stdenv.lib; {
|
||||
description = "Music tracker application, similar to Fasttracker II";
|
||||
homepage = http://milkytracker.org;
|
||||
license = stdenv.lib.licenses.gpl3Plus;
|
||||
license = licenses.gpl3Plus;
|
||||
platforms = [ "x86_64-linux" "i686-linux" ];
|
||||
maintainers = [ stdenv.lib.maintainers.zoomulator ];
|
||||
maintainers = with maintainers; [ zoomulator ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
{ stdenv, fetchgit, pythonPackages, cdparanoia, cdrdao
|
||||
, gst-python, gst-plugins-base, gst-plugins-good
|
||||
, utillinux, makeWrapper, substituteAll, autoreconfHook }:
|
||||
|
||||
let
|
||||
inherit (pythonPackages) python;
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "morituri-${version}";
|
||||
version = "0.2.3.20151109";
|
||||
namePrefix = "";
|
||||
|
||||
src = fetchgit {
|
||||
url = "https://github.com/thomasvs/morituri.git";
|
||||
fetchSubmodules = true;
|
||||
rev = "135b2f7bf27721177e3aeb1d26403f1b29116599";
|
||||
sha256 = "1sl5y5j3gdbynf2v0gf9dwd2hzawj8lm8ywadid7qm34yn8lx12k";
|
||||
};
|
||||
|
||||
pythonPath = with pythonPackages; [
|
||||
pygobject2 gst-python musicbrainzngs
|
||||
pycdio pyxdg setuptools
|
||||
CDDB
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ autoreconfHook ];
|
||||
buildInputs = [
|
||||
python cdparanoia cdrdao utillinux makeWrapper
|
||||
gst-plugins-base gst-plugins-good
|
||||
] ++ pythonPath;
|
||||
|
||||
patches = [
|
||||
(substituteAll {
|
||||
src = ./paths.patch;
|
||||
inherit cdrdao cdparanoia python utillinux;
|
||||
})
|
||||
];
|
||||
|
||||
# This package contains no binaries to patch or strip.
|
||||
dontPatchELF = true;
|
||||
dontStrip = true;
|
||||
|
||||
postInstall = ''
|
||||
wrapProgram "$out/bin/rip" \
|
||||
--prefix PYTHONPATH : "$PYTHONPATH" \
|
||||
--prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH"
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = http://thomas.apestaart.org/morituri/trac/;
|
||||
description = "A CD ripper aiming for accuracy over speed";
|
||||
maintainers = with maintainers; [ rycee jgeerds ];
|
||||
license = licenses.gpl3Plus;
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
diff --git a/doc/Makefile.am b/doc/Makefile.am
|
||||
index c115c2c..78c883e 100644
|
||||
--- a/doc/Makefile.am
|
||||
+++ b/doc/Makefile.am
|
||||
@@ -24,7 +24,7 @@ morituri.ics: $(top_srcdir)/morituri.doap
|
||||
man_MANS = rip.1
|
||||
|
||||
rip.1: $(top_srcdir)/morituri/extern/python-command/scripts/help2man $(top_srcdir)/morituri
|
||||
- PYTHONPATH=$(top_srcdir) $(PYTHON) $(top_srcdir)/morituri/extern/python-command/scripts/help2man morituri.rip.main.Rip rip > rip.1
|
||||
+ PYTHONPATH=$(top_srcdir):$(PYTHONPATH) $(PYTHON) $(top_srcdir)/morituri/extern/python-command/scripts/help2man morituri.rip.main.Rip rip > rip.1
|
||||
|
||||
clean-local:
|
||||
@rm -rf reference
|
||||
diff --git a/morituri/common/program.py b/morituri/common/program.py
|
||||
index d340fdd..15cb751 100644
|
||||
--- a/morituri/common/program.py
|
||||
+++ b/morituri/common/program.py
|
||||
@@ -92,13 +92,13 @@ class Program(log.Loggable):
|
||||
"""
|
||||
Load the given device.
|
||||
"""
|
||||
- os.system('eject -t %s' % device)
|
||||
+ os.system('@utillinux@/bin/eject -t %s' % device)
|
||||
|
||||
def ejectDevice(self, device):
|
||||
"""
|
||||
Eject the given device.
|
||||
"""
|
||||
- os.system('eject %s' % device)
|
||||
+ os.system('@utillinux@/bin/eject %s' % device)
|
||||
|
||||
def unmountDevice(self, device):
|
||||
"""
|
||||
@@ -112,7 +112,7 @@ class Program(log.Loggable):
|
||||
proc = open('/proc/mounts').read()
|
||||
if device in proc:
|
||||
print 'Device %s is mounted, unmounting' % device
|
||||
- os.system('umount %s' % device)
|
||||
+ os.system('@utillinux@/bin/umount %s' % device)
|
||||
|
||||
def getFastToc(self, runner, toc_pickle, device):
|
||||
"""
|
||||
Submodule morituri/extern/python-command contains modified content
|
||||
diff --git a/morituri/program/cdparanoia.py b/morituri/program/cdparanoia.py
|
||||
index 46176d5..fce14a5 100644
|
||||
--- a/morituri/program/cdparanoia.py
|
||||
+++ b/morituri/program/cdparanoia.py
|
||||
@@ -278,7 +278,7 @@ class ReadTrackTask(log.Loggable, task.Task):
|
||||
stopTrack, stopOffset)
|
||||
|
||||
bufsize = 1024
|
||||
- argv = ["cdparanoia", "--stderr-progress",
|
||||
+ argv = ["@cdparanoia@/bin/cdparanoia", "--stderr-progress",
|
||||
"--sample-offset=%d" % self._offset, ]
|
||||
if self._device:
|
||||
argv.extend(["--force-cdrom-device", self._device, ])
|
||||
@@ -551,7 +551,7 @@ _VERSION_RE = re.compile(
|
||||
|
||||
def getCdParanoiaVersion():
|
||||
getter = common.VersionGetter('cdparanoia',
|
||||
- ["cdparanoia", "-V"],
|
||||
+ ["@cdparanoia@/bin/cdparanoia", "-V"],
|
||||
_VERSION_RE,
|
||||
"%(version)s %(release)s")
|
||||
|
||||
diff --git a/morituri/program/cdrdao.py b/morituri/program/cdrdao.py
|
||||
index c6fba64..c4d0306 100644
|
||||
--- a/morituri/program/cdrdao.py
|
||||
+++ b/morituri/program/cdrdao.py
|
||||
@@ -257,7 +257,7 @@ class CDRDAOTask(ctask.PopenTask):
|
||||
|
||||
def start(self, runner):
|
||||
self.debug('Starting cdrdao with options %r', self.options)
|
||||
- self.command = ['cdrdao', ] + self.options
|
||||
+ self.command = ['@cdrdao@/bin/cdrdao', ] + self.options
|
||||
|
||||
ctask.PopenTask.start(self, runner)
|
||||
|
||||
@@ -515,7 +515,7 @@ _VERSION_RE = re.compile(
|
||||
|
||||
def getCDRDAOVersion():
|
||||
getter = common.VersionGetter('cdrdao',
|
||||
- ["cdrdao"],
|
||||
+ ["@cdrdao@/bin/cdrdao"],
|
||||
_VERSION_RE,
|
||||
"%(version)s")
|
||||
|
|
@ -11,6 +11,7 @@ stdenv.mkDerivation rec {
|
|||
|
||||
preFixup = ''
|
||||
wrapProgram "$out/bin/pavucontrol" \
|
||||
--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
|
||||
--prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS"
|
||||
'';
|
||||
|
||||
|
|
63
pkgs/applications/audio/pulseaudio-modules-bt/default.nix
Normal file
63
pkgs/applications/audio/pulseaudio-modules-bt/default.nix
Normal file
|
@ -0,0 +1,63 @@
|
|||
{ stdenv
|
||||
, runCommand
|
||||
, fetchFromGitHub
|
||||
, libpulseaudio
|
||||
, pulseaudio
|
||||
, pkgconfig
|
||||
, libtool
|
||||
, cmake
|
||||
, bluez
|
||||
, dbus
|
||||
, sbc
|
||||
}:
|
||||
|
||||
let
|
||||
pulseSources = runCommand "pulseaudio-sources" {} ''
|
||||
mkdir $out
|
||||
tar -xf ${pulseaudio.src}
|
||||
mv pulseaudio*/* $out/
|
||||
'';
|
||||
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "pulseaudio-modules-bt-${version}";
|
||||
version = "unstable-2018-09-11";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "EHfive";
|
||||
repo = "pulseaudio-modules-bt";
|
||||
rev = "9c6ad75382f3855916ad2feaa6b40e37356d80cc";
|
||||
sha256 = "1iz4m3y6arsvwcyvqc429w252dl3apnhvl1zhyvfxlbg00d2ii0h";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkgconfig
|
||||
cmake
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
libpulseaudio
|
||||
pulseaudio
|
||||
libtool
|
||||
bluez
|
||||
dbus
|
||||
sbc
|
||||
];
|
||||
|
||||
NIX_CFLAGS_COMPILE = [
|
||||
"-L${pulseaudio}/lib/pulseaudio"
|
||||
];
|
||||
|
||||
prePatch = ''
|
||||
rm -r pa
|
||||
ln -s ${pulseSources} pa
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = https://github.com/EHfive/pulseaudio-modules-bt;
|
||||
description = "SBC, Sony LDAC codec (A2DP Audio) support for Pulseaudio";
|
||||
platforms = platforms.linux;
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ adisbladis ];
|
||||
};
|
||||
}
|
|
@ -29,11 +29,11 @@
|
|||
# handle that.
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "qmmp-1.2.2";
|
||||
name = "qmmp-1.2.3";
|
||||
|
||||
src = fetchurl {
|
||||
url = "http://qmmp.ylsoftware.com/files/${name}.tar.bz2";
|
||||
sha256 = "01nnyg8m3p3px1fj3lfsqqv9zh1388dwx1bm2qv4v87jywimgp79";
|
||||
sha256 = "05lqmj22vr5ch1i0928d64ybdnn3qc66s9lgarx5s6x6ffr6589j";
|
||||
};
|
||||
|
||||
buildInputs =
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
, liblo, liblrdf, libsamplerate, libsndfile, lirc ? null, qtbase }:
|
||||
|
||||
stdenv.mkDerivation (rec {
|
||||
version = "17.12.1";
|
||||
version = "18.06";
|
||||
name = "rosegarden-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "mirror://sourceforge/rosegarden/${name}.tar.bz2";
|
||||
sha256 = "155kqbxg85wqv0w97cmmx8wq0r4xb3qpnk20lfma04vj8k6hc1mg";
|
||||
sha256 = "04qc80sqb2ji42pq3mayhvqqn39hlxzymsywpbpzfpchr19chxx7";
|
||||
};
|
||||
|
||||
patchPhase = ''
|
||||
|
|
|
@ -4,11 +4,11 @@
|
|||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "snd-18.6";
|
||||
name = "snd-18.7";
|
||||
|
||||
src = fetchurl {
|
||||
url = "mirror://sourceforge/snd/${name}.tar.gz";
|
||||
sha256 = "1jyqkkz2a6zw0jn9y15xd3027r8glkpw794fjk6hd3al1byjhz2z";
|
||||
sha256 = "1d7g043r534shwsq5s4xsywgn5qv96v9wnhdx04j21s9w7fy9ypl";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig ];
|
||||
|
|
52
pkgs/applications/audio/vocal/default.nix
Normal file
52
pkgs/applications/audio/vocal/default.nix
Normal file
|
@ -0,0 +1,52 @@
|
|||
{ stdenv, fetchFromGitHub, cmake, ninja, pkgconfig, vala, gtk3, libxml2, granite, webkitgtk, clutter-gtk
|
||||
, clutter-gst, libunity, libnotify, sqlite, gst_all_1, libsoup, json-glib, gnome3, gobjectIntrospection, wrapGAppsHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "vocal";
|
||||
version = "2.2.0";
|
||||
|
||||
name = "${pname}-${version}";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "needle-and-thread";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "09cm4azyaa9fmfymygf25gf0klpm5p04k6bc1i90jhw0f1im8sgl";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
cmake
|
||||
gobjectIntrospection
|
||||
libxml2
|
||||
ninja
|
||||
pkgconfig
|
||||
vala
|
||||
wrapGAppsHook
|
||||
];
|
||||
|
||||
buildInputs = with gst_all_1; [
|
||||
clutter-gst
|
||||
clutter-gtk
|
||||
gnome3.libgee
|
||||
granite
|
||||
gst-plugins-base
|
||||
gst-plugins-good
|
||||
gstreamer
|
||||
json-glib
|
||||
libnotify
|
||||
libunity
|
||||
sqlite
|
||||
webkitgtk
|
||||
];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "The podcast client for the modern free desktop";
|
||||
longDescription = ''
|
||||
Vocal is a powerful, fast, and intuitive application that helps users find new podcasts, manage their libraries, and enjoy the best that indepedent audio and video publishing has to offer. Vocal features full support for both episode downloading and streaming, native system integration, iTunes store search and top 100 charts (with international results support), iTunes link parsing, OPML importing and exporting, and so much more. Plus, it has great smart features like automatically keeping your library clean from old files, and the ability to set custom skip intervals.
|
||||
'';
|
||||
homepage = https://github.com/needle-and-thread/vocal;
|
||||
license = licenses.gpl3Plus;
|
||||
maintainers = with maintainers; [ worldofpeace ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
48
pkgs/applications/audio/whipper/default.nix
Normal file
48
pkgs/applications/audio/whipper/default.nix
Normal file
|
@ -0,0 +1,48 @@
|
|||
{ stdenv, fetchFromGitHub, python2, cdparanoia, cdrdao, flac
|
||||
, sox, accuraterip-checksum, utillinux, substituteAll }:
|
||||
|
||||
python2.pkgs.buildPythonApplication rec {
|
||||
name = "whipper-${version}";
|
||||
version = "0.7.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "JoeLametta";
|
||||
repo = "whipper";
|
||||
rev = "v${version}";
|
||||
sha256 = "04m8s0s9dcnly9l6id8vv99n9kbjrjid79bss52ay9yvwng0frmj";
|
||||
};
|
||||
|
||||
pythonPath = with python2.pkgs; [
|
||||
pygobject2 musicbrainzngs urllib3 chardet
|
||||
pycdio setuptools mutagen
|
||||
requests
|
||||
];
|
||||
|
||||
checkInputs = with python2.pkgs; [
|
||||
twisted
|
||||
];
|
||||
|
||||
patches = [
|
||||
(substituteAll {
|
||||
src = ./paths.patch;
|
||||
inherit cdrdao cdparanoia utillinux flac sox;
|
||||
accurateripChecksum = accuraterip-checksum;
|
||||
})
|
||||
];
|
||||
|
||||
# some tests require internet access
|
||||
# https://github.com/JoeLametta/whipper/issues/291
|
||||
doCheck = false;
|
||||
|
||||
preCheck = ''
|
||||
HOME=$TMPDIR
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = https://github.com/JoeLametta/whipper;
|
||||
description = "A CD ripper aiming for accuracy over speed";
|
||||
maintainers = with maintainers; [ rycee jgeerds ];
|
||||
license = licenses.gpl3Plus;
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
105
pkgs/applications/audio/whipper/paths.patch
Normal file
105
pkgs/applications/audio/whipper/paths.patch
Normal file
|
@ -0,0 +1,105 @@
|
|||
--- a/whipper/program/arc.py
|
||||
+++ b/whipper/program/arc.py
|
||||
@@ -3,8 +3,8 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
-ARB = 'accuraterip-checksum'
|
||||
-FLAC = 'flac'
|
||||
+ARB = '@accurateripChecksum@/bin/accuraterip-checksum'
|
||||
+FLAC = '@flac@/bin/flac'
|
||||
|
||||
|
||||
def _execute(cmd, **redirects):
|
||||
--- a/whipper/program/cdparanoia.py
|
||||
+++ b/whipper/program/cdparanoia.py
|
||||
@@ -280,10 +280,10 @@
|
||||
|
||||
bufsize = 1024
|
||||
if self._overread:
|
||||
- argv = ["cd-paranoia", "--stderr-progress",
|
||||
+ argv = ["@cdparanoia@/bin/cdparanoia", "--stderr-progress",
|
||||
"--sample-offset=%d" % self._offset, "--force-overread", ]
|
||||
else:
|
||||
- argv = ["cd-paranoia", "--stderr-progress",
|
||||
+ argv = ["@cdparanoia@/bin/cdparanoia", "--stderr-progress",
|
||||
"--sample-offset=%d" % self._offset, ]
|
||||
if self._device:
|
||||
argv.extend(["--force-cdrom-device", self._device, ])
|
||||
@@ -560,7 +560,7 @@
|
||||
|
||||
def getCdParanoiaVersion():
|
||||
getter = common.VersionGetter('cd-paranoia',
|
||||
- ["cd-paranoia", "-V"],
|
||||
+ ["@cdparanoia@/bin/cdparanoia", "-V"],
|
||||
_VERSION_RE,
|
||||
"%(version)s %(release)s")
|
||||
|
||||
@@ -585,7 +585,7 @@
|
||||
def __init__(self, device=None):
|
||||
# cdparanoia -A *always* writes cdparanoia.log
|
||||
self.cwd = tempfile.mkdtemp(suffix='.whipper.cache')
|
||||
- self.command = ['cd-paranoia', '-A']
|
||||
+ self.command = ['@cdparanoia@/bin/cdparanoia', '-A']
|
||||
if device:
|
||||
self.command += ['-d', device]
|
||||
|
||||
--- a/whipper/program/cdrdao.py
|
||||
+++ b/whipper/program/cdrdao.py
|
||||
@@ -9,7 +9,7 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
-CDRDAO = 'cdrdao'
|
||||
+CDRDAO = '@cdrdao@/bin/cdrdao'
|
||||
|
||||
|
||||
def read_toc(device, fast_toc=False):
|
||||
--- a/whipper/program/sox.py
|
||||
+++ b/whipper/program/sox.py
|
||||
@@ -4,7 +4,7 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
-SOX = 'sox'
|
||||
+SOX = '@sox@/bin/sox'
|
||||
|
||||
|
||||
def peak_level(track_path):
|
||||
--- a/whipper/program/soxi.py
|
||||
+++ b/whipper/program/soxi.py
|
||||
@@ -6,7 +6,7 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
-SOXI = 'soxi'
|
||||
+SOXI = '@sox@/bin/soxi'
|
||||
|
||||
|
||||
class AudioLengthTask(ctask.PopenTask):
|
||||
--- a/whipper/program/utils.py
|
||||
+++ b/whipper/program/utils.py
|
||||
@@ -9,7 +9,7 @@
|
||||
Eject the given device.
|
||||
"""
|
||||
logger.debug("ejecting device %s", device)
|
||||
- os.system('eject %s' % device)
|
||||
+ os.system('@utillinux@/bin/eject %s' % device)
|
||||
|
||||
|
||||
def load_device(device):
|
||||
@@ -17,7 +17,7 @@
|
||||
Load the given device.
|
||||
"""
|
||||
logger.debug("loading (eject -t) device %s", device)
|
||||
- os.system('eject -t %s' % device)
|
||||
+ os.system('@utillinux@/bin/eject -t %s' % device)
|
||||
|
||||
|
||||
def unmount_device(device):
|
||||
@@ -32,4 +32,4 @@
|
||||
proc = open('/proc/mounts').read()
|
||||
if device in proc:
|
||||
print 'Device %s is mounted, unmounting' % device
|
||||
- os.system('umount %s' % device)
|
||||
+ os.system('@utillinux@/bin/umount %s' % device)
|
|
@ -13,14 +13,14 @@ let
|
|||
sha256Hash = "0xx6yprylmcb32ipmwdcfkgddlm1nrxi1w68miclvgrbk015brf2";
|
||||
};
|
||||
betaVersion = {
|
||||
version = "3.2.0.24"; # "Android Studio 3.2 RC 2"
|
||||
build = "181.4974118";
|
||||
sha256Hash = "0sj848pzpsbmnfi2692gg73v6m72hr1pwlk5x8q912w60iypi3pz";
|
||||
version = "3.2.0.25"; # "Android Studio 3.2 RC 3"
|
||||
build = "181.4987877";
|
||||
sha256Hash = "0mriakxxchc0wbqkl236pp4fsqbq3gb2qrkdg5hx9zz763dc59gp";
|
||||
};
|
||||
latestVersion = { # canary & dev
|
||||
version = "3.3.0.7"; # "Android Studio 3.3 Canary 8"
|
||||
build = "182.4978721";
|
||||
sha256Hash = "0xa19wrw1a6y7f2jdv8699yqv7g34h3zdw3wc0ql0447afzwg9a9";
|
||||
version = "3.3.0.9"; # "Android Studio 3.3 Canary 10"
|
||||
build = "182.4996246";
|
||||
sha256Hash = "0g6hhfhlfj9szw48z22n869n6d0rw5fhljazj63dmw6i4v6rd92g";
|
||||
};
|
||||
in rec {
|
||||
# Old alias
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{ stdenv, lib, fetchFromGitHub, cmake, pkgconfig
|
||||
, curl, freetype, giflib, libjpeg, libpng, libwebp, pixman, tinyxml, zlib
|
||||
{ stdenv, lib, fetchFromGitHub, fetchpatch, cmake, pkgconfig
|
||||
, curl, freetype, giflib, harfbuzz, libjpeg, libpng, libwebp, pixman, tinyxml, zlib
|
||||
, libX11, libXext, libXcursor, libXxf86vm
|
||||
, unfree ? false
|
||||
, cmark
|
||||
|
@ -11,7 +11,7 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "aseprite-${version}";
|
||||
version = if unfree then "1.2.4" else "1.1.7";
|
||||
version = if unfree then "1.2.9" else "1.1.7";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "aseprite";
|
||||
|
@ -19,16 +19,27 @@ stdenv.mkDerivation rec {
|
|||
rev = "v${version}";
|
||||
fetchSubmodules = true;
|
||||
sha256 = if unfree
|
||||
then "1rnf4a8vgddz8x55rpqaihlxmqip1kgpdhqb4d3l71h1zmidg5k3"
|
||||
then "0a9xk163j0984n8nn6pqf27n83gr6w7g25wkiv591zx88pa6cpbd"
|
||||
else "0gd49lns2bpzbkwax5jf9x1xmg1j8ij997kcxr2596cwiswnw4di";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake pkgconfig ];
|
||||
|
||||
buildInputs = [
|
||||
curl freetype giflib libjpeg libpng libwebp pixman tinyxml zlib
|
||||
curl freetype giflib harfbuzz libjpeg libpng libwebp pixman tinyxml zlib
|
||||
libX11 libXext libXcursor libXxf86vm
|
||||
] ++ lib.optionals unfree [ cmark ];
|
||||
] ++ lib.optionals unfree [ cmark harfbuzz ];
|
||||
|
||||
patches = lib.optionals unfree [
|
||||
(fetchpatch {
|
||||
url = "https://github.com/aseprite/aseprite/commit/cfb4dac6feef1f39e161c23c886055a8f9acfd0d.patch";
|
||||
sha256 = "1qhjfpngg8b1vvb9w26lhjjfamfx57ih0p31km3r5l96nm85l7f9";
|
||||
})
|
||||
(fetchpatch {
|
||||
url = "https://github.com/orivej/aseprite/commit/ea87e65b357ad0bd65467af5529183b5a48a8c17.patch";
|
||||
sha256 = "1vwn8ivap1pzdh444sdvvkndp55iz146nhmd80xbm8cyzn3qmg91";
|
||||
})
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
sed -i src/config.h -e "s-\\(#define VERSION\\) .*-\\1 \"$version\"-"
|
||||
|
@ -49,6 +60,7 @@ stdenv.mkDerivation rec {
|
|||
"-DWITH_WEBP_SUPPORT=ON"
|
||||
] ++ lib.optionals unfree [
|
||||
"-DUSE_SHARED_CMARK=ON"
|
||||
"-DUSE_SHARED_HARFBUZZ=ON"
|
||||
# Aseprite needs internal freetype headers.
|
||||
"-DUSE_SHARED_FREETYPE=OFF"
|
||||
# Disable libarchive programs.
|
||||
|
|
|
@ -309,6 +309,21 @@
|
|||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
brief = callPackage ({ elpaBuild, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "brief";
|
||||
ename = "brief";
|
||||
version = "5.85";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/brief-5.85.el";
|
||||
sha256 = "10a41qidns28cka0y25rapla58fzjy9c8cw9v9bmrm4gkjqapsv4";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/brief.html";
|
||||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
bug-hunter = callPackage ({ cl-lib ? null, elpaBuild, fetchurl, lib, seq }:
|
||||
elpaBuild {
|
||||
pname = "bug-hunter";
|
||||
|
@ -820,10 +835,10 @@
|
|||
elpaBuild {
|
||||
pname = "ebdb";
|
||||
ename = "ebdb";
|
||||
version = "0.5.4";
|
||||
version = "0.6";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ebdb-0.5.4.tar";
|
||||
sha256 = "1dripbiwplyjalzmkr8awaimhkp9f6c2bhnm3c77027k2b87w4lf";
|
||||
url = "https://elpa.gnu.org/packages/ebdb-0.6.tar";
|
||||
sha256 = "1zj8jvq5l4wlk4734i3isxi4barpivarq2f9kqzkfia7mcspxav8";
|
||||
};
|
||||
packageRequires = [ cl-lib emacs seq ];
|
||||
meta = {
|
||||
|
@ -900,10 +915,10 @@
|
|||
elpaBuild {
|
||||
pname = "el-search";
|
||||
ename = "el-search";
|
||||
version = "1.7.3";
|
||||
version = "1.7.9";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/el-search-1.7.3.tar";
|
||||
sha256 = "0nxjgi027mjjn53nm9ara4nyr7kyqjawsmfaygsxqjv0mbykjmd1";
|
||||
url = "https://elpa.gnu.org/packages/el-search-1.7.9.tar";
|
||||
sha256 = "06da4v03zis1mf09v61c1jzkp5x6drm61iakcbpy5hkdq8nvm3xc";
|
||||
};
|
||||
packageRequires = [ cl-print emacs stream ];
|
||||
meta = {
|
||||
|
@ -971,7 +986,8 @@
|
|||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
ergoemacs-mode = callPackage ({ elpaBuild
|
||||
ergoemacs-mode = callPackage ({ cl-lib ? null
|
||||
, elpaBuild
|
||||
, emacs
|
||||
, fetchurl
|
||||
, lib
|
||||
|
@ -979,12 +995,12 @@
|
|||
elpaBuild {
|
||||
pname = "ergoemacs-mode";
|
||||
ename = "ergoemacs-mode";
|
||||
version = "5.14.7.3";
|
||||
version = "5.16.10.12";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ergoemacs-mode-5.14.7.3.tar";
|
||||
sha256 = "0lqqrnw6z9w7js8r40khckjc1cyxdiwx8kapf5pvyfs09gs89i90";
|
||||
url = "https://elpa.gnu.org/packages/ergoemacs-mode-5.16.10.12.tar";
|
||||
sha256 = "1zfzjmi30lllrbyzicmp11c9lpa82g57wi134q9bajvzn9ryx4jr";
|
||||
};
|
||||
packageRequires = [ emacs undo-tree ];
|
||||
packageRequires = [ cl-lib emacs undo-tree ];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/ergoemacs-mode.html";
|
||||
license = lib.licenses.free;
|
||||
|
@ -995,17 +1011,18 @@
|
|||
, fetchurl
|
||||
, fsm
|
||||
, lib
|
||||
, nadvice
|
||||
, soap-client
|
||||
, url-http-ntlm }:
|
||||
elpaBuild {
|
||||
pname = "excorporate";
|
||||
ename = "excorporate";
|
||||
version = "0.7.6";
|
||||
version = "0.8.0";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/excorporate-0.7.6.tar";
|
||||
sha256 = "02bp0z6vpssc12vxxs1g4whmfxf88wsk0bcq4422vvz256l6vpf9";
|
||||
url = "https://elpa.gnu.org/packages/excorporate-0.8.0.tar";
|
||||
sha256 = "0sx04w7yp2byda0maifsmapqmq6w43r114a6gzqar0j82rsc0mfg";
|
||||
};
|
||||
packageRequires = [ emacs fsm soap-client url-http-ntlm ];
|
||||
packageRequires = [ emacs fsm nadvice soap-client url-http-ntlm ];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/excorporate.html";
|
||||
license = lib.licenses.free;
|
||||
|
@ -1105,10 +1122,10 @@
|
|||
elpaBuild {
|
||||
pname = "ggtags";
|
||||
ename = "ggtags";
|
||||
version = "0.8.12";
|
||||
version = "0.8.13";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/ggtags-0.8.12.el";
|
||||
sha256 = "0ny3llk021g6r0s75xdm4hzpbxv393ddm2r6f2xdk8kqnq4gnirp";
|
||||
url = "https://elpa.gnu.org/packages/ggtags-0.8.13.el";
|
||||
sha256 = "1qa7lcrcmf76sf6dy8sxbg4adq7rg59fm0n5848w3qxgsr0h45fg";
|
||||
};
|
||||
packageRequires = [ cl-lib emacs ];
|
||||
meta = {
|
||||
|
@ -1412,10 +1429,10 @@
|
|||
elpaBuild {
|
||||
pname = "jsonrpc";
|
||||
ename = "jsonrpc";
|
||||
version = "1.0.0";
|
||||
version = "1.0.6";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/jsonrpc-1.0.0.el";
|
||||
sha256 = "06lmmn7j2ilkvwibbpgnd8p6d63fjjnxd2ma8f4jw6vrz1f7lwvs";
|
||||
url = "https://elpa.gnu.org/packages/jsonrpc-1.0.6.el";
|
||||
sha256 = "13a19smz8cksv6fgcyxb111csvagkp07z5nl4imyp5b23asgl70p";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
|
@ -1753,6 +1770,21 @@
|
|||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
nadvice = callPackage ({ elpaBuild, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "nadvice";
|
||||
ename = "nadvice";
|
||||
version = "0.2";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/nadvice-0.2.el";
|
||||
sha256 = "094slkgw4f7cd88r76d0rgpbqr7zzwy19ssndg8v3sm4p5ld6vwg";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/nadvice.html";
|
||||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
nameless = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "nameless";
|
||||
|
@ -1911,10 +1943,10 @@
|
|||
elpaBuild {
|
||||
pname = "org";
|
||||
ename = "org";
|
||||
version = "9.1.13";
|
||||
version = "9.1.14";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/org-9.1.13.tar";
|
||||
sha256 = "1vx0n32gvrgy2bl2b4pvxf00cywxwm57gi46f2b2zlrnmd5n85pr";
|
||||
url = "https://elpa.gnu.org/packages/org-9.1.14.tar";
|
||||
sha256 = "17vd9hig26rqv90l6y92hc2i0x29g44lsdsp0xd4m53s8r3zdikz";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
|
@ -1956,10 +1988,10 @@
|
|||
elpaBuild {
|
||||
pname = "other-frame-window";
|
||||
ename = "other-frame-window";
|
||||
version = "1.0.4";
|
||||
version = "1.0.6";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/other-frame-window-1.0.4.el";
|
||||
sha256 = "0hg82j8zjh0ann6bf56r0p8s0y3a016zny8byp80mcvkw63wrn5i";
|
||||
url = "https://elpa.gnu.org/packages/other-frame-window-1.0.6.el";
|
||||
sha256 = "04h0jr73xv8inm52h8b8zbc9lsnlzkn40qy99x4x0lkkdqqxw1ny";
|
||||
};
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
|
@ -2147,16 +2179,16 @@
|
|||
license = lib.licenses.free;
|
||||
};
|
||||
}) {};
|
||||
rcirc-color = callPackage ({ elpaBuild, fetchurl, lib }:
|
||||
rcirc-color = callPackage ({ elpaBuild, emacs, fetchurl, lib }:
|
||||
elpaBuild {
|
||||
pname = "rcirc-color";
|
||||
ename = "rcirc-color";
|
||||
version = "0.3";
|
||||
version = "0.4.1";
|
||||
src = fetchurl {
|
||||
url = "https://elpa.gnu.org/packages/rcirc-color-0.3.el";
|
||||
sha256 = "1ya4agh63x60lv8qzrjrng02dnrc70ci0s05b800iq71k71ss3dl";
|
||||
url = "https://elpa.gnu.org/packages/rcirc-color-0.4.1.el";
|
||||
sha256 = "1zs3i3xr8zbjr8hzr1r1qx7mqb2wckpn25qh9444c9as2dnh9sn9";
|
||||
};
|
||||
packageRequires = [];
|
||||
packageRequires = [ emacs ];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/rcirc-color.html";
|
||||
license = lib.licenses.free;
|
||||
|
@ -2252,6 +2284,7 @@
|
|||
}) {};
|
||||
rudel = callPackage ({ cl-generic
|
||||
, cl-lib ? null
|
||||
, cl-print
|
||||
, elpaBuild
|
||||
, emacs
|
||||
, fetchurl
|
||||
|
@ -2264,7 +2297,7 @@
|
|||
url = "https://elpa.gnu.org/packages/rudel-0.3.1.tar";
|
||||
sha256 = "0glqa68g509p0s2vcc0i8kzlddnc9brd9jqhnm5rzxz4i050cvnz";
|
||||
};
|
||||
packageRequires = [ cl-generic cl-lib emacs ];
|
||||
packageRequires = [ cl-generic cl-lib cl-print emacs ];
|
||||
meta = {
|
||||
homepage = "https://elpa.gnu.org/packages/rudel.html";
|
||||
license = lib.licenses.free;
|
||||
|
|
4756
pkgs/applications/editors/emacs-modes/melpa-generated.nix
generated
4756
pkgs/applications/editors/emacs-modes/melpa-generated.nix
generated
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -4,10 +4,10 @@
|
|||
elpaBuild {
|
||||
pname = "org";
|
||||
ename = "org";
|
||||
version = "20180723";
|
||||
version = "20180910";
|
||||
src = fetchurl {
|
||||
url = "http://orgmode.org/elpa/org-20180723.tar";
|
||||
sha256 = "1mcgnba16lpyh55zjx4rcbmpygcmdnjjzvgv1rx0c3kz1h5fgzf8";
|
||||
url = "http://orgmode.org/elpa/org-20180910.tar";
|
||||
sha256 = "1j4n0a07bxjbdzx3dipxgi0h5r0yimwylp9cnzfm6m7nc7kas2sq";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
|
@ -19,10 +19,10 @@
|
|||
elpaBuild {
|
||||
pname = "org-plus-contrib";
|
||||
ename = "org-plus-contrib";
|
||||
version = "20180723";
|
||||
version = "20180910";
|
||||
src = fetchurl {
|
||||
url = "http://orgmode.org/elpa/org-plus-contrib-20180723.tar";
|
||||
sha256 = "1l34bagkm8mcyv5diprpbd4yjijkdvx1l54qpvi8bmvxjnzsm7mk";
|
||||
url = "http://orgmode.org/elpa/org-plus-contrib-20180910.tar";
|
||||
sha256 = "17inl07kjdjamlqbyxbp42kx1nkbhbhz7lzqfvkhk6s7z16qvksq";
|
||||
};
|
||||
packageRequires = [];
|
||||
meta = {
|
||||
|
|
|
@ -4,8 +4,9 @@
|
|||
, alsaLib, cairo, acl, gpm, AppKit, GSS, ImageIO, m17n_lib, libotf
|
||||
, systemd ? null
|
||||
, withX ? !stdenv.isDarwin
|
||||
, withGTK2 ? false, gtk2 ? null
|
||||
, withGTK3 ? true, gtk3 ? null, gsettings-desktop-schemas ? null
|
||||
, withNS ? stdenv.isDarwin
|
||||
, withGTK2 ? false, gtk2-x11 ? null
|
||||
, withGTK3 ? true, gtk3-x11 ? null, gsettings-desktop-schemas ? null
|
||||
, withXwidgets ? false, webkitgtk ? null, wrapGAppsHook ? null, glib-networking ? null
|
||||
, withCsrc ? true
|
||||
, srcRepo ? false, autoconf ? null, automake ? null, texinfo ? null
|
||||
|
@ -13,10 +14,12 @@
|
|||
|
||||
assert (libXft != null) -> libpng != null; # probably a bug
|
||||
assert stdenv.isDarwin -> libXaw != null; # fails to link otherwise
|
||||
assert withGTK2 -> withX || stdenv.isDarwin;
|
||||
assert withGTK3 -> withX || stdenv.isDarwin;
|
||||
assert withGTK2 -> !withGTK3 && gtk2 != null;
|
||||
assert withGTK3 -> !withGTK2 && gtk3 != null;
|
||||
assert withNS -> !withX;
|
||||
assert withNS -> stdenv.isDarwin;
|
||||
assert (withGTK2 && !withNS) -> withX;
|
||||
assert (withGTK3 && !withNS) -> withX;
|
||||
assert withGTK2 -> !withGTK3 && gtk2-x11 != null;
|
||||
assert withGTK3 -> !withGTK2 && gtk3-x11 != null;
|
||||
assert withXwidgets -> withGTK3 && webkitgtk != null;
|
||||
|
||||
let
|
||||
|
@ -56,19 +59,22 @@ stdenv.mkDerivation rec {
|
|||
++ lib.optionals stdenv.isLinux [ dbus libselinux systemd ]
|
||||
++ lib.optionals withX
|
||||
[ xlibsWrapper libXaw Xaw3d libXpm libpng libjpeg libungif libtiff librsvg libXft
|
||||
imagemagick gconf m17n_lib libotf ]
|
||||
++ lib.optional (withX && withGTK2) gtk2
|
||||
++ lib.optionals (withX && withGTK3) [ gtk3 gsettings-desktop-schemas ]
|
||||
imagemagick gconf ]
|
||||
++ lib.optionals (stdenv.isLinux && withX) [ m17n_lib libotf ]
|
||||
++ lib.optional (withX && withGTK2) gtk2-x11
|
||||
++ lib.optionals (withX && withGTK3) [ gtk3-x11 gsettings-desktop-schemas ]
|
||||
++ lib.optional (stdenv.isDarwin && withX) cairo
|
||||
++ lib.optionals (withX && withXwidgets) [ webkitgtk ];
|
||||
|
||||
propagatedBuildInputs = lib.optionals stdenv.isDarwin [ AppKit GSS ImageIO ];
|
||||
propagatedBuildInputs = lib.optionals withNS [ AppKit GSS ImageIO ];
|
||||
|
||||
hardeningDisable = [ "format" ];
|
||||
|
||||
configureFlags = [ "--with-modules" ] ++
|
||||
(if stdenv.isDarwin
|
||||
then [ "--with-ns" "--disable-ns-self-contained" ]
|
||||
(lib.optional stdenv.isDarwin
|
||||
(lib.withFeature withNS "ns")) ++
|
||||
(if withNS
|
||||
then [ "--disable-ns-self-contained" ]
|
||||
else if withX
|
||||
then [ "--with-x-toolkit=${toolkit}" "--with-xft" ]
|
||||
else [ "--with-x=no" "--with-xpm=no" "--with-jpeg=no" "--with-png=no"
|
||||
|
@ -103,7 +109,7 @@ stdenv.mkDerivation rec {
|
|||
cp $srcdir/TAGS $dstdir
|
||||
echo '((nil . ((tags-file-name . "TAGS"))))' > $dstdir/.dir-locals.el
|
||||
done
|
||||
'' + lib.optionalString stdenv.isDarwin ''
|
||||
'' + lib.optionalString withNS ''
|
||||
mkdir -p $out/Applications
|
||||
mv nextstep/Emacs.app $out/Applications
|
||||
'';
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "focuswriter-${version}";
|
||||
version = "1.6.15";
|
||||
version = "1.6.16";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://gottcode.org/focuswriter/focuswriter-${version}-src.tar.bz2";
|
||||
sha256 = "0afs9cm5q7zxag28m427ycwwxkbn47zw7v111x7963ydqyn9gr9q";
|
||||
sha256 = "1warfv9d485a7ysmjazxw4zvi9l0ih1021s6c5adkc86m88k296m";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig qmake qttools ];
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
{ stdenv
|
||||
, ctags
|
||||
, desktop-file-utils
|
||||
, docbook_xsl
|
||||
, docbook_xml_dtd_43
|
||||
|
@ -58,6 +59,7 @@ in stdenv.mkDerivation {
|
|||
];
|
||||
|
||||
buildInputs = [
|
||||
ctags
|
||||
flatpak
|
||||
gnome3.devhelp
|
||||
gnome3.libgit2-glib
|
||||
|
|
|
@ -1,29 +1,20 @@
|
|||
{ stdenv, python3, libsForQt56, fetchFromGitHub, makeWrapper, makeDesktopItem }:
|
||||
{ stdenv, python3, fetchFromGitHub, makeWrapper, makeDesktopItem }:
|
||||
|
||||
let
|
||||
packageOverrides = self: super: {
|
||||
pyqt56 = libsForQt56.callPackage ../../../development/python-modules/pyqt/5.x.nix {
|
||||
pythonPackages = self;
|
||||
};
|
||||
};
|
||||
|
||||
pythonPackages = (python3.override { inherit packageOverrides; }).pkgs;
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
name = "leo-editor-${version}";
|
||||
version = "5.6";
|
||||
version = "5.7.3";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "leo-editor";
|
||||
repo = "leo-editor";
|
||||
rev = version;
|
||||
sha256 = "1k6q3gvaf05bi0mzkmmb1p6wrgxwri7ivn38p6f0m0wfd3f70x2j";
|
||||
sha256 = "0ri6l6cxwva450l05af5vs1lsgrz6ciwd02njdgphs9pm1vwxbl9";
|
||||
};
|
||||
|
||||
dontBuild = true;
|
||||
|
||||
nativeBuildInputs = [ makeWrapper python3 ];
|
||||
propagatedBuildInputs = with pythonPackages; [ pyqt56 docutils ];
|
||||
propagatedBuildInputs = with python3.pkgs; [ pyqt5 docutils ];
|
||||
|
||||
desktopItem = makeDesktopItem rec {
|
||||
name = "leo-editor";
|
||||
|
|
|
@ -14,17 +14,17 @@ let
|
|||
nixSyntaxHighlight = fetchFromGitHub {
|
||||
owner = "seitz";
|
||||
repo = "nanonix";
|
||||
rev = "7483fd8b79f1f3f2179dbbd46aa400df4320ba10";
|
||||
sha256 = "10pv75kfrgnziz8sr83hdbb0c3klm2fmsdw3i5cpqqf5va1fzb8h";
|
||||
rev = "bf8d898efaa10dce3f7972ff765b58c353b4b4ab";
|
||||
sha256 = "0773s5iz8aw9npgyasb0r2ybp6gvy2s9sq51az8w7h52bzn5blnn";
|
||||
};
|
||||
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "nano-${version}";
|
||||
version = "2.9.8";
|
||||
version = "3.0";
|
||||
|
||||
src = fetchurl {
|
||||
url = "mirror://gnu/nano/${name}.tar.xz";
|
||||
sha256 = "122lm0z97wk3mgnbn8m4d769d4j9rxyc9z7s89xd4gsdp8qsrpn2";
|
||||
sha256 = "1868hg9s584fwjrh0fzdrixmxc2qhw520z4q5iv68kjiajivr9g0";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ texinfo ] ++ optional enableNls gettext;
|
||||
|
|
|
@ -3,13 +3,13 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "neovim-qt-${version}";
|
||||
version = "0.2.9";
|
||||
version = "0.2.10";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "equalsraf";
|
||||
repo = "neovim-qt";
|
||||
rev = "v${version}";
|
||||
sha256 = "014zqfbbv7q85z64h1iw88l37vhrvhjv7xxd0a76j7d1m2769kqs";
|
||||
sha256 = "0hq3w9d6qbzf0j7zm3ls0wpvnab64kypb4i0bhmsnk605mvx63r4";
|
||||
};
|
||||
|
||||
cmakeFlags = [
|
||||
|
|
73
pkgs/applications/editors/quilter/default.nix
Normal file
73
pkgs/applications/editors/quilter/default.nix
Normal file
|
@ -0,0 +1,73 @@
|
|||
{ stdenv, fetchFromGitHub, fetchpatch, vala, pkgconfig, meson, ninja, python3
|
||||
, granite, gtk3, desktop-file-utils, gnome3, gtksourceview, webkitgtk, gtkspell3
|
||||
, discount, gobjectIntrospection, wrapGAppsHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "quilter";
|
||||
version = "1.6.3";
|
||||
|
||||
name = "${pname}-${version}";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "lainsce";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "1wa0i6dgg6fgb7q9z33v9qmn1a1dn3ik58v1f3a49dvd5xyf8q6q";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
desktop-file-utils
|
||||
gobjectIntrospection
|
||||
meson
|
||||
ninja
|
||||
pkgconfig
|
||||
python3
|
||||
vala
|
||||
wrapGAppsHook
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
discount
|
||||
granite
|
||||
gtk3
|
||||
gtksourceview
|
||||
gtkspell3
|
||||
webkitgtk
|
||||
gnome3.libgee
|
||||
];
|
||||
|
||||
patches = [
|
||||
# Fix build with vala 0.42 - Drop these in next release
|
||||
(fetchpatch {
|
||||
url = "https://github.com/lainsce/quilter/commit/a58838213cd7f2d33048c7b34b96dc8875612624.patch";
|
||||
sha256 = "1a4w1zql4zfk8scgrrssrm9n3sh5fsc1af5zvrqk8skbv7f2c80n";
|
||||
})
|
||||
(fetchpatch {
|
||||
url = "https://github.com/lainsce/quilter/commit/d1800ce830343a1715bc83da3339816554896be5.patch";
|
||||
sha256 = "0xl5iz8bgx5661vbbq8qa1wkfvw9d3da67x564ckjfi05zq1vddz";
|
||||
})
|
||||
# Correct libMarkdown dependency discovery: See https://github.com/lainsce/quilter/pull/170
|
||||
(fetchpatch {
|
||||
url = "https://github.com/lainsce/quilter/commit/8b1f3a60bd14cb86c1c62f9917c5f0c12bc4e459.patch";
|
||||
sha256 = "1kjc6ygf9yjvqfa4xhzxiava3338swp9wbjhpfaa3pyz3ayh188n";
|
||||
})
|
||||
# post_install script cleanups: See https://github.com/lainsce/quilter/pull/171
|
||||
(fetchpatch {
|
||||
url = "https://github.com/lainsce/quilter/commit/55bf3b10cd94fcc40b0867bbdb1931a09f577922.patch";
|
||||
sha256 = "1330amichaif2qfrh4qkxwqbcpr87ipik7vzjbjdm2bv3jz9353r";
|
||||
})
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
chmod +x meson/post_install.py
|
||||
patchShebangs meson/post_install.py
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Focus on your writing - designed for elementary OS";
|
||||
homepage = https://github.com/lainsce/quilter;
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ worldofpeace ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
43
pkgs/applications/editors/thonny/default.nix
Normal file
43
pkgs/applications/editors/thonny/default.nix
Normal file
|
@ -0,0 +1,43 @@
|
|||
{ stdenv, fetchFromBitbucket, python3 }:
|
||||
|
||||
with python3.pkgs;
|
||||
|
||||
buildPythonApplication rec {
|
||||
pname = "thonny";
|
||||
version = "3.0.0b3";
|
||||
|
||||
src = fetchFromBitbucket {
|
||||
owner = "plas";
|
||||
repo = pname;
|
||||
rev = "a511d4539c532b6dddf6d7f1586d30e1ac35bd86";
|
||||
sha256 = "1s3pp97r6p3j81idglnml4faxryk7saszxmv3gys1agdfj75qczr";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = with python3.pkgs; [ jedi pyserial tkinter docutils pylint ];
|
||||
|
||||
preInstall = ''
|
||||
export HOME=$(mktemp -d)
|
||||
'';
|
||||
|
||||
preFixup = ''
|
||||
wrapProgram "$out/bin/thonny" \
|
||||
--prefix PYTHONPATH : $PYTHONPATH:$(toPythonPath ${python3.pkgs.jedi})
|
||||
'';
|
||||
|
||||
# Tests need a DISPLAY
|
||||
doCheck = false;
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Python IDE for beginners";
|
||||
longDescription = ''
|
||||
Thonny is a Python IDE for beginners. It supports different ways
|
||||
of stepping through the code, step-by-step expression
|
||||
evaluation, detailed visualization of the call stack and a mode
|
||||
for explaining the concepts of references and heap.
|
||||
'';
|
||||
homepage = https://www.thonny.org/;
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ leenaars ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
|
@ -1,12 +1,12 @@
|
|||
{ lib, fetchFromGitHub }:
|
||||
rec {
|
||||
version = "8.1.0146";
|
||||
version = "8.1.0348";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "vim";
|
||||
repo = "vim";
|
||||
rev = "v${version}";
|
||||
sha256 = "1v33h08j15zii0ipw5py18ghsaxlbar0nyx365z1acjhk4vhn9nb";
|
||||
sha256 = "0f18kpywnph708mvj1fpi06qb53nbhc26ngjh2kvfxwawn63k8ab";
|
||||
};
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# This expression provides Python bindings to ImageMagick. Python libraries are supposed to be called via `python-packages.nix`.
|
||||
|
||||
{stdenv, fetchurl, python, boost, pkgconfig, imagemagick}:
|
||||
{ stdenv, fetchurl, python, pkgconfig, imagemagick, autoreconfHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "pythonmagick-${version}";
|
||||
|
@ -11,10 +11,18 @@ stdenv.mkDerivation rec {
|
|||
sha256 = "137278mfb5079lns2mmw73x8dhpzgwha53dyl00mmhj2z25varpn";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig ];
|
||||
buildInputs = [python boost imagemagick];
|
||||
postPatch = ''
|
||||
rm configure
|
||||
'';
|
||||
|
||||
meta = {
|
||||
configureFlags = [ "--with-boost=${python.pkgs.boost}" ];
|
||||
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
buildInputs = [ python python.pkgs.boost imagemagick ];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = http://www.imagemagick.org/script/api.php;
|
||||
license = licenses.imagemagick;
|
||||
description = "PythonMagick provides object oriented bindings for the ImageMagick Library.";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,29 +1,34 @@
|
|||
{ stdenv, fetchFromGitHub, libpng, python3, boost, libGLU_combined, qtbase, ncurses, cmake, flex, lemon }:
|
||||
{ stdenv, fetchFromGitHub, libpng, python3
|
||||
, libGLU_combined, qtbase, ncurses
|
||||
, cmake, flex, lemon
|
||||
}:
|
||||
|
||||
let
|
||||
gitRev = "020910c25614a3752383511ede5a1f5551a8bd39";
|
||||
gitBranch = "master";
|
||||
gitRev = "60a58688e552f12501980c4bdab034ab0f2ba059";
|
||||
gitBranch = "develop";
|
||||
gitTag = "0.9.3";
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
name = "antimony-${version}";
|
||||
version = gitTag;
|
||||
version = "2018-07-17";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "mkeeter";
|
||||
repo = "antimony";
|
||||
rev = gitTag;
|
||||
sha256 = "1vm5h5py8l3b8h4pbmm8s3wlxvlw492xfwnlwx0nvl0cjs8ba6r4";
|
||||
owner = "mkeeter";
|
||||
repo = "antimony";
|
||||
rev = gitRev;
|
||||
sha256 = "0pgf6kr23xw012xsil56j5gq78mlirmrlqdm09m5wlgcf4vr6xnl";
|
||||
};
|
||||
|
||||
patches = [ ./paths-fix.patch ];
|
||||
|
||||
postPatch = ''
|
||||
sed -i "s,/usr/local,$out,g" app/CMakeLists.txt app/app/app.cpp app/app/main.cpp
|
||||
sed -i "s,/usr/local,$out,g" \
|
||||
app/CMakeLists.txt app/app/app.cpp app/app/main.cpp
|
||||
sed -i "s,python-py35,python36," CMakeLists.txt
|
||||
'';
|
||||
|
||||
buildInputs = [
|
||||
libpng python3 (boost.override { python = python3; })
|
||||
libpng python3 python3.pkgs.boost
|
||||
libGLU_combined qtbase ncurses
|
||||
];
|
||||
|
||||
|
@ -41,6 +46,7 @@ in
|
|||
description = "A computer-aided design (CAD) tool from a parallel universe";
|
||||
homepage = "https://github.com/mkeeter/antimony";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [ rnhmjoj ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,29 +1,18 @@
|
|||
{ stdenv, fetchFromGitHub, fetchpatch, gnome3, meson, ninja, gettext, pkgconfig, libxml2, gtk3, hicolor-icon-theme, wrapGAppsHook }:
|
||||
{ stdenv, fetchFromGitLab, gnome3, meson, ninja, gettext, pkgconfig, libxml2, gtk3, hicolor-icon-theme, wrapGAppsHook }:
|
||||
|
||||
let
|
||||
version = "2.3";
|
||||
version = "2.3.1";
|
||||
in stdenv.mkDerivation {
|
||||
name = "gcolor3-${version}";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "hjdskes";
|
||||
src = fetchFromGitLab {
|
||||
domain = "gitlab.gnome.org";
|
||||
owner = "World";
|
||||
repo = "gcolor3";
|
||||
rev = "v${version}";
|
||||
sha256 = "186j72kwsqdcakvdik9jl18gz3csdj53j3ylwagr9gfwmy0nmyjb";
|
||||
sha256 = "10cfzlkflwkb7f51rnrxmgxpfryh1qzvqaydj6lffjq9zvnhigg7";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# Fix darwin build
|
||||
(fetchpatch {
|
||||
url = https://github.com/Hjdskes/gcolor3/commit/9130ffeff091fbafff6a0c8f06b09f54657d5dfd.patch;
|
||||
sha256 = "1kn5hx536wivafb4awg7lsa8h32njy0lynmn7ci9y78dlp54057r";
|
||||
})
|
||||
(fetchpatch {
|
||||
url = https://github.com/Hjdskes/gcolor3/commit/8d89081a8e13749f5a9051821114bc5fe814eaf3.patch;
|
||||
sha256 = "1ldyr84dl2g6anqkp2mpxsrcr41fcqwi6ck14rfhai7rgrm8yar3";
|
||||
})
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ meson ninja gettext pkgconfig libxml2 wrapGAppsHook ];
|
||||
|
||||
buildInputs = [ gtk3 hicolor-icon-theme ];
|
||||
|
@ -35,8 +24,8 @@ in stdenv.mkDerivation {
|
|||
|
||||
meta = with stdenv.lib; {
|
||||
description = "A simple color chooser written in GTK3";
|
||||
homepage = https://hjdskes.github.io/projects/gcolor3/;
|
||||
license = licenses.gpl2;
|
||||
homepage = https://www.hjdskes.nl/projects/gcolor3/;
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ jtojnar ];
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
|
|
|
@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
|
|||
homepage = https://github.com/eXeC64/imv;
|
||||
license = licenses.gpl2;
|
||||
maintainers = with maintainers; [ rnhmjoj ];
|
||||
platforms = [ "x86_64-linux" ];
|
||||
platforms = [ "i686-linux" "x86_64-linux" ];
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
, kguiaddons, ki18n, kitemmodels, kitemviews, kwindowsystem
|
||||
, kio, kcrash
|
||||
, boost, libraw, fftw, eigen, exiv2, libheif, lcms2, gsl, openexr, giflib
|
||||
, openjpeg, opencolorio, vc, poppler_qt5, curl, ilmbase
|
||||
, openjpeg, opencolorio, vc, poppler, curl, ilmbase
|
||||
, qtmultimedia, qtx11extras
|
||||
, python3
|
||||
}:
|
||||
|
@ -23,7 +23,7 @@ mkDerivation rec {
|
|||
karchive kconfig kwidgetsaddons kcompletion kcoreaddons kguiaddons
|
||||
ki18n kitemmodels kitemviews kwindowsystem kio kcrash
|
||||
boost libraw fftw eigen exiv2 lcms2 gsl openexr libheif giflib
|
||||
openjpeg opencolorio poppler_qt5 curl ilmbase
|
||||
openjpeg opencolorio poppler curl ilmbase
|
||||
qtmultimedia qtx11extras
|
||||
python3
|
||||
] ++ lib.optional (stdenv.hostPlatform.isi686 || stdenv.hostPlatform.isx86_64) vc;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{ stdenv, fetchFromGitHub, pkgconfig, cmake, qtbase, qttools, qtx11extras, poppler_qt5 }:
|
||||
{ stdenv, fetchFromGitHub, pkgconfig, cmake, qtbase, qttools, qtx11extras, poppler }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "qcomicbook-${version}";
|
||||
|
@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
|
|||
];
|
||||
|
||||
buildInputs = [
|
||||
qtbase qttools qtx11extras poppler_qt5
|
||||
qtbase qttools qtx11extras poppler
|
||||
];
|
||||
|
||||
postInstall = ''
|
||||
|
|
|
@ -1 +1 @@
|
|||
WGET_ARGS=( https://download.kde.org/stable/applications/18.08.0/ -A '*.tar.xz' )
|
||||
WGET_ARGS=( https://download.kde.org/stable/applications/18.08.1/ -A '*.tar.xz' )
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5,12 +5,12 @@
|
|||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "3.30.0";
|
||||
version = "3.31.0";
|
||||
name = "calibre-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://download.calibre-ebook.com/${version}/${name}.tar.xz";
|
||||
sha256 = "0j7w63kniqnpr8v1aldzbim2dyrk79n23mzw9y56jqd0k47m8zfz";
|
||||
sha256 = "1xg1bx0klvrywqry5rhci37fr7shpvb2wbx4bva20vhqkal169rw";
|
||||
};
|
||||
|
||||
patches = [
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "dbeaver-ce-${version}";
|
||||
version = "5.1.6";
|
||||
version = "5.2.0";
|
||||
|
||||
desktopItem = makeDesktopItem {
|
||||
name = "dbeaver";
|
||||
|
@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
|
|||
|
||||
src = fetchurl {
|
||||
url = "https://dbeaver.io/files/${version}/dbeaver-ce-${version}-linux.gtk.x86_64.tar.gz";
|
||||
sha256 = "1zypadnyhinm6mfv91s7zs2s55bhzgkqhl6ai6x3yqwhvayc02nn";
|
||||
sha256 = "13j2qc4g24d2gmkxj9zpqrcbai9aq8rassrq3c9mp9ir6sf4q0jf";
|
||||
};
|
||||
|
||||
installPhase = ''
|
||||
|
|
|
@ -1,12 +1,24 @@
|
|||
{ stdenv, fetchurl, python3, python3Packages, zbar }:
|
||||
|
||||
let
|
||||
qdarkstyle = python3Packages.buildPythonPackage rec {
|
||||
pname = "QDarkStyle";
|
||||
version = "2.5.4";
|
||||
src = python3Packages.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "1w715m1i5pycfqcpkrggpn0rs9cakx6cm5v8rggcxnf4p0i0kdiy";
|
||||
};
|
||||
doCheck = false; # no tests
|
||||
};
|
||||
in
|
||||
|
||||
python3Packages.buildPythonApplication rec {
|
||||
name = "electrum-${version}";
|
||||
version = "3.1.3";
|
||||
version = "3.2.3";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://download.electrum.org/${version}/Electrum-${version}.tar.gz";
|
||||
sha256 = "05m28yd3zr9awjhaqikf4rg08j5i4ygm750ip1z27wl446sysniy";
|
||||
sha256 = "022iw4cq0c009wvqn7wd815jc0nv8198lq3cawn8h6c28hw2mhs1";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
|
@ -17,12 +29,14 @@ python3Packages.buildPythonApplication rec {
|
|||
pbkdf2
|
||||
protobuf
|
||||
pyaes
|
||||
pycrypto
|
||||
pycryptodomex
|
||||
pyqt5
|
||||
pysocks
|
||||
qdarkstyle
|
||||
qrcode
|
||||
requests
|
||||
tlslite
|
||||
typing
|
||||
|
||||
# plugins
|
||||
keepkey
|
||||
|
@ -35,10 +49,10 @@ python3Packages.buildPythonApplication rec {
|
|||
|
||||
preBuild = ''
|
||||
sed -i 's,usr_share = .*,usr_share = "'$out'/share",g' setup.py
|
||||
pyrcc5 icons.qrc -o gui/qt/icons_rc.py
|
||||
pyrcc5 icons.qrc -o electrum/gui/qt/icons_rc.py
|
||||
# Recording the creation timestamps introduces indeterminism to the build
|
||||
sed -i '/Created: .*/d' gui/qt/icons_rc.py
|
||||
sed -i "s|name = 'libzbar.*'|name='${zbar}/lib/libzbar.so'|" lib/qrscanner.py
|
||||
sed -i '/Created: .*/d' electrum/gui/qt/icons_rc.py
|
||||
sed -i "s|name = 'libzbar.*'|name='${zbar}/lib/libzbar.so'|" electrum/qrscanner.py
|
||||
'';
|
||||
|
||||
postInstall = ''
|
||||
|
|
|
@ -1,24 +1,14 @@
|
|||
{ stdenv, fetchurl, writeScript, fetchFromGitHub
|
||||
{ stdenv, fetchgit, fetchurl, writeScript
|
||||
, libGL, libX11, libXext, python3, libXrandr, libXrender, libpulseaudio, libXcomposite
|
||||
, enableGlfw ? false, glfw }:
|
||||
|
||||
let
|
||||
inherit (stdenv.lib) optional makeLibraryPath;
|
||||
|
||||
version = "1.4.5";
|
||||
gladVersion = "0.1.24";
|
||||
# glad
|
||||
# https://github.com/wacossusca34/glava/issues/46#issuecomment-397816520
|
||||
glad = fetchFromGitHub {
|
||||
owner = "Dav1dde";
|
||||
repo = "glad";
|
||||
rev = "v${gladVersion}";
|
||||
sha256 = "0s2c9w064kqa5i07w8zmvgpg1pa3wj86l1nhgw7w56cjhq7cf8h8";
|
||||
};
|
||||
# gl.xml
|
||||
gl = fetchurl {
|
||||
url = https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry/a24f3f7a4c924fdbc666024f99c70e5b8e34c819/xml/gl.xml;
|
||||
sha256 = "1mskxjmhb35m8qv255pibf633d8sn1w9rdsf0lj75bhlgy0zi5c7";
|
||||
url = https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry/56312cfe680e4be5ae61bbf1c628e420f8731718/xml/gl.xml;
|
||||
sha256 = "1c45bcgaxiic5gmb3gkrd9qcvascvij97vz5y6fc3a2y7x3gjc5l";
|
||||
};
|
||||
# EGL 1.5
|
||||
egl = fetchurl {
|
||||
|
@ -43,12 +33,12 @@ let
|
|||
in
|
||||
stdenv.mkDerivation rec {
|
||||
name = "glava-${version}";
|
||||
version = "1.5.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "wacossusca34";
|
||||
repo = "glava";
|
||||
src = fetchgit {
|
||||
url = "https://github.com/wacossusca34/glava.git";
|
||||
rev = "v${version}";
|
||||
sha256 = "1zfw8samrzxxbny709rcdz1z77cw1cd46wlfnf7my02kipmqn0nr";
|
||||
sha256 = "1k8x0a0g2pm7ficsk4az9s7mjbm85a987apjg5c4y6iyldxgd6sb";
|
||||
};
|
||||
|
||||
buildInputs = [
|
||||
|
@ -65,7 +55,6 @@ in
|
|||
];
|
||||
|
||||
patchPhase = ''
|
||||
cp -r --no-preserve=all ${glad}/* glad
|
||||
mkdir -p glad/include/KHR
|
||||
|
||||
cp ${gl} glad/gl.xml
|
||||
|
|
47
pkgs/applications/misc/notejot/default.nix
Normal file
47
pkgs/applications/misc/notejot/default.nix
Normal file
|
@ -0,0 +1,47 @@
|
|||
{ stdenv, fetchFromGitHub, vala, pkgconfig, meson, ninja, python3, granite
|
||||
, gtk3, gnome3, gtksourceview, json-glib, gobjectIntrospection, wrapGAppsHook }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "notejot";
|
||||
version = "1.4.5";
|
||||
|
||||
name = "${pname}-${version}";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "lainsce";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "0mjig4y2rb6v2dyzya44mfz0dxgp5wnjs3kdavf9ha2jzjjr5xyb";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
gobjectIntrospection
|
||||
meson
|
||||
ninja
|
||||
pkgconfig
|
||||
python3
|
||||
vala
|
||||
wrapGAppsHook
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
gnome3.libgee
|
||||
granite
|
||||
gtk3
|
||||
gtksourceview
|
||||
json-glib
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
chmod +x meson/post_install.py
|
||||
patchShebangs meson/post_install.py
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Stupidly-simple sticky notes applet";
|
||||
homepage = https://github.com/lainsce/notejot;
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ worldofpeace ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
|
@ -7,13 +7,13 @@ assert imagePreviewSupport -> w3m != null;
|
|||
|
||||
python3Packages.buildPythonApplication rec {
|
||||
name = "ranger-${version}";
|
||||
version = "1.9.1";
|
||||
version = "1.9.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ranger";
|
||||
repo = "ranger";
|
||||
rev = "v${version}";
|
||||
sha256= "1zhds37j1scxa9b183qbrjwxqldrdk581c5xiy81vg17sndb1kqj";
|
||||
sha256= "1ws6g8z1m1hfp8bv4msvbaa9f7948p687jmc8h69yib4jkv3qyax";
|
||||
};
|
||||
|
||||
checkInputs = with python3Packages; [ pytest ];
|
||||
|
@ -51,6 +51,6 @@ python3Packages.buildPythonApplication rec {
|
|||
homepage = http://ranger.github.io/;
|
||||
license = licenses.gpl3;
|
||||
platforms = platforms.unix;
|
||||
maintainers = [ maintainers.magnetophon ];
|
||||
maintainers = [ maintainers.toonn maintainers.magnetophon ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
|
||||
let
|
||||
version = "0.6.0";
|
||||
version = "0.6.2";
|
||||
sqlGda = libgda.override {
|
||||
mysqlSupport = true;
|
||||
postgresSupport = true;
|
||||
|
@ -17,7 +17,7 @@ in stdenv.mkDerivation rec {
|
|||
owner = "Alecaddd";
|
||||
repo = "sequeler";
|
||||
rev = "v${version}";
|
||||
sha256 = "04x3fg665201g3zy66sicfna4vac4n1pmrahbra90gvfzaia1cai";
|
||||
sha256 = "0j5z3z34jc1acclmlkjpv7fcs4f2gf0bcfnvcpn3zdzw9fzj0sw7";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ meson ninja pkgconfig vala gobjectIntrospection gettext wrapGAppsHook python3 desktop-file-utils ];
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue