Merge remote-tracking branch 'upstream/master' into hardened-stdenv

This commit is contained in:
Robin Gloster 2016-06-10 09:27:04 +00:00
commit 8031cba2ab
1116 changed files with 79612 additions and 24052 deletions

View File

@ -1,7 +1,14 @@
language: python matrix:
python: "3.4" allow_failures:
- os: osx
include:
- os: linux
language: generic
sudo: required sudo: required
dist: trusty dist: trusty
- os: osx
language: generic
osx_image: xcode7.3
before_install: ./maintainers/scripts/travis-nox-review-pr.sh nix before_install: ./maintainers/scripts/travis-nox-review-pr.sh nix
install: ./maintainers/scripts/travis-nox-review-pr.sh nox install: ./maintainers/scripts/travis-nox-review-pr.sh nox
script: ./maintainers/scripts/travis-nox-review-pr.sh build script: ./maintainers/scripts/travis-nox-review-pr.sh build

View File

@ -11,6 +11,7 @@
abaldeau = "Andreas Baldeau <andreas@baldeau.net>"; abaldeau = "Andreas Baldeau <andreas@baldeau.net>";
abbradar = "Nikolay Amiantov <ab@fmap.me>"; abbradar = "Nikolay Amiantov <ab@fmap.me>";
aboseley = "Adam Boseley <adam.boseley@gmail.com>"; aboseley = "Adam Boseley <adam.boseley@gmail.com>";
abuibrahim = "Ruslan Babayev <ruslan@babayev.com>";
adev = "Adrien Devresse <adev@adev.name>"; adev = "Adrien Devresse <adev@adev.name>";
Adjective-Object = "Maxwell Huang-Hobbs <mhuan13@gmail.com>"; Adjective-Object = "Maxwell Huang-Hobbs <mhuan13@gmail.com>";
adnelson = "Allen Nelson <ithinkican@gmail.com>"; adnelson = "Allen Nelson <ithinkican@gmail.com>";
@ -74,6 +75,8 @@
chaoflow = "Florian Friesdorf <flo@chaoflow.net>"; chaoflow = "Florian Friesdorf <flo@chaoflow.net>";
chattered = "Phil Scott <me@philscotted.com>"; chattered = "Phil Scott <me@philscotted.com>";
choochootrain = "Hurshal Patel <hurshal@imap.cc>"; choochootrain = "Hurshal Patel <hurshal@imap.cc>";
chris-martin = "Chris Martin <ch.martin@gmail.com>";
chrisjefferson = "Christopher Jefferson <chris@bubblescope.net>";
christopherpoole = "Christopher Mark Poole <mail@christopherpoole.net>"; christopherpoole = "Christopher Mark Poole <mail@christopherpoole.net>";
cleverca22 = "Michael Bishop <cleverca22@gmail.com>"; cleverca22 = "Michael Bishop <cleverca22@gmail.com>";
cmcdragonkai = "Roger Qiu <roger.qiu@matrix.ai>"; cmcdragonkai = "Roger Qiu <roger.qiu@matrix.ai>";
@ -238,6 +241,7 @@
meisternu = "Matt Miemiec <meister@krutt.org>"; meisternu = "Matt Miemiec <meister@krutt.org>";
michaelpj = "Michael Peyton Jones <michaelpj@gmail.com>"; michaelpj = "Michael Peyton Jones <michaelpj@gmail.com>";
michelk = "Michel Kuhlmann <michel@kuhlmanns.info>"; michelk = "Michel Kuhlmann <michel@kuhlmanns.info>";
mimadrid = "Miguel Madrid <mimadrid@ucm.es>";
mingchuan = "Ming Chuan <ming@culpring.com>"; mingchuan = "Ming Chuan <ming@culpring.com>";
mirdhyn = "Merlin Gaillard <mirdhyn@gmail.com>"; mirdhyn = "Merlin Gaillard <mirdhyn@gmail.com>";
mirrexagon = "Andrew Abbott <mirrexagon@mirrexagon.com>"; mirrexagon = "Andrew Abbott <mirrexagon@mirrexagon.com>";

View File

@ -554,12 +554,10 @@ rec {
apply = x: use (toOf config); apply = x: use (toOf config);
}); });
config = { config = {
/*
warnings = warnings =
let opt = getAttrFromPath from options; in let opt = getAttrFromPath from options; in
optional (warn && opt.isDefined) optional (warn && opt.isDefined)
"The option `${showOption from}' defined in ${showFiles opt.files} has been renamed to `${showOption to}'."; "The option `${showOption from}' defined in ${showFiles opt.files} has been renamed to `${showOption to}'.";
*/
} // setAttrByPath to (mkAliasDefinitions (getAttrFromPath from options)); } // setAttrByPath to (mkAliasDefinitions (getAttrFromPath from options));
}; };

View File

@ -4,6 +4,11 @@ let lib = import ./default.nix; in
rec { rec {
# Returns the type of a path: regular (for file), symlink, or directory
pathType = p: with builtins; getAttr (baseNameOf p) (readDir (dirOf p));
# Returns true if the path exists and is a directory, false otherwise
pathIsDirectory = p: if builtins.pathExists p then (pathType p) == "directory" else false;
# Bring in a path as a source, filtering out all Subversion and CVS # Bring in a path as a source, filtering out all Subversion and CVS
# directories, as well as backup files (*~). # directories, as well as backup files (*~).
@ -29,6 +34,7 @@ rec {
in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts; in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts;
in builtins.filterSource filter path; in builtins.filterSource filter path;
# Get the commit id of a git repo # Get the commit id of a git repo
# Example: commitIdFromGitRepo <nixpkgs/.git> # Example: commitIdFromGitRepo <nixpkgs/.git>
commitIdFromGitRepo = commitIdFromGitRepo =

View File

@ -13,28 +13,36 @@ if [[ $1 == nix ]]; then
sudo mkdir /etc/nix sudo mkdir /etc/nix
sudo sh -c 'echo "build-max-jobs = 4" > /etc/nix/nix.conf' sudo sh -c 'echo "build-max-jobs = 4" > /etc/nix/nix.conf'
# Nix builds in /tmp and we need exec support
sudo mount
sudo mount -o remount,exec /run
# Verify evaluation # Verify evaluation
echo "=== Verifying that nixpkgs evaluates..." echo "=== Verifying that nixpkgs evaluates..."
nix-env -f. -qa --json >/dev/null nix-env -f. -qa --json >/dev/null
elif [[ $1 == nox ]]; then elif [[ $1 == nox ]]; then
source $HOME/.nix-profile/etc/profile.d/nix.sh
echo "=== Installing nox..." echo "=== Installing nox..."
git clone -q https://github.com/madjar/nox nix-build -A nox '<nixpkgs>' --show-trace
pip --quiet install -e nox
elif [[ $1 == build ]]; then elif [[ $1 == build ]]; then
source $HOME/.nix-profile/etc/profile.d/nix.sh source $HOME/.nix-profile/etc/profile.d/nix.sh
if [[ $TRAVIS_OS_NAME == "osx" ]]; then
echo "Skipping NixOS things on darwin"
else
echo "=== Checking NixOS options" echo "=== Checking NixOS options"
nix-build nixos/release.nix -A options nix-build nixos/release.nix -A options --show-trace
echo "=== Checking tarball creation" echo "=== Checking tarball creation"
nix-build pkgs/top-level/release.nix -A tarball nix-build pkgs/top-level/release.nix -A tarball --show-trace
fi
if [[ $TRAVIS_PULL_REQUEST == false ]]; then if [[ $TRAVIS_PULL_REQUEST == false ]]; then
echo "=== Not a pull request" echo "=== Not a pull request"
else else
echo "=== Checking PR" echo "=== Checking PR"
if ! nox-review pr ${TRAVIS_PULL_REQUEST}; then if ! nix-shell -p nox --run "nox-review pr ${TRAVIS_PULL_REQUEST}"; then
if sudo dmesg | egrep 'Out of memory|Killed process' > /tmp/oom-log; then if sudo dmesg | egrep 'Out of memory|Killed process' > /tmp/oom-log; then
echo "=== The build failed due to running out of memory:" echo "=== The build failed due to running out of memory:"
cat /tmp/oom-log cat /tmp/oom-log

View File

@ -21,7 +21,7 @@ Alternatively, you can use a systemd unit that does the same in the
background: background:
<screen> <screen>
$ systemctl start nix-gc.service # systemctl start nix-gc.service
</screen> </screen>
You can tell NixOS in <filename>configuration.nix</filename> to run You can tell NixOS in <filename>configuration.nix</filename> to run

View File

@ -13,7 +13,7 @@ create</literal>, it gets it own private IPv4 address in the range
address as follows: address as follows:
<screen> <screen>
$ nixos-container show-ip foo # nixos-container show-ip foo
10.233.4.2 10.233.4.2
$ ping -c1 10.233.4.2 $ ping -c1 10.233.4.2

View File

@ -11,7 +11,7 @@
identifier <literal>foo</literal> as follows: identifier <literal>foo</literal> as follows:
<screen> <screen>
$ nixos-container create foo # nixos-container create foo
</screen> </screen>
This creates the containers root directory in This creates the containers root directory in
@ -25,7 +25,7 @@ line. For instance, to create a container that has
<literal>root</literal>: <literal>root</literal>:
<screen> <screen>
$ nixos-container create foo --config 'services.openssh.enable = true; \ # nixos-container create foo --config 'services.openssh.enable = true; \
users.extraUsers.root.openssh.authorizedKeys.keys = ["ssh-dss AAAAB3N…"];' users.extraUsers.root.openssh.authorizedKeys.keys = ["ssh-dss AAAAB3N…"];'
</screen> </screen>
@ -35,7 +35,7 @@ $ nixos-container create foo --config 'services.openssh.enable = true; \
run: run:
<screen> <screen>
$ nixos-container start foo # nixos-container start foo
</screen> </screen>
This command will return as soon as the container has booted and has This command will return as soon as the container has booted and has
@ -46,7 +46,7 @@ Thus, if something went wrong, you can get status info using
<command>systemctl</command>: <command>systemctl</command>:
<screen> <screen>
$ systemctl status container@foo # systemctl status container@foo
</screen> </screen>
</para> </para>
@ -55,7 +55,7 @@ $ systemctl status container@foo
root using the <command>root-login</command> operation: root using the <command>root-login</command> operation:
<screen> <screen>
$ nixos-container root-login foo # nixos-container root-login foo
[root@foo:~]# [root@foo:~]#
</screen> </screen>
@ -65,7 +65,7 @@ authentication). You can also get a regular login prompt using the
the host: the host:
<screen> <screen>
$ nixos-container login foo # nixos-container login foo
foo login: alice foo login: alice
Password: *** Password: ***
</screen> </screen>
@ -74,7 +74,7 @@ With <command>nixos-container run</command>, you can execute arbitrary
commands in the container: commands in the container:
<screen> <screen>
$ nixos-container run foo -- uname -a # nixos-container run foo -- uname -a
Linux foo 3.4.82 #1-NixOS SMP Thu Mar 20 14:44:05 UTC 2014 x86_64 GNU/Linux Linux foo 3.4.82 #1-NixOS SMP Thu Mar 20 14:44:05 UTC 2014 x86_64 GNU/Linux
</screen> </screen>
@ -86,17 +86,17 @@ container. First, on the host, you can edit
and run and run
<screen> <screen>
$ nixos-container update foo # nixos-container update foo
</screen> </screen>
This will build and activate the new configuration. You can also This will build and activate the new configuration. You can also
specify a new configuration on the command line: specify a new configuration on the command line:
<screen> <screen>
$ nixos-container update foo --config 'services.httpd.enable = true; \ # nixos-container update foo --config 'services.httpd.enable = true; \
services.httpd.adminAddr = "foo@example.org";' services.httpd.adminAddr = "foo@example.org";'
$ curl http://$(nixos-container show-ip foo)/ # curl http://$(nixos-container show-ip foo)/
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">… &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">…
</screen> </screen>
@ -116,7 +116,7 @@ start</literal>, respectively, or by using
destroy a container, including its file system, do destroy a container, including its file system, do
<screen> <screen>
$ nixos-container destroy foo # nixos-container destroy foo
</screen> </screen>
</para> </para>

View File

@ -9,7 +9,7 @@
<para>You can enter rescue mode by running: <para>You can enter rescue mode by running:
<screen> <screen>
$ systemctl rescue</screen> # systemctl rescue</screen>
This will eventually give you a single-user root shell. Systemd will This will eventually give you a single-user root shell. Systemd will
stop (almost) all system services. To get out of maintenance mode, stop (almost) all system services. To get out of maintenance mode,

View File

@ -18,14 +18,14 @@ You can disable the use of the binary cache by adding <option>--option
use-binary-caches false</option>, e.g. use-binary-caches false</option>, e.g.
<screen> <screen>
$ nixos-rebuild switch --option use-binary-caches false # nixos-rebuild switch --option use-binary-caches false
</screen> </screen>
If you have an alternative binary cache at your disposal, you can use If you have an alternative binary cache at your disposal, you can use
it instead: it instead:
<screen> <screen>
$ nixos-rebuild switch --option binary-caches http://my-cache.example.org/ # nixos-rebuild switch --option binary-caches http://my-cache.example.org/
</screen> </screen>
</para> </para>

View File

@ -10,7 +10,7 @@
doing: doing:
<screen> <screen>
$ shutdown # shutdown
</screen> </screen>
This is equivalent to running <command>systemctl This is equivalent to running <command>systemctl
@ -19,7 +19,7 @@ poweroff</command>.</para>
<para>To reboot the system, run <para>To reboot the system, run
<screen> <screen>
$ reboot # reboot
</screen> </screen>
which is equivalent to <command>systemctl reboot</command>. which is equivalent to <command>systemctl reboot</command>.
@ -28,7 +28,7 @@ Alternatively, you can quickly reboot the system using
the new kernel into memory: the new kernel into memory:
<screen> <screen>
$ systemctl kexec # systemctl kexec
</screen> </screen>
</para> </para>

View File

@ -19,7 +19,7 @@ fails to boot. After the system has booted, you can make the selected
configuration the default for subsequent boots: configuration the default for subsequent boots:
<screen> <screen>
$ /run/current-system/bin/switch-to-configuration boot</screen> # /run/current-system/bin/switch-to-configuration boot</screen>
</para> </para>
@ -27,12 +27,12 @@ $ /run/current-system/bin/switch-to-configuration boot</screen>
system: system:
<screen> <screen>
$ nixos-rebuild switch --rollback</screen> # nixos-rebuild switch --rollback</screen>
This is equivalent to running: This is equivalent to running:
<screen> <screen>
$ /nix/var/nix/profiles/system-<replaceable>N</replaceable>-link/bin/switch-to-configuration switch</screen> # /nix/var/nix/profiles/system-<replaceable>N</replaceable>-link/bin/switch-to-configuration switch</screen>
where <replaceable>N</replaceable> is the number of the NixOS system where <replaceable>N</replaceable> is the number of the NixOS system
configuration. To get a list of the available configurations, do: configuration. To get a list of the available configurations, do:

View File

@ -66,9 +66,9 @@ messages from the service.
<para>Units can be stopped, started or restarted: <para>Units can be stopped, started or restarted:
<screen> <screen>
$ systemctl stop postgresql.service # systemctl stop postgresql.service
$ systemctl start postgresql.service # systemctl start postgresql.service
$ systemctl restart postgresql.service # systemctl restart postgresql.service
</screen> </screen>
These operations are synchronous: they wait until the service has These operations are synchronous: they wait until the service has

View File

@ -18,7 +18,7 @@ you may be able to fix it automatically.</para>
system configuration, you can fix it by doing system configuration, you can fix it by doing
<screen> <screen>
$ nixos-rebuild switch --repair # nixos-rebuild switch --repair
</screen> </screen>
This will cause Nix to check every path in the closure, and if its This will cause Nix to check every path in the closure, and if its
@ -28,7 +28,7 @@ the path is rebuilt or redownloaded.</para>
<para>You can also scan the entire Nix store for corrupt paths: <para>You can also scan the entire Nix store for corrupt paths:
<screen> <screen>
$ nix-store --verify --check-contents --repair # nix-store --verify --check-contents --repair
</screen> </screen>
Any corrupt paths will be redownloaded if theyre available in a Any corrupt paths will be redownloaded if theyre available in a

View File

@ -45,7 +45,7 @@ track of this, you can terminate a session in a way that ensures that
all the sessions processes are gone: all the sessions processes are gone:
<screen> <screen>
$ loginctl terminate-session c3 # loginctl terminate-session c3
</screen> </screen>
</para> </para>

View File

@ -31,7 +31,7 @@ and you run <command>nixos-rebuild</command>, specifying your own
Nixpkgs tree: Nixpkgs tree:
<screen> <screen>
$ nixos-rebuild switch -I nixpkgs=/path/to/my/nixpkgs</screen> # nixos-rebuild switch -I nixpkgs=/path/to/my/nixpkgs</screen>
</para> </para>

View File

@ -82,7 +82,7 @@ $ nix-shell '<nixpkgs>' -A linuxPackages.kernel
$ unpackPhase $ unpackPhase
$ cd linux-* $ cd linux-*
$ make -C $dev/lib/modules/*/build M=$(pwd)/drivers/net/ethernet/mellanox modules $ make -C $dev/lib/modules/*/build M=$(pwd)/drivers/net/ethernet/mellanox modules
$ sudo insmod ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko # insmod ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko
]]></screen> ]]></screen>
</section> </section>

View File

@ -12,7 +12,7 @@ here is how you create an encrypted Ext4 file system on the device
<filename>/dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d</filename>: <filename>/dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d</filename>:
<screen> <screen>
$ cryptsetup luksFormat /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d # cryptsetup luksFormat /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d
WARNING! WARNING!
======== ========
@ -22,10 +22,10 @@ Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: *** Enter LUKS passphrase: ***
Verify passphrase: *** Verify passphrase: ***
$ cryptsetup luksOpen /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d crypted # cryptsetup luksOpen /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d crypted
Enter passphrase for /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d: *** Enter passphrase for /dev/disk/by-uuid/3f6b0024-3a44-4fde-a43a-767b872abe5d: ***
$ mkfs.ext4 /dev/mapper/crypted # mkfs.ext4 /dev/mapper/crypted
</screen> </screen>
To ensure that this file system is automatically mounted at boot time To ensure that this file system is automatically mounted at boot time

View File

@ -63,14 +63,14 @@ commands such as <command>useradd</command>,
account named <literal>alice</literal>: account named <literal>alice</literal>:
<screen> <screen>
$ useradd -m alice</screen> # useradd -m alice</screen>
To make all nix tools available to this new user use `su - USER` which To make all nix tools available to this new user use `su - USER` which
opens a login shell (==shell that loads the profile) for given user. opens a login shell (==shell that loads the profile) for given user.
This will create the ~/.nix-defexpr symlink. So run: This will create the ~/.nix-defexpr symlink. So run:
<screen> <screen>
$ su - alice -c "true"</screen> # su - alice -c "true"</screen>
The flag <option>-m</option> causes the creation of a home directory The flag <option>-m</option> causes the creation of a home directory
@ -79,7 +79,7 @@ have an initial password and therefore cannot log in. A password can
be set using the <command>passwd</command> utility: be set using the <command>passwd</command> utility:
<screen> <screen>
$ passwd alice # passwd alice
Enter new UNIX password: *** Enter new UNIX password: ***
Retype new UNIX password: *** Retype new UNIX password: ***
</screen> </screen>
@ -87,7 +87,7 @@ Retype new UNIX password: ***
A user can be deleted using <command>userdel</command>: A user can be deleted using <command>userdel</command>:
<screen> <screen>
$ userdel -r alice</screen> # userdel -r alice</screen>
The flag <option>-r</option> deletes the users home directory. The flag <option>-r</option> deletes the users home directory.
Accounts can be modified using <command>usermod</command>. Unix Accounts can be modified using <command>usermod</command>. Unix

View File

@ -41,13 +41,13 @@ If you are using WPA2 the <command>wpa_passphrase</command> tool might be useful
to generate the <literal>wpa_supplicant.conf</literal>. to generate the <literal>wpa_supplicant.conf</literal>.
<screen> <screen>
$ wpa_passphrase ESSID PSK > /etc/wpa_supplicant.conf</screen> # wpa_passphrase ESSID PSK > /etc/wpa_supplicant.conf</screen>
After you have edited the <literal>wpa_supplicant.conf</literal>, After you have edited the <literal>wpa_supplicant.conf</literal>,
you need to restart the wpa_supplicant service. you need to restart the wpa_supplicant service.
<screen> <screen>
$ systemctl restart wpa_supplicant.service</screen> # systemctl restart wpa_supplicant.service</screen>
</para> </para>
</section> </section>

View File

@ -48,7 +48,7 @@ services.xserver.autorun = false;
</programlisting> </programlisting>
The X server can then be started manually: The X server can then be started manually:
<screen> <screen>
$ systemctl start display-manager.service # systemctl start display-manager.service
</screen> </screen>
</para> </para>
@ -115,5 +115,14 @@ services.xserver.synaptics.twoFingerScroll = true;
</simplesect> </simplesect>
<simplesect><title>GTK/Qt themes</title>
<para>GTK themes can be installed either to user profile or system-wide (via
<literal>system.environmentPackages</literal>). To make Qt 5 applications look similar
to GTK2 ones, you can install <literal>qt5.qtbase.gtk</literal> package into your
system environment. It should work for all Qt 5 library versions.
</para>
</simplesect>
</chapter> </chapter>

View File

@ -25,7 +25,7 @@ $ nix-build -A config.system.build.isoImage -I nixos-config=modules/installer/cd
suggested by the following command: suggested by the following command:
<screen> <screen>
$ mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso</screen> # mount -o loop -t iso9660 ./result/iso/cd.iso /mnt/iso</screen>
</para> </para>

View File

@ -94,8 +94,8 @@ $ nix-build -A 'config.systemd.units."httpd.service".unit'
<screen> <screen>
$ cp $(nix-build -A 'config.systemd.units."httpd.service".unit')/httpd.service \ $ cp $(nix-build -A 'config.systemd.units."httpd.service".unit')/httpd.service \
/run/systemd/system/tmp-httpd.service /run/systemd/system/tmp-httpd.service
$ systemctl daemon-reload # systemctl daemon-reload
$ systemctl start tmp-httpd.service # systemctl start tmp-httpd.service
</screen> </screen>
Note that the unit must not have the same name as any unit in Note that the unit must not have the same name as any unit in

View File

@ -70,7 +70,7 @@ sources, you need to tell <command>nixos-rebuild</command> about them
using the <option>-I</option> flag: using the <option>-I</option> flag:
<screen> <screen>
$ nixos-rebuild switch -I nixpkgs=<replaceable>/my/sources</replaceable>/nixpkgs # nixos-rebuild switch -I nixpkgs=<replaceable>/my/sources</replaceable>/nixpkgs
</screen> </screen>
</para> </para>

View File

@ -12,14 +12,14 @@ properly:
<screen> <screen>
$ nix-build -A config.system.build.nixos-install $ nix-build -A config.system.build.nixos-install
$ mount -t tmpfs none /mnt # mount -t tmpfs none /mnt
$ ./result/bin/nixos-install</screen> # ./result/bin/nixos-install</screen>
To start a login shell in the new NixOS installation in To start a login shell in the new NixOS installation in
<filename>/mnt</filename>: <filename>/mnt</filename>:
<screen> <screen>
$ ./result/bin/nixos-install --chroot # ./result/bin/nixos-install --chroot
</screen> </screen>
</para> </para>

View File

@ -10,7 +10,7 @@ contains the current configuration of your machine. Whenever youve
changed something to that file, you should do changed something to that file, you should do
<screen> <screen>
$ nixos-rebuild switch</screen> # nixos-rebuild switch</screen>
to build the new configuration, make it the default configuration for to build the new configuration, make it the default configuration for
booting, and try to realise the configuration in the running system booting, and try to realise the configuration in the running system
@ -23,7 +23,7 @@ either run them from a root shell or by prefixing them with
<para>You can also do <para>You can also do
<screen> <screen>
$ nixos-rebuild test</screen> # nixos-rebuild test</screen>
to build the configuration and switch the running system to it, but to build the configuration and switch the running system to it, but
without making it the boot default. So if (say) the configuration without making it the boot default. So if (say) the configuration
@ -33,7 +33,7 @@ configuration.</para>
<para>There is also <para>There is also
<screen> <screen>
$ nixos-rebuild boot</screen> # nixos-rebuild boot</screen>
to build the configuration and make it the boot default, but not to build the configuration and make it the boot default, but not
switch to it now (so it will only take effect after the next switch to it now (so it will only take effect after the next
@ -44,7 +44,7 @@ of the GRUB 2 boot screen by giving it a different <emphasis>profile
name</emphasis>, e.g. name</emphasis>, e.g.
<screen> <screen>
$ nixos-rebuild switch -p test </screen> # nixos-rebuild switch -p test </screen>
which causes the new configuration (and previous ones created using which causes the new configuration (and previous ones created using
<literal>-p test</literal>) to show up in the GRUB submenu “NixOS - <literal>-p test</literal>) to show up in the GRUB submenu “NixOS -

View File

@ -26,7 +26,7 @@ changes:
<literal>vfat</literal> filesystem.</para> <literal>vfat</literal> filesystem.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>You must set <option>boot.loader.gummiboot.enable</option> to <para>You must set <option>boot.loader.systemd-boot.enable</option> to
<literal>true</literal>. <command>nixos-generate-config</command> <literal>true</literal>. <command>nixos-generate-config</command>
should do this automatically for new configurations when booted in should do this automatically for new configurations when booted in
UEFI mode.</para> UEFI mode.</para>
@ -38,7 +38,7 @@ changes:
</listitem> </listitem>
<listitem> <listitem>
<para>You may want to look at the options starting with <para>You may want to look at the options starting with
<option>boot.loader.efi</option> and <option>boot.loader.gummiboot</option> <option>boot.loader.efi</option> and <option>boot.loader.systemd-boot</option>
as well.</para> as well.</para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>

View File

@ -54,7 +54,7 @@
changes. For example: changes. For example:
<screen> <screen>
$ mkfs.ext4 -L nixos /dev/sda1</screen> # mkfs.ext4 -L nixos /dev/sda1</screen>
</para></listitem> </para></listitem>
@ -66,10 +66,10 @@ $ mkfs.ext4 -L nixos /dev/sda1</screen>
<listitem><para>For creating LVM volumes, the LVM commands, e.g., <listitem><para>For creating LVM volumes, the LVM commands, e.g.,
<screen> <screen>
$ pvcreate /dev/sda1 /dev/sdb1 # pvcreate /dev/sda1 /dev/sdb1
$ vgcreate MyVolGroup /dev/sda1 /dev/sdb1 # vgcreate MyVolGroup /dev/sda1 /dev/sdb1
$ lvcreate --size 2G --name bigdisk MyVolGroup # lvcreate --size 2G --name bigdisk MyVolGroup
$ lvcreate --size 1G --name smalldisk MyVolGroup</screen> # lvcreate --size 1G --name smalldisk MyVolGroup</screen>
</para></listitem> </para></listitem>
@ -84,7 +84,7 @@ $ lvcreate --size 1G --name smalldisk MyVolGroup</screen>
be installed on <filename>/mnt</filename>, e.g. be installed on <filename>/mnt</filename>, e.g.
<screen> <screen>
$ mount /dev/disk/by-label/nixos /mnt # mount /dev/disk/by-label/nixos /mnt
</screen> </screen>
</para></listitem> </para></listitem>
@ -113,14 +113,14 @@ $ mount /dev/disk/by-label/nixos /mnt
generate an initial configuration file for you: generate an initial configuration file for you:
<screen> <screen>
$ nixos-generate-config --root /mnt</screen> # nixos-generate-config --root /mnt</screen>
You should then edit You should then edit
<filename>/mnt/etc/nixos/configuration.nix</filename> to suit your <filename>/mnt/etc/nixos/configuration.nix</filename> to suit your
needs: needs:
<screen> <screen>
$ nano /mnt/etc/nixos/configuration.nix # nano /mnt/etc/nixos/configuration.nix
</screen> </screen>
If youre using the graphical ISO image, other editors may be If youre using the graphical ISO image, other editors may be
@ -162,7 +162,7 @@ $ nano /mnt/etc/nixos/configuration.nix
<listitem><para>Do the installation: <listitem><para>Do the installation:
<screen> <screen>
$ nixos-install</screen> # nixos-install</screen>
Cross fingers. If this fails due to a temporary problem (such as Cross fingers. If this fails due to a temporary problem (such as
a network issue while downloading binaries from the NixOS binary a network issue while downloading binaries from the NixOS binary
@ -186,7 +186,7 @@ Retype new UNIX password: ***
<listitem><para>If everything went well: <listitem><para>If everything went well:
<screen> <screen>
$ reboot</screen> # reboot</screen>
</para></listitem> </para></listitem>
@ -235,15 +235,15 @@ drive (here <filename>/dev/sda</filename>). <xref linkend="ex-config"
<example xml:id='ex-install-sequence'><title>Commands for Installing NixOS on <filename>/dev/sda</filename></title> <example xml:id='ex-install-sequence'><title>Commands for Installing NixOS on <filename>/dev/sda</filename></title>
<screen> <screen>
$ fdisk /dev/sda # <lineannotation>(or whatever device you want to install on)</lineannotation> # fdisk /dev/sda # <lineannotation>(or whatever device you want to install on)</lineannotation>
$ mkfs.ext4 -L nixos /dev/sda1 # mkfs.ext4 -L nixos /dev/sda1
$ mkswap -L swap /dev/sda2 # mkswap -L swap /dev/sda2
$ swapon /dev/sda2 # swapon /dev/sda2
$ mount /dev/disk/by-label/nixos /mnt # mount /dev/disk/by-label/nixos /mnt
$ nixos-generate-config --root /mnt # nixos-generate-config --root /mnt
$ nano /mnt/etc/nixos/configuration.nix # nano /mnt/etc/nixos/configuration.nix
$ nixos-install # nixos-install
$ reboot</screen> # reboot</screen>
</example> </example>
<example xml:id='ex-config'><title>NixOS Configuration</title> <example xml:id='ex-config'><title>NixOS Configuration</title>

View File

@ -60,33 +60,33 @@ the <literal>nixos-14.12</literal> channel. To see which NixOS
channel youre subscribed to, run the following as root: channel youre subscribed to, run the following as root:
<screen> <screen>
$ nix-channel --list | grep nixos # nix-channel --list | grep nixos
nixos https://nixos.org/channels/nixos-unstable nixos https://nixos.org/channels/nixos-unstable
</screen> </screen>
To switch to a different NixOS channel, do To switch to a different NixOS channel, do
<screen> <screen>
$ nix-channel --add https://nixos.org/channels/<replaceable>channel-name</replaceable> nixos # nix-channel --add https://nixos.org/channels/<replaceable>channel-name</replaceable> nixos
</screen> </screen>
(Be sure to include the <literal>nixos</literal> parameter at the (Be sure to include the <literal>nixos</literal> parameter at the
end.) For instance, to use the NixOS 14.12 stable channel: end.) For instance, to use the NixOS 14.12 stable channel:
<screen> <screen>
$ nix-channel --add https://nixos.org/channels/nixos-14.12 nixos # nix-channel --add https://nixos.org/channels/nixos-14.12 nixos
</screen> </screen>
If you have a server, you may want to use the “small” channel instead: If you have a server, you may want to use the “small” channel instead:
<screen> <screen>
$ nix-channel --add https://nixos.org/channels/nixos-14.12-small nixos # nix-channel --add https://nixos.org/channels/nixos-14.12-small nixos
</screen> </screen>
And if you want to live on the bleeding edge: And if you want to live on the bleeding edge:
<screen> <screen>
$ nix-channel --add https://nixos.org/channels/nixos-unstable nixos # nix-channel --add https://nixos.org/channels/nixos-unstable nixos
</screen> </screen>
</para> </para>
@ -95,7 +95,7 @@ $ nix-channel --add https://nixos.org/channels/nixos-unstable nixos
channel by running channel by running
<screen> <screen>
$ nixos-rebuild switch --upgrade # nixos-rebuild switch --upgrade
</screen> </screen>
which is equivalent to the more verbose <literal>nix-channel --update which is equivalent to the more verbose <literal>nix-channel --update

View File

@ -26,6 +26,9 @@
xlink:href="https://github.com/NixOS/nixpkgs/issues">NixOS GitHub xlink:href="https://github.com/NixOS/nixpkgs/issues">NixOS GitHub
issue tracker</link>.</para> issue tracker</link>.</para>
<note><para>Commands prefixed with <literal>#</literal> have to be run as
root, either requiring to login as root user or temporarily switching
to it using <literal>sudo</literal> for example.</para></note>
</preface> </preface>
<xi:include href="installation/installation.xml" /> <xi:include href="installation/installation.xml" />

View File

@ -11,6 +11,7 @@
<xsl:output method='xml' encoding="UTF-8" /> <xsl:output method='xml' encoding="UTF-8" />
<xsl:param name="revision" /> <xsl:param name="revision" />
<xsl:param name="program" />
<xsl:template match="/expr/list"> <xsl:template match="/expr/list">
@ -188,7 +189,7 @@
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:when> </xsl:when>
<xsl:when test="$revision != 'local' and contains(@value, 'nixops') and contains(@value, '/nix/')"> <xsl:when test="$revision != 'local' and $program = 'nixops' and contains(@value, '/nix/')">
<xsl:attribute name="xlink:href">https://github.com/NixOS/nixops/blob/<xsl:value-of select="$revision"/>/nix/<xsl:value-of select="substring-after(@value, '/nix/')"/></xsl:attribute> <xsl:attribute name="xlink:href">https://github.com/NixOS/nixops/blob/<xsl:value-of select="$revision"/>/nix/<xsl:value-of select="substring-after(@value, '/nix/')"/></xsl:attribute>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>

View File

@ -16,6 +16,10 @@ has the following highlights: </para>
See <xref linkend="sec-booting-from-pxe" /> for documentation.</para> See <xref linkend="sec-booting-from-pxe" /> for documentation.</para>
</listitem> </listitem>
<listitem>
<para>Xorg-server-1.18.*. If you choose <literal>"ati_unfree"</literal> driver,
1.17.* is still used due to ABI incompatibility.</para>
</listitem>
</itemizedlist> </itemizedlist>
<para>The following new services were added since the last release:</para> <para>The following new services were added since the last release:</para>

View File

@ -18,6 +18,8 @@ in
config = mkIf enabled { config = mkIf enabled {
nixpkgs.config.xorg.fglrxCompat = true;
services.xserver.drivers = singleton services.xserver.drivers = singleton
{ name = "fglrx"; modules = [ ati_x11 ]; libPath = [ "${ati_x11}/lib" ]; }; { name = "fglrx"; modules = [ ati_x11 ]; libPath = [ "${ati_x11}/lib" ]; };

View File

@ -64,7 +64,7 @@ let
# The EFI boot image. # The EFI boot image.
efiDir = pkgs.runCommand "efi-directory" {} '' efiDir = pkgs.runCommand "efi-directory" {} ''
mkdir -p $out/EFI/boot mkdir -p $out/EFI/boot
cp -v ${pkgs.gummiboot}/lib/gummiboot/gummiboot${targetArch}.efi $out/EFI/boot/boot${targetArch}.efi cp -v ${pkgs.systemd}/lib/systemd/boot/efi/systemd-boot${targetArch}.efi $out/EFI/boot/boot${targetArch}.efi
mkdir -p $out/loader/entries mkdir -p $out/loader/entries
echo "title NixOS Live CD" > $out/loader/entries/nixos-livecd.conf echo "title NixOS Live CD" > $out/loader/entries/nixos-livecd.conf

View File

@ -518,8 +518,8 @@ if ($showHardwareConfig) {
my $bootLoaderConfig = ""; my $bootLoaderConfig = "";
if (-e "/sys/firmware/efi/efivars") { if (-e "/sys/firmware/efi/efivars") {
$bootLoaderConfig = <<EOF; $bootLoaderConfig = <<EOF;
# Use the gummiboot efi boot loader. # Use the systemd-boot EFI boot loader.
boot.loader.gummiboot.enable = true; boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
EOF EOF
} elsif ($virt ne "systemd-nspawn") { } elsif ($virt ne "systemd-nspawn") {

View File

@ -104,8 +104,8 @@ in
# changing them would not rebuild the manual # changing them would not rebuild the manual
nixosLabel = mkDefault (maybeEnv "NIXOS_LABEL" cfg.nixosVersion); nixosLabel = mkDefault (maybeEnv "NIXOS_LABEL" cfg.nixosVersion);
nixosVersion = mkDefault (maybeEnv "NIXOS_VERSION" (cfg.nixosRelease + cfg.nixosVersionSuffix)); nixosVersion = mkDefault (maybeEnv "NIXOS_VERSION" (cfg.nixosRelease + cfg.nixosVersionSuffix));
nixosRevision = mkIf (pathExists gitRepo) (mkDefault gitCommitId); nixosRevision = mkIf (pathIsDirectory gitRepo) (mkDefault gitCommitId);
nixosVersionSuffix = mkIf (pathExists gitRepo) (mkDefault (".git." + gitCommitId)); nixosVersionSuffix = mkIf (pathIsDirectory gitRepo) (mkDefault (".git." + gitCommitId));
# Note: code names must only increase in alphabetical order. # Note: code names must only increase in alphabetical order.
nixosCodeName = "Flounder"; nixosCodeName = "Flounder";

View File

@ -79,6 +79,7 @@
./programs/ssh.nix ./programs/ssh.nix
./programs/ssmtp.nix ./programs/ssmtp.nix
./programs/tmux.nix ./programs/tmux.nix
./programs/unity3d.nix
./programs/venus.nix ./programs/venus.nix
./programs/wvdial.nix ./programs/wvdial.nix
./programs/xfs_quota.nix ./programs/xfs_quota.nix
@ -127,6 +128,7 @@
./services/continuous-integration/jenkins/default.nix ./services/continuous-integration/jenkins/default.nix
./services/continuous-integration/jenkins/slave.nix ./services/continuous-integration/jenkins/slave.nix
./services/continuous-integration/jenkins/job-builder.nix ./services/continuous-integration/jenkins/job-builder.nix
./services/continuous-integration/hydra/default.nix
./services/databases/4store-endpoint.nix ./services/databases/4store-endpoint.nix
./services/databases/4store.nix ./services/databases/4store.nix
./services/databases/couchdb.nix ./services/databases/couchdb.nix
@ -428,6 +430,7 @@
./services/security/haveged.nix ./services/security/haveged.nix
./services/security/hologram.nix ./services/security/hologram.nix
./services/security/munge.nix ./services/security/munge.nix
./services/security/oauth2_proxy.nix
./services/security/physlock.nix ./services/security/physlock.nix
./services/security/torify.nix ./services/security/torify.nix
./services/security/tor.nix ./services/security/tor.nix
@ -503,10 +506,10 @@
./system/boot/loader/grub/grub.nix ./system/boot/loader/grub/grub.nix
./system/boot/loader/grub/ipxe.nix ./system/boot/loader/grub/ipxe.nix
./system/boot/loader/grub/memtest.nix ./system/boot/loader/grub/memtest.nix
./system/boot/loader/gummiboot/gummiboot.nix
./system/boot/loader/init-script/init-script.nix ./system/boot/loader/init-script/init-script.nix
./system/boot/loader/loader.nix ./system/boot/loader/loader.nix
./system/boot/loader/raspberrypi/raspberrypi.nix ./system/boot/loader/raspberrypi/raspberrypi.nix
./system/boot/loader/systemd-boot/systemd-boot.nix
./system/boot/luksroot.nix ./system/boot/luksroot.nix
./system/boot/modprobe.nix ./system/boot/modprobe.nix
./system/boot/networkd.nix ./system/boot/networkd.nix

View File

@ -0,0 +1,25 @@
{ config, lib, pkgs, ... }:
with lib;
let cfg = config.programs.unity3d;
in {
options = {
programs.unity3d.enable = mkEnableOption "Unity3D, a game development tool";
};
config = mkIf cfg.enable {
security.setuidOwners = [{
program = "unity-chrome-sandbox";
source = "${pkgs.unity3d.sandbox}/bin/unity-chrome-sandbox";
owner = "root";
#group = "root";
setuid = true;
#setgid = true;
}];
environment.systemPackages = [ pkgs.unity3d ];
};
}

View File

@ -114,6 +114,19 @@ in
''; '';
}; };
preliminarySelfsigned = mkOption {
type = types.bool;
default = true;
description = ''
Whether a preliminary self-signed certificate should be generated before
doing ACME requests. This can be useful when certificates are required in
a webserver, but ACME needs the webserver to make its requests.
With preliminary self-signed certificate the webserver can be started and
can later reload the correct ACME certificates.
'';
};
certs = mkOption { certs = mkOption {
default = { }; default = { };
type = types.loaOf types.optionSet; type = types.loaOf types.optionSet;
@ -140,7 +153,10 @@ in
config = mkMerge [ config = mkMerge [
(mkIf (cfg.certs != { }) { (mkIf (cfg.certs != { }) {
systemd.services = flip mapAttrs' cfg.certs (cert: data: systemd.services = let
services = concatLists servicesLists;
servicesLists = mapAttrsToList certToServices cfg.certs;
certToServices = cert: data:
let let
cpath = "${cfg.directory}/${cert}"; cpath = "${cfg.directory}/${cert}";
rights = if data.allowKeysForGroup then "750" else "700"; rights = if data.allowKeysForGroup then "750" else "700";
@ -148,10 +164,7 @@ in
++ optionals (data.email != null) [ "--email" data.email ] ++ optionals (data.email != null) [ "--email" data.email ]
++ concatMap (p: [ "-f" p ]) data.plugins ++ concatMap (p: [ "-f" p ]) data.plugins
++ concatLists (mapAttrsToList (name: root: [ "-d" (if root == null then name else "${name}:${root}")]) data.extraDomains); ++ concatLists (mapAttrsToList (name: root: [ "-d" (if root == null then name else "${name}:${root}")]) data.extraDomains);
acmeService = {
in nameValuePair
("acme-${cert}")
({
description = "Renew ACME Certificate for ${cert}"; description = "Renew ACME Certificate for ${cert}";
after = [ "network.target" ]; after = [ "network.target" ];
serviceConfig = { serviceConfig = {
@ -186,8 +199,80 @@ in
${data.postRun} ${data.postRun}
fi fi
''; '';
})
before = [ "acme-certificates.target" ];
wantedBy = [ "acme-certificates.target" ];
};
selfsignedService = {
description = "Create preliminary self-signed certificate for ${cert}";
preStart = ''
if [ ! -d '${cpath}' ]
then
mkdir -p '${cpath}'
chmod ${rights} '${cpath}'
chown '${data.user}:${data.group}' '${cpath}'
fi
'';
script =
''
# Create self-signed key
workdir="/run/acme-selfsigned-${cert}"
${pkgs.openssl.bin}/bin/openssl genrsa -des3 -passout pass:x -out $workdir/server.pass.key 2048
${pkgs.openssl.bin}/bin/openssl rsa -passin pass:x -in $workdir/server.pass.key -out $workdir/server.key
${pkgs.openssl.bin}/bin/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"
${pkgs.openssl.bin}/bin/openssl x509 -req -days 1 -in $workdir/server.csr -signkey $workdir/server.key -out $workdir/server.crt
# Move key to destination
mv $workdir/server.key ${cpath}/key.pem
mv $workdir/server.crt ${cpath}/fullchain.pem
# Clean up working directory
rm $workdir/server.csr
rm $workdir/server.pass.key
# Give key acme permissions
chmod ${rights} '${cpath}/key.pem'
chown '${data.user}:${data.group}' '${cpath}/key.pem'
chmod ${rights} '${cpath}/fullchain.pem'
chown '${data.user}:${data.group}' '${cpath}/fullchain.pem'
'';
serviceConfig = {
Type = "oneshot";
RuntimeDirectory = "acme-selfsigned-${cert}";
PermissionsStartOnly = true;
User = data.user;
Group = data.group;
};
unitConfig = {
# Do not create self-signed key when key already exists
ConditionPathExists = "!${cpath}/key.pem";
};
before = [
"acme-selfsigned-certificates.target"
];
wantedBy = [
"acme-selfsigned-certificates.target"
];
};
in (
[ { name = "acme-${cert}"; value = acmeService; } ]
++
(if cfg.preliminarySelfsigned
then [ { name = "acme-selfsigned-${cert}"; value = selfsignedService; } ]
else []
)
); );
servicesAttr = listToAttrs services;
nginxAttr = {
nginx = {
after = [ "acme-selfsigned-certificates.target" ];
wants = [ "acme-selfsigned-certificates.target" "acme-certificates.target" ];
};
};
in
servicesAttr //
(if config.services.nginx.enable then nginxAttr else {});
systemd.timers = flip mapAttrs' cfg.certs (cert: data: nameValuePair systemd.timers = flip mapAttrs' cfg.certs (cert: data: nameValuePair
("acme-${cert}") ("acme-${cert}")
@ -200,6 +285,9 @@ in
}; };
}) })
); );
systemd.targets."acme-selfsigned-certificates" = mkIf cfg.preliminarySelfsigned {};
systemd.targets."acme-certificates" = {};
}) })
{ meta.maintainers = with lib.maintainers; [ abbradar fpletz globin ]; { meta.maintainers = with lib.maintainers; [ abbradar fpletz globin ];

View File

@ -66,4 +66,32 @@ options for the <literal>security.acme</literal> module.</para>
</section> </section>
<section><title>Using ACME certificates in Nginx</title>
<para>In practice ACME is mostly used for retrieval and renewal of
certificates that will be used in a webserver like Nginx. A configuration for
Nginx that uses the certificates from ACME for
<literal>foo.example.com</literal> will look similar to:
</para>
<programlisting>
services.nginx.httpConfig = ''
server {
server_name foo.example.com;
listen 443 ssl;
ssl_certificate ${config.security.acme.directory}/foo.example.com/fullchain.pem;
ssl_certificate_key ${config.security.acme.directory}/foo.example.com/key.pem;
root /var/www/foo.example.com/;
}
'';
</programlisting>
<para>Now Nginx will try to use the certificates that will be retrieved by ACME.
ACME needs Nginx (or any other webserver) to function and Nginx needs
the certificates to actually start. For this reason the ACME module
automatically generates self-signed certificates that will be used by Nginx to
start. After that Nginx is used by ACME to retrieve the actual ACME
certificates. <literal>security.acme.preliminarySelfsigned</literal> can be
used to control whether to generate the self-signed certificates.
</para>
</section>
</chapter> </chapter>

View File

@ -0,0 +1,418 @@
{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.services.hydra;
baseDir = "/var/lib/hydra";
hydraConf = pkgs.writeScript "hydra.conf" cfg.extraConfig;
hydraEnv =
{ HYDRA_DBI = cfg.dbi;
HYDRA_CONFIG = "${baseDir}/hydra.conf";
HYDRA_DATA = "${baseDir}";
};
env =
{ NIX_REMOTE = "daemon";
SSL_CERT_FILE = "/etc/ssl/certs/ca-certificates.crt"; # Remove in 16.03
PGPASSFILE = "${baseDir}/pgpass";
NIX_REMOTE_SYSTEMS = concatStringsSep ":" cfg.buildMachinesFiles;
} // optionalAttrs (cfg.smtpHost != null) {
EMAIL_SENDER_TRANSPORT = "SMTP";
EMAIL_SENDER_TRANSPORT_host = cfg.smtpHost;
} // hydraEnv // cfg.extraEnv;
serverEnv = env //
{ HYDRA_TRACKER = cfg.tracker;
COLUMNS = "80";
PGPASSFILE = "${baseDir}/pgpass-www"; # grrr
} // (optionalAttrs cfg.debugServer { DBIC_TRACE = "1"; });
localDB = "dbi:Pg:dbname=hydra;user=hydra;";
haveLocalDB = cfg.dbi == localDB;
in
{
###### interface
options = {
services.hydra = rec {
enable = mkOption {
type = types.bool;
default = false;
description = ''
Whether to run Hydra services.
'';
};
dbi = mkOption {
type = types.str;
default = localDB;
example = "dbi:Pg:dbname=hydra;host=postgres.example.org;user=foo;";
description = ''
The DBI string for Hydra database connection.
'';
};
package = mkOption {
type = types.path;
default = pkgs.hydra;
defaultText = "pkgs.hydra";
description = "The Hydra package.";
};
hydraURL = mkOption {
type = types.str;
description = ''
The base URL for the Hydra webserver instance. Used for links in emails.
'';
};
listenHost = mkOption {
type = types.str;
default = "*";
example = "localhost";
description = ''
The hostname or address to listen on or <literal>*</literal> to listen
on all interfaces.
'';
};
port = mkOption {
type = types.int;
default = 3000;
description = ''
TCP port the web server should listen to.
'';
};
minimumDiskFree = mkOption {
type = types.int;
default = 0;
description = ''
Threshold of minimum disk space (GiB) to determine if the queue runner should run or not.
'';
};
minimumDiskFreeEvaluator = mkOption {
type = types.int;
default = 0;
description = ''
Threshold of minimum disk space (GiB) to determine if the evaluator should run or not.
'';
};
notificationSender = mkOption {
type = types.str;
description = ''
Sender email address used for email notifications.
'';
};
smtpHost = mkOption {
type = types.nullOr types.str;
default = null;
example = ["localhost"];
description = ''
Hostname of the SMTP server to use to send email.
'';
};
tracker = mkOption {
type = types.str;
default = "";
description = ''
Piece of HTML that is included on all pages.
'';
};
logo = mkOption {
type = types.nullOr types.path;
default = null;
description = ''
Path to a file containing the logo of your Hydra instance.
'';
};
debugServer = mkOption {
type = types.bool;
default = false;
description = "Whether to run the server in debug mode.";
};
extraConfig = mkOption {
type = types.lines;
description = "Extra lines for the Hydra configuration.";
};
extraEnv = mkOption {
type = types.attrsOf types.str;
default = {};
description = "Extra environment variables for Hydra.";
};
gcRootsDir = mkOption {
type = types.path;
default = "/nix/var/nix/gcroots/hydra";
description = "Directory that holds Hydra garbage collector roots.";
};
buildMachinesFiles = mkOption {
type = types.listOf types.path;
default = [];
example = [ "/etc/nix/machines" "/var/lib/hydra/provisioner/machines" ];
description = "List of files containing build machines.";
};
useSubstitutes = mkOption {
type = types.bool;
default = false;
description = ''
Whether to use binary caches for downloading store paths. Note that
binary substitutions trigger (a potentially large number of) additional
HTTP requests that slow down the queue monitor thread significantly.
Also, this Hydra instance will serve those downloaded store paths to
its users with its own signature attached as if it had built them
itself, so don't enable this feature unless your active binary caches
are absolute trustworthy.
'';
};
};
};
###### implementation
config = mkIf cfg.enable {
users.extraGroups.hydra = { };
users.extraUsers.hydra =
{ description = "Hydra";
group = "hydra";
createHome = true;
home = baseDir;
useDefaultShell = true;
};
users.extraUsers.hydra-queue-runner =
{ description = "Hydra queue runner";
group = "hydra";
useDefaultShell = true;
home = "${baseDir}/queue-runner"; # really only to keep SSH happy
};
users.extraUsers.hydra-www =
{ description = "Hydra web server";
group = "hydra";
useDefaultShell = true;
};
nix.trustedUsers = [ "hydra-queue-runner" ];
services.hydra.extraConfig =
''
using_frontend_proxy 1
base_uri ${cfg.hydraURL}
notification_sender ${cfg.notificationSender}
max_servers 25
${optionalString (cfg.logo != null) ''
hydra_logo ${cfg.logo}
''}
gc_roots_dir ${cfg.gcRootsDir}
'';
environment.systemPackages = [ cfg.package ];
environment.variables = hydraEnv;
nix.extraOptions = ''
gc-keep-outputs = true
gc-keep-derivations = true
# The default (`true') slows Nix down a lot since the build farm
# has so many GC roots.
gc-check-reachability = false
'';
systemd.services.hydra-init =
{ wantedBy = [ "multi-user.target" ];
requires = optional haveLocalDB "postgresql.service";
after = optional haveLocalDB "postgresql.service";
environment = env;
preStart = ''
mkdir -p ${baseDir}
chown hydra.hydra ${baseDir}
chmod 0750 ${baseDir}
ln -sf ${hydraConf} ${baseDir}/hydra.conf
mkdir -m 0700 -p ${baseDir}/www
chown hydra-www.hydra ${baseDir}/www
mkdir -m 0700 -p ${baseDir}/queue-runner
mkdir -m 0750 -p ${baseDir}/build-logs
chown hydra-queue-runner.hydra ${baseDir}/queue-runner ${baseDir}/build-logs
${optionalString haveLocalDB ''
if ! [ -e ${baseDir}/.db-created ]; then
${config.services.postgresql.package}/bin/createuser hydra
${config.services.postgresql.package}/bin/createdb -O hydra hydra
touch ${baseDir}/.db-created
fi
''}
if [ ! -e ${cfg.gcRootsDir} ]; then
# Move legacy roots directory.
if [ -e /nix/var/nix/gcroots/per-user/hydra/hydra-roots ]; then
mv /nix/var/nix/gcroots/per-user/hydra/hydra-roots ${cfg.gcRootsDir}
fi
mkdir -p ${cfg.gcRootsDir}
fi
# Move legacy hydra-www roots.
if [ -e /nix/var/nix/gcroots/per-user/hydra-www/hydra-roots ]; then
find /nix/var/nix/gcroots/per-user/hydra-www/hydra-roots/ -type f \
| xargs -r mv -f -t ${cfg.gcRootsDir}/
rmdir /nix/var/nix/gcroots/per-user/hydra-www/hydra-roots
fi
chown hydra.hydra ${cfg.gcRootsDir}
chmod 2775 ${cfg.gcRootsDir}
'';
serviceConfig.ExecStart = "${cfg.package}/bin/hydra-init";
serviceConfig.PermissionsStartOnly = true;
serviceConfig.User = "hydra";
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
};
systemd.services.hydra-server =
{ wantedBy = [ "multi-user.target" ];
requires = [ "hydra-init.service" ];
after = [ "hydra-init.service" ];
environment = serverEnv;
serviceConfig =
{ ExecStart =
"@${cfg.package}/bin/hydra-server hydra-server -f -h '${cfg.listenHost}' "
+ "-p ${toString cfg.port} --max_spare_servers 5 --max_servers 25 "
+ "--max_requests 100 ${optionalString cfg.debugServer "-d"}";
User = "hydra-www";
PermissionsStartOnly = true;
Restart = "always";
};
};
systemd.services.hydra-queue-runner =
{ wantedBy = [ "multi-user.target" ];
requires = [ "hydra-init.service" ];
after = [ "hydra-init.service" "network.target" ];
path = [ cfg.package pkgs.nettools pkgs.openssh pkgs.bzip2 config.nix.package ];
environment = env // {
PGPASSFILE = "${baseDir}/pgpass-queue-runner"; # grrr
IN_SYSTEMD = "1"; # to get log severity levels
};
serviceConfig =
{ ExecStart = "@${cfg.package}/bin/hydra-queue-runner hydra-queue-runner -v --option build-use-substitutes ${if cfg.useSubstitutes then "true" else "false"}";
ExecStopPost = "${cfg.package}/bin/hydra-queue-runner --unlock";
User = "hydra-queue-runner";
Restart = "always";
# Ensure we can get core dumps.
LimitCORE = "infinity";
WorkingDirectory = "${baseDir}/queue-runner";
};
};
systemd.services.hydra-evaluator =
{ wantedBy = [ "multi-user.target" ];
requires = [ "hydra-init.service" ];
after = [ "hydra-init.service" "network.target" ];
path = [ pkgs.nettools ];
environment = env;
serviceConfig =
{ ExecStart = "@${cfg.package}/bin/hydra-evaluator hydra-evaluator";
User = "hydra";
Restart = "always";
WorkingDirectory = baseDir;
};
};
systemd.services.hydra-update-gc-roots =
{ requires = [ "hydra-init.service" ];
after = [ "hydra-init.service" ];
environment = env;
serviceConfig =
{ ExecStart = "@${cfg.package}/bin/hydra-update-gc-roots hydra-update-gc-roots";
User = "hydra";
};
startAt = "2,14:15";
};
systemd.services.hydra-send-stats =
{ wantedBy = [ "multi-user.target" ];
after = [ "hydra-init.service" ];
environment = env;
serviceConfig =
{ ExecStart = "@${cfg.package}/bin/hydra-send-stats hydra-send-stats";
User = "hydra";
};
};
# If there is less than a certain amount of free disk space, stop
# the queue/evaluator to prevent builds from failing or aborting.
systemd.services.hydra-check-space =
{ script =
''
if [ $(($(stat -f -c '%a' /nix/store) * $(stat -f -c '%S' /nix/store))) -lt $((${toString cfg.minimumDiskFree} * 1024**3)) ]; then
echo "stopping Hydra queue runner due to lack of free space..."
systemctl stop hydra-queue-runner
fi
if [ $(($(stat -f -c '%a' /nix/store) * $(stat -f -c '%S' /nix/store))) -lt $((${toString cfg.minimumDiskFreeEvaluator} * 1024**3)) ]; then
echo "stopping Hydra evaluator due to lack of free space..."
systemctl stop hydra-evaluator
fi
'';
startAt = "*:0/5";
};
# Periodically compress build logs. The queue runner compresses
# logs automatically after a step finishes, but this doesn't work
# if the queue runner is stopped prematurely.
systemd.services.hydra-compress-logs =
{ path = [ pkgs.bzip2 ];
script =
''
find /var/lib/hydra/build-logs -type f -name "*.drv" -mtime +3 -size +0c | xargs -r bzip2 -v -f
'';
startAt = "Sun 01:45";
};
services.postgresql.enable = mkIf haveLocalDB true;
services.postgresql.identMap = optionalString haveLocalDB
''
hydra-users hydra hydra
hydra-users hydra-queue-runner hydra
hydra-users hydra-www hydra
hydra-users root hydra
'';
services.postgresql.authentication = optionalString haveLocalDB
''
local hydra all ident map=hydra-users
'';
};
}

View File

@ -52,11 +52,12 @@ in
description = " description = "
sldapd.conf configuration sldapd.conf configuration
"; ";
example = '' example = literalExample ''
include ''${pkgs.openldap}/etc/openldap/schema/core.schema '''
include ''${pkgs.openldap}/etc/openldap/schema/cosine.schema include ${pkgs.openldap.out}/etc/openldap/schema/core.schema
include ''${pkgs.openldap}/etc/openldap/schema/inetorgperson.schema include ${pkgs.openldap.out}/etc/openldap/schema/cosine.schema
include ''${pkgs.openldap}/etc/openldap/schema/nis.schema include ${pkgs.openldap.out}/etc/openldap/schema/inetorgperson.schema
include ${pkgs.openldap.out}/etc/openldap/schema/nis.schema
database bdb database bdb
suffix dc=example,dc=org suffix dc=example,dc=org
@ -64,6 +65,7 @@ in
# NOTE: change after first start # NOTE: change after first start
rootpw secret rootpw secret
directory /var/db/openldap directory /var/db/openldap
'''
''; '';
}; };
}; };

View File

@ -1,28 +1,50 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let
cfgFile = pkgs.writeText "reader.conf" "";
in
with lib; with lib;
{ let
cfgFile = pkgs.writeText "reader.conf" config.services.pcscd.readerConfig;
pluginEnv = pkgs.buildEnv {
name = "pcscd-plugins";
paths = map (p: "${p}/pcsc/drivers") config.services.pcscd.plugins;
};
in {
###### interface ###### interface
options = { options = {
services.pcscd = { services.pcscd = {
enable = mkEnableOption "PCSC-Lite daemon";
enable = mkOption { plugins = mkOption {
default = false; type = types.listOf types.package;
description = "Whether to enable the PCSC-Lite daemon."; default = [ pkgs.ccid ];
defaultText = "[ pkgs.ccid ]";
example = literalExample "[ pkgs.pcsc-cyberjack ]";
description = "Plugin packages to be used for PCSC-Lite.";
}; };
}; readerConfig = mkOption {
type = types.lines;
default = "";
example = ''
FRIENDLYNAME "Some serial reader"
DEVICENAME /dev/ttyS0
LIBPATH /path/to/serial_reader.so
CHANNELID 1
'';
description = ''
Configuration for devices that aren't hotpluggable.
See <citerefentry><refentrytitle>reader.conf</refentrytitle>
<manvolnum>5</manvolnum></citerefentry> for valid options.
'';
};
};
}; };
###### implementation ###### implementation
@ -37,18 +59,11 @@ with lib;
systemd.services.pcscd = { systemd.services.pcscd = {
description = "PCSC-Lite daemon"; description = "PCSC-Lite daemon";
preStart = '' environment.PCSCLITE_HP_DROPDIR = pluginEnv;
mkdir -p /var/lib/pcsc
rm -Rf /var/lib/pcsc/drivers
ln -s ${pkgs.ccid}/pcsc/drivers /var/lib/pcsc/
'';
serviceConfig = { serviceConfig = {
Type = "forking"; ExecStart = "${pkgs.pcsclite}/sbin/pcscd -f -x -c ${cfgFile}";
ExecStart = "${pkgs.pcsclite}/sbin/pcscd --auto-exit -c ${cfgFile}"; ExecReload = "${pkgs.pcsclite}/sbin/pcscd -H";
ExecReload = "${pkgs.pcsclite}/sbin/pcscd --hotplug";
}; };
}; };
}; };
} }

View File

@ -89,8 +89,8 @@ in
''; '';
example = literalExample "${pkgs.dnscrypt-proxy}/share/dnscrypt-proxy/dnscrypt-resolvers.csv"; example = literalExample "${pkgs.dnscrypt-proxy}/share/dnscrypt-proxy/dnscrypt-resolvers.csv";
default = pkgs.fetchurl { default = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/jedisct1/dnscrypt-proxy/master/dnscrypt-resolvers.csv"; url = https://raw.githubusercontent.com/jedisct1/dnscrypt-proxy/master/dnscrypt-resolvers.csv;
sha256 = "0lac20qhcgjxxiiz8jzcn3hkqj4ywl58hahp5n2i6vf9akfyqp7c"; sha256 = "171zvdqcqqvcw3zr7wl9h1wmdmk6m3h55xr4gq2z1j7a0x0ba2in";
}; };
defaultText = "pkgs.fetchurl { url = ...; sha256 = ...; }"; defaultText = "pkgs.fetchurl { url = ...; sha256 = ...; }";
}; };

View File

@ -29,21 +29,27 @@ let
done done
${cfg.up} ${cfg.up}
${optionalString cfg.updateResolvConf
"${pkgs.update-resolv-conf}/libexec/openvpn/update-resolv-conf"}
''; '';
downScript = '' downScript = ''
#! /bin/sh #! /bin/sh
export PATH=${path} export PATH=${path}
${optionalString cfg.updateResolvConf
"${pkgs.update-resolv-conf}/libexec/openvpn/update-resolv-conf"}
${cfg.down} ${cfg.down}
''; '';
configFile = pkgs.writeText "openvpn-config-${name}" configFile = pkgs.writeText "openvpn-config-${name}"
'' ''
errors-to-stderr errors-to-stderr
${optionalString (cfg.up != "" || cfg.down != "") "script-security 2"} ${optionalString (cfg.up != "" || cfg.down != "" || cfg.updateResolvConf) "script-security 2"}
${cfg.config} ${cfg.config}
${optionalString (cfg.up != "") "up ${pkgs.writeScript "openvpn-${name}-up" upScript}"} ${optionalString (cfg.up != "" || cfg.updateResolvConf)
${optionalString (cfg.down != "") "down ${pkgs.writeScript "openvpn-${name}-down" downScript}"} "up ${pkgs.writeScript "openvpn-${name}-up" upScript}"}
${optionalString (cfg.down != "" || cfg.updateResolvConf)
"down ${pkgs.writeScript "openvpn-${name}-down" downScript}"}
''; '';
in { in {
@ -145,6 +151,16 @@ in
description = "Whether this OpenVPN instance should be started automatically."; description = "Whether this OpenVPN instance should be started automatically.";
}; };
updateResolvConf = mkOption {
default = false;
type = types.bool;
description = ''
Use the script from the update-resolv-conf package to automatically
update resolv.conf with the DNS information provided by openvpn. The
script will be run after the "up" commands and before the "down" commands.
'';
};
}; };
}; };

View File

@ -0,0 +1,523 @@
# NixOS module for oauth2_proxy.
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.oauth2_proxy;
# Use like:
# repeatedArgs (arg: "--arg=${arg}") args
repeatedArgs = concatMapStringsSep " ";
# 'toString' doesn't quite do what we want for bools.
fromBool = x: if x then "true" else "false";
# oauth2_proxy provides many options that are only relevant if you are using
# a certain provider. This set maps from provider name to a function that
# takes the configuration and returns a string that can be inserted into the
# command-line to launch oauth2_proxy.
providerSpecificOptions = {
azure = cfg: ''
--azure-tenant=${cfg.azure.tenant} \
--resource=${cfg.azure.resource} \
'';
github = cfg: ''
$(optionalString (!isNull cfg.github.org) "--github-org=${cfg.github.org}") \
$(optionalString (!isNull cfg.github.team) "--github-org=${cfg.github.team}") \
'';
google = cfg: ''
--google-admin-email=${cfg.google.adminEmail} \
--google-service-account=${cfg.google.serviceAccountJSON} \
$(repeatedArgs (group: "--google-group=${group}") cfg.google.groups) \
'';
};
authenticatedEmailsFile = pkgs.writeText "authenticated-emails" cfg.email.addresses;
getProviderOptions = cfg: provider:
if providerSpecificOptions ? provider then providerSpecificOptions.provider cfg else "";
mkCommandLine = cfg: ''
--provider='${cfg.provider}' \
${optionalString (!isNull cfg.email.addresses) "--authenticated-emails-file='${authenticatedEmailsFile}'"} \
--approval-prompt='${cfg.approvalPrompt}' \
${optionalString (cfg.passBasicAuth && !isNull cfg.basicAuthPassword) "--basic-auth-password='${cfg.basicAuthPassword}'"} \
--client-id='${cfg.clientID}' \
--client-secret='${cfg.clientSecret}' \
${optionalString (!isNull cfg.cookie.domain) "--cookie-domain='${cfg.cookie.domain}'"} \
--cookie-expire='${cfg.cookie.expire}' \
--cookie-httponly=${fromBool cfg.cookie.httpOnly} \
--cookie-name='${cfg.cookie.name}' \
--cookie-secret='${cfg.cookie.secret}' \
--cookie-secure=${fromBool cfg.cookie.secure} \
${optionalString (!isNull cfg.cookie.refresh) "--cookie-refresh='${cfg.cookie.refresh}'"} \
${optionalString (!isNull cfg.customTemplatesDir) "--custom-templates-dir='${cfg.customTemplatesDir}'"} \
${repeatedArgs (x: "--email-domain='${x}'") cfg.email.domains} \
--http-address='${cfg.httpAddress}' \
${optionalString (!isNull cfg.htpasswd.file) "--htpasswd-file='${cfg.htpasswd.file}' --display-htpasswd-form=${fromBool cfg.htpasswd.displayForm}"} \
${optionalString (!isNull cfg.loginURL) "--login-url='${cfg.loginURL}'"} \
--pass-access-token=${fromBool cfg.passAccessToken} \
--pass-basic-auth=${fromBool cfg.passBasicAuth} \
--pass-host-header=${fromBool cfg.passHostHeader} \
--proxy-prefix='${cfg.proxyPrefix}' \
${optionalString (!isNull cfg.profileURL) "--profile-url='${cfg.profileURL}'"} \
${optionalString (!isNull cfg.redeemURL) "--redeem-url='${cfg.redeemURL}'"} \
${optionalString (!isNull cfg.redirectURL) "--redirect-url='${cfg.redirectURL}'"} \
--request-logging=${fromBool cfg.requestLogging} \
${optionalString (!isNull cfg.scope) "--scope='${cfg.scope}'"} \
${repeatedArgs (x: "--skip-auth-regex='${x}'") cfg.skipAuthRegexes} \
${optionalString (!isNull cfg.signatureKey) "--signature-key='${cfg.signatureKey}'"} \
--upstream='${cfg.upstream}' \
${optionalString (!isNull cfg.validateURL) "--validate-url='${cfg.validateURL}'"} \
${optionalString cfg.tls.enable "--tls-cert='${cfg.tls.certificate}' --tls-key='${cfg.tls.key}' --https-address='${cfg.tls.httpsAddress}'"} \
'' + getProviderOptions cfg cfg.provider;
in
{
options.services.oauth2_proxy = {
enable = mkEnableOption "oauth2_proxy";
package = mkOption {
type = types.package;
default = pkgs.oauth2_proxy;
defaultText = "pkgs.oauth2_proxy";
description = ''
The package that provides oauth2_proxy.
'';
};
##############################################
# PROVIDER configuration
provider = mkOption {
type = types.enum [
"google"
"github"
"azure"
"gitlab"
"linkedin"
"myusa"
];
default = "google";
description = ''
OAuth provider.
'';
};
approvalPrompt = mkOption {
type = types.enum ["force" "auto"];
default = "force";
description = ''
OAuth approval_prompt.
'';
};
clientID = mkOption {
type = types.str;
description = ''
The OAuth Client ID.
'';
example = "123456.apps.googleusercontent.com";
};
clientSecret = mkOption {
type = types.str;
description = ''
The OAuth Client Secret.
'';
};
skipAuthRegexes = mkOption {
type = types.listOf types.str;
default = [];
description = ''
Skip authentication for requests matching any of these regular
expressions.
'';
};
# XXX: Not clear whether these two options are mutually exclusive or not.
email = {
domains = mkOption {
type = types.listOf types.str;
default = [];
description = ''
Authenticate emails with the specified domains. Use
<literal>*</literal> to authenticate any email.
'';
};
addresses = mkOption {
type = types.nullOr types.lines;
default = null;
description = ''
Line-separated email addresses that are allowed to authenticate.
'';
};
};
loginURL = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Authentication endpoint.
You only need to set this if you are using a self-hosted provider (e.g.
Github Enterprise). If you're using a publicly hosted provider
(e.g github.com), then the default works.
'';
example = "https://provider.example.com/oauth/authorize";
};
redeemURL = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Token redemption endpoint.
You only need to set this if you are using a self-hosted provider (e.g.
Github Enterprise). If you're using a publicly hosted provider
(e.g github.com), then the default works.
'';
example = "https://provider.example.com/oauth/token";
};
validateURL = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Access token validation endpoint.
You only need to set this if you are using a self-hosted provider (e.g.
Github Enterprise). If you're using a publicly hosted provider
(e.g github.com), then the default works.
'';
example = "https://provider.example.com/user/emails";
};
redirectURL = mkOption {
# XXX: jml suspects this is always necessary, but the command-line
# doesn't require it so making it optional.
type = types.nullOr types.str;
default = null;
description = ''
The OAuth2 redirect URL.
'';
example = "https://internalapp.yourcompany.com/oauth2/callback";
};
azure = {
tenant = mkOption {
type = types.str;
default = "common";
description = ''
Go to a tenant-specific or common (tenant-independent) endpoint.
'';
};
resource = mkOption {
type = types.str;
description = ''
The resource that is protected.
'';
};
};
google = {
adminEmail = mkOption {
type = types.str;
description = ''
The Google Admin to impersonate for API calls.
Only users with access to the Admin APIs can access the Admin SDK
Directory API, thus the service account needs to impersonate one of
those users to access the Admin SDK Directory API.
See <link xlink:href="https://developers.google.com/admin-sdk/directory/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account" />.
'';
};
groups = mkOption {
type = types.listOf types.str;
default = [];
description = ''
Restrict logins to members of these Google groups.
'';
};
serviceAccountJSON = mkOption {
type = types.path;
description = ''
The path to the service account JSON credentials.
'';
};
};
github = {
org = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Restrict logins to members of this organisation.
'';
};
team = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Restrict logins to members of this team.
'';
};
};
####################################################
# UPSTREAM Configuration
upstream = mkOption {
type = types.commas;
description = ''
The http url(s) of the upstream endpoint or <literal>file://</literal>
paths for static files. Routing is based on the path.
'';
};
passAccessToken = mkOption {
type = types.bool;
default = false;
description = ''
Pass OAuth access_token to upstream via X-Forwarded-Access-Token header.
'';
};
passBasicAuth = mkOption {
type = types.bool;
default = true;
description = ''
Pass HTTP Basic Auth, X-Forwarded-User and X-Forwarded-Email information to upstream.
'';
};
basicAuthPassword = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
The password to set when passing the HTTP Basic Auth header.
'';
};
passHostHeader = mkOption {
type = types.bool;
default = true;
description = ''
Pass the request Host Header to upstream.
'';
};
signatureKey = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
GAP-Signature request signature key.
'';
example = "sha1:secret0";
};
cookie = {
domain = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
An optional cookie domain to force cookies to.
'';
example = ".yourcompany.com";
};
expire = mkOption {
type = types.str;
default = "168h0m0s";
description = ''
Expire timeframe for cookie.
'';
};
httpOnly = mkOption {
type = types.bool;
default = true;
description = ''
Set HttpOnly cookie flag.
'';
};
name = mkOption {
type = types.str;
default = "_oauth2_proxy";
description = ''
The name of the cookie that the oauth_proxy creates.
'';
};
refresh = mkOption {
# XXX: Unclear what the behavior is when this is not specified.
type = types.nullOr types.str;
default = null;
description = ''
Refresh the cookie after this duration; 0 to disable.
'';
example = "168h0m0s";
};
secret = mkOption {
type = types.str;
description = ''
The seed string for secure cookies.
'';
};
secure = mkOption {
type = types.bool;
default = true;
description = ''
Set secure (HTTPS) cookie flag.
'';
};
};
####################################################
# OAUTH2 PROXY configuration
httpAddress = mkOption {
type = types.str;
default = "127.0.0.1:4180";
description = ''
HTTPS listening address. This module does not expose the port by
default. If you want this URL to be accessible to other machines, please
add the port to <literal>networking.firewall.allowedTCPPorts</literal>.
'';
};
htpasswd = {
file = mkOption {
type = types.nullOr types.path;
default = null;
description = ''
Additionally authenticate against a htpasswd file. Entries must be
created with <literal>htpasswd -s</literal> for SHA encryption.
'';
};
displayForm = mkOption {
type = types.bool;
default = true;
description = ''
Display username / password login form if an htpasswd file is provided.
'';
};
};
customTemplatesDir = mkOption {
type = types.nullOr types.path;
default = null;
description = ''
Path to custom HTML templates.
'';
};
proxyPrefix = mkOption {
type = types.str;
default = "/oauth2";
description = ''
The url root path that this proxy should be nested under.
'';
};
tls = {
enable = mkOption {
type = types.bool;
default = false;
description = ''
Whether to serve over TLS.
'';
};
certificate = mkOption {
type = types.path;
description = ''
Path to certificate file.
'';
};
key = mkOption {
type = types.path;
description = ''
Path to private key file.
'';
};
httpsAddress = mkOption {
type = types.str;
default = ":443";
description = ''
<literal>addr:port</literal> to listen on for HTTPS clients.
Remember to add <literal>port</literal> to
<literal>allowedTCPPorts</literal> if you want other machines to be
able to connect to it.
'';
};
};
requestLogging = mkOption {
type = types.bool;
default = true;
description = ''
Log requests to stdout.
'';
};
####################################################
# UNKNOWN
# XXX: Is this mandatory? Is it part of another group? Is it part of the provider specification?
scope = mkOption {
# XXX: jml suspects this is always necessary, but the command-line
# doesn't require it so making it optional.
type = types.nullOr types.str;
default = null;
description = ''
OAuth scope specification.
'';
};
profileURL = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Profile access endpoint.
'';
};
};
config = mkIf cfg.enable {
users.extraUsers.oauth2_proxy = {
description = "OAuth2 Proxy";
};
systemd.services.oauth2_proxy = {
description = "OAuth2 Proxy";
path = [ cfg.package ];
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
serviceConfig = {
User = "oauth2_proxy";
Restart = "always";
ExecStart = "${cfg.package}/bin/oauth2_proxy ${mkCommandLine cfg}";
};
};
};
}

View File

@ -81,7 +81,6 @@ in {
}; };
environment.gnome3.packageSet = mkOption { environment.gnome3.packageSet = mkOption {
type = types.nullOr types.package;
default = null; default = null;
example = literalExample "pkgs.gnome3_18"; example = literalExample "pkgs.gnome3_18";
description = "Which GNOME 3 package set to use."; description = "Which GNOME 3 package set to use.";

View File

@ -117,6 +117,9 @@ in
# Install activity manager if available # Install activity manager if available
++ lib.optional (lib.hasAttr "kactivitymanagerd" kde5) kde5.kactivitymanagerd ++ lib.optional (lib.hasAttr "kactivitymanagerd" kde5) kde5.kactivitymanagerd
# frameworkintegration was split with plasma-integration in Plasma 5.6
++ lib.optional (lib.hasAttr "plasma-integration" kde5) kde5.plasma-integration
# Optional hardware support features # Optional hardware support features
++ lib.optional config.hardware.bluetooth.enable kde5.bluedevil ++ lib.optional config.hardware.bluetooth.enable kde5.bluedevil
++ lib.optional config.networking.networkmanager.enable kde5.plasma-nm ++ lib.optional config.networking.networkmanager.enable kde5.plasma-nm
@ -167,7 +170,9 @@ in
services.xserver.displayManager.sddm = { services.xserver.displayManager.sddm = {
theme = "breeze"; theme = "breeze";
themes = [ themes = [
kde5.extra-cmake-modules # for the setup-hook
kde5.plasma-workspace kde5.plasma-workspace
kde5.breeze-icons
(kde5.oxygen-icons or kde5.oxygen-icons5) (kde5.oxygen-icons or kde5.oxygen-icons5)
]; ];
}; };

View File

@ -463,7 +463,14 @@ in
{ source = "${cfg.xkbDir}"; { source = "${cfg.xkbDir}";
target = "X11/xkb"; target = "X11/xkb";
} }
]); ])
# Needed since 1.18; see https://bugs.freedesktop.org/show_bug.cgi?id=89023#c5
++ (let cfgPath = "/X11/xorg.conf.d/10-evdev.conf"; in
[{
source = xorg.xf86inputevdev.out + "/share" + cfgPath;
target = cfgPath;
}]
);
environment.systemPackages = environment.systemPackages =
[ xorg.xorgserver.out [ xorg.xorgserver.out
@ -479,6 +486,7 @@ in
xorg.xauth xorg.xauth
pkgs.xterm pkgs.xterm
pkgs.xdg_utils pkgs.xdg_utils
xorg.xf86inputevdev.out # get evdev.4 man page
] ]
++ optional (elem "virtualbox" cfg.videoDrivers) xorg.xrefresh; ++ optional (elem "virtualbox" cfg.videoDrivers) xorg.xrefresh;
@ -538,7 +546,7 @@ in
services.xserver.modules = services.xserver.modules =
concatLists (catAttrs "modules" cfg.drivers) ++ concatLists (catAttrs "modules" cfg.drivers) ++
[ xorg.xorgserver.out [ xorg.xorgserver.out
xorg.xf86inputevdev xorg.xf86inputevdev.out
]; ];
services.xserver.xkbDir = mkDefault "${pkgs.xkeyboard_config}/etc/X11/xkb"; services.xserver.xkbDir = mkDefault "${pkgs.xkeyboard_config}/etc/X11/xkb";

View File

@ -4,19 +4,16 @@ with lib;
{ {
options.boot.loader.efi = { options.boot.loader.efi = {
canTouchEfiVariables = mkOption { canTouchEfiVariables = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
description = "Whether the installation process is allowed to modify EFI boot variables.";
description = "Whether or not the installation process should modify efi boot variables.";
}; };
efiSysMountPoint = mkOption { efiSysMountPoint = mkOption {
default = "/boot"; default = "/boot";
type = types.str; type = types.str;
description = "Where the EFI System Partition is mounted."; description = "Where the EFI System Partition is mounted.";
}; };
}; };

View File

@ -488,7 +488,7 @@ in
} }
{ {
assertion = if args.efiSysMountPoint == null then true else hasPrefix "/" args.efiSysMountPoint; assertion = if args.efiSysMountPoint == null then true else hasPrefix "/" args.efiSysMountPoint;
message = "Efi paths must be absolute, not ${args.efiSysMountPoint}"; message = "EFI paths must be absolute, not ${args.efiSysMountPoint}";
} }
] ++ flip map args.devices (device: { ] ++ flip map args.devices (device: {
assertion = device == "nodev" || hasPrefix "/" device; assertion = device == "nodev" || hasPrefix "/" device;

View File

@ -88,16 +88,16 @@ def remove_old_entries(gens):
if not path in known_paths: if not path in known_paths:
os.unlink(path) os.unlink(path)
parser = argparse.ArgumentParser(description='Update NixOS-related gummiboot files') parser = argparse.ArgumentParser(description='Update NixOS-related systemd-boot files')
parser.add_argument('default_config', metavar='DEFAULT-CONFIG', help='The default NixOS config to boot') parser.add_argument('default_config', metavar='DEFAULT-CONFIG', help='The default NixOS config to boot')
args = parser.parse_args() args = parser.parse_args()
# We deserve our own env var! # We deserve our own env var!
if os.getenv("NIXOS_INSTALL_GRUB") == "1": if os.getenv("NIXOS_INSTALL_GRUB") == "1":
if "@canTouchEfiVariables@" == "1": if "@canTouchEfiVariables@" == "1":
subprocess.check_call(["@gummiboot@/bin/gummiboot", "--path=@efiSysMountPoint@", "install"]) subprocess.check_call(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@", "install"])
else: else:
subprocess.check_call(["@gummiboot@/bin/gummiboot", "--path=@efiSysMountPoint@", "--no-variables", "install"]) subprocess.check_call(["@systemd@/bin/bootctl", "--path=@efiSysMountPoint@", "--no-variables", "install"])
mkdir_p("@efiSysMountPoint@/efi/nixos") mkdir_p("@efiSysMountPoint@/efi/nixos")
mkdir_p("@efiSysMountPoint@/loader/entries") mkdir_p("@efiSysMountPoint@/loader/entries")

View File

@ -3,16 +3,18 @@
with lib; with lib;
let let
cfg = config.boot.loader.gummiboot; cfg = config.boot.loader.systemd-boot;
efi = config.boot.loader.efi; efi = config.boot.loader.efi;
gummibootBuilder = pkgs.substituteAll { gummibootBuilder = pkgs.substituteAll {
src = ./gummiboot-builder.py; src = ./systemd-boot-builder.py;
isExecutable = true; isExecutable = true;
inherit (pkgs) python gummiboot; inherit (pkgs) python;
systemd = config.systemd.package;
nix = config.nix.package.out; nix = config.nix.package.out;
@ -21,13 +23,18 @@ let
inherit (efi) efiSysMountPoint canTouchEfiVariables; inherit (efi) efiSysMountPoint canTouchEfiVariables;
}; };
in { in {
options.boot.loader.gummiboot = {
imports =
[ (mkRenamedOptionModule [ "boot" "loader" "gummiboot" "enable" ] [ "boot" "loader" "systemd-boot" "enable" ])
];
options.boot.loader.systemd-boot = {
enable = mkOption { enable = mkOption {
default = false; default = false;
type = types.bool; type = types.bool;
description = "Whether to enable the gummiboot UEFI boot manager"; description = "Whether to enable the systemd-boot (formerly gummiboot) EFI boot manager";
}; };
}; };
@ -45,7 +52,7 @@ in {
system = { system = {
build.installBootLoader = gummibootBuilder; build.installBootLoader = gummibootBuilder;
boot.loader.id = "gummiboot"; boot.loader.id = "systemd-boot";
requiredKernelConfig = with config.lib.kernelConfig; [ requiredKernelConfig = with config.lib.kernelConfig; [
(isYes "EFI_STUB") (isYes "EFI_STUB")

View File

@ -41,6 +41,8 @@ if [ ! -e /proc/1 ]; then
mount -n -t proc proc /proc mount -n -t proc proc /proc
mkdir -m 0755 -p /dev mkdir -m 0755 -p /dev
mount -t devtmpfs devtmpfs /dev mount -t devtmpfs devtmpfs /dev
mkdir -m 0755 -p /sys
mount -t sysfs sysfs /sys
fi fi

View File

@ -77,7 +77,7 @@ in
KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666" KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666"
# Allow systemd dependencies on vboxguest. # Allow systemd dependencies on vboxguest.
KERNEL=="vboxguest", TAG+="systemd" SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd"
''; '';
}; };

View File

@ -0,0 +1,41 @@
import ./make-test.nix ({ pkgs, ...} : {
name = "gnome3-gdm";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ lethalman ];
};
machine =
{ config, pkgs, ... }:
{ imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.xserver.displayManager.gdm = {
enable = true;
autoLogin = {
enable = true;
user = "alice";
};
};
services.xserver.desktopManager.gnome3.enable = true;
environment.gnome3.packageSet = pkgs.gnome3_20;
virtualisation.memorySize = 512;
};
testScript =
''
$machine->waitForX;
$machine->sleep(15);
# Check that logging in has given the user ownership of devices.
$machine->succeed("getfacl /dev/snd/timer | grep -q alice");
$machine->succeed("su - alice -c 'DISPLAY=:0.0 gnome-terminal &'");
$machine->succeed("xauth merge ~alice/.Xauthority");
$machine->waitForWindow(qr/Terminal/);
$machine->sleep(20);
$machine->screenshot("screen");
'';
})

38
nixos/tests/gnome3_20.nix Normal file
View File

@ -0,0 +1,38 @@
import ./make-test.nix ({ pkgs, ...} : {
name = "gnome3";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ domenkozar eelco chaoflow lethalman ];
};
machine =
{ config, pkgs, ... }:
{ imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.xserver.displayManager.auto.enable = true;
services.xserver.displayManager.auto.user = "alice";
services.xserver.desktopManager.gnome3.enable = true;
environment.gnome3.packageSet = pkgs.gnome3_20;
virtualisation.memorySize = 512;
};
testScript =
''
$machine->waitForX;
$machine->sleep(15);
# Check that logging in has given the user ownership of devices.
$machine->succeed("getfacl /dev/snd/timer | grep -q alice");
$machine->succeed("su - alice -c 'DISPLAY=:0.0 gnome-terminal &'");
$machine->succeed("xauth merge ~alice/.Xauthority");
$machine->waitForWindow(qr/Terminal/);
$machine->mustSucceed("timeout 900 bash -c 'journalctl -f|grep -m 1 \"GNOME Shell started\"'");
$machine->sleep(10);
$machine->screenshot("screen");
'';
})

View File

@ -30,8 +30,8 @@ let
boot.loader.grub.configurationLimit = 100 + ${toString forceGrubReinstallCount}; boot.loader.grub.configurationLimit = 100 + ${toString forceGrubReinstallCount};
''} ''}
${optionalString (bootLoader == "gummiboot") '' ${optionalString (bootLoader == "systemd-boot") ''
boot.loader.gummiboot.enable = true; boot.loader.systemd-boot.enable = true;
''} ''}
hardware.enableAllFirmware = lib.mkForce false; hardware.enableAllFirmware = lib.mkForce false;
@ -57,7 +57,7 @@ let
(if system == "x86_64-linux" then "-m 768 " else "-m 512 ") + (if system == "x86_64-linux" then "-m 768 " else "-m 512 ") +
(optionalString (system == "x86_64-linux") "-cpu kvm64 "); (optionalString (system == "x86_64-linux") "-cpu kvm64 ");
hdFlags = ''hda => "vm-state-machine/machine.qcow2", hdaInterface => "${iface}", '' hdFlags = ''hda => "vm-state-machine/machine.qcow2", hdaInterface => "${iface}", ''
+ optionalString (bootLoader == "gummiboot") ''bios => "${pkgs.OVMF}/FV/OVMF.fd", ''; + optionalString (bootLoader == "systemd-boot") ''bios => "${pkgs.OVMF}/FV/OVMF.fd", '';
in in
'' ''
$machine->start; $machine->start;
@ -159,7 +159,7 @@ let
makeInstallerTest = name: makeInstallerTest = name:
{ createPartitions, preBootCommands ? "", extraConfig ? "" { createPartitions, preBootCommands ? "", extraConfig ? ""
, bootLoader ? "grub" # either "grub" or "gummiboot" , bootLoader ? "grub" # either "grub" or "systemd-boot"
, grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid" , grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid"
, enableOCR ? false, meta ? {} , enableOCR ? false, meta ? {}
}: }:
@ -195,7 +195,7 @@ let
virtualisation.qemu.diskInterface = virtualisation.qemu.diskInterface =
if grubVersion == 1 then "scsi" else "virtio"; if grubVersion == 1 then "scsi" else "virtio";
boot.loader.gummiboot.enable = mkIf (bootLoader == "gummiboot") true; boot.loader.systemd-boot.enable = mkIf (bootLoader == "systemd-boot") true;
hardware.enableAllFirmware = mkForce false; hardware.enableAllFirmware = mkForce false;
@ -208,7 +208,6 @@ let
pkgs.unionfs-fuse pkgs.unionfs-fuse
pkgs.ntp pkgs.ntp
pkgs.nixos-artwork pkgs.nixos-artwork
pkgs.gummiboot
pkgs.perlPackages.XMLLibXML pkgs.perlPackages.XMLLibXML
pkgs.perlPackages.ListCompare pkgs.perlPackages.ListCompare
] ]
@ -250,7 +249,7 @@ in {
''; '';
}; };
# Simple GPT/UEFI configuration using Gummiboot with 3 partitions: ESP, swap & root filesystem # Simple GPT/UEFI configuration using systemd-boot with 3 partitions: ESP, swap & root filesystem
simpleUefiGummiboot = makeInstallerTest "simpleUefiGummiboot" simpleUefiGummiboot = makeInstallerTest "simpleUefiGummiboot"
{ createPartitions = { createPartitions =
'' ''
@ -270,7 +269,7 @@ in {
"mount LABEL=BOOT /mnt/boot", "mount LABEL=BOOT /mnt/boot",
); );
''; '';
bootLoader = "gummiboot"; bootLoader = "systemd-boot";
}; };
# Same as the previous, but now with a separate /boot partition. # Same as the previous, but now with a separate /boot partition.

View File

@ -1,4 +1,6 @@
import ./make-test.nix ({ pkgs, ...} : { import ./make-test.nix ({ pkgs, ...} :
{
name = "sddm"; name = "sddm";
meta = with pkgs.stdenv.lib.maintainers; { meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ ttuegel ]; maintainers = [ ttuegel ];
@ -6,6 +8,7 @@ import ./make-test.nix ({ pkgs, ...} : {
machine = { lib, ... }: { machine = { lib, ... }: {
imports = [ ./common/user-account.nix ]; imports = [ ./common/user-account.nix ];
virtualisation.memorySize = 1024;
services.xserver.enable = true; services.xserver.enable = true;
services.xserver.displayManager.sddm = { services.xserver.displayManager.sddm = {
enable = true; enable = true;
@ -14,18 +17,38 @@ import ./make-test.nix ({ pkgs, ...} : {
user = "alice"; user = "alice";
}; };
}; };
services.xserver.windowManager.default = "icewm";
services.xserver.windowManager.icewm.enable = true;
services.xserver.desktopManager.default = "none";
services.xserver.desktopManager.kde5.enable = true; services.xserver.desktopManager.kde5.enable = true;
}; };
enableOCR = true; enableOCR = true;
testScript = { nodes, ... }: '' testScript = { nodes, ... }:
startAll; let xdo = "${pkgs.xdotool}/bin/xdotool"; in
$machine->waitForFile("/home/alice/.Xauthority"); ''
sub krunner {
my ($win,) = @_;
$machine->execute("${xdo} key Alt+F2 sleep 1 type $win");
$machine->execute("${xdo} search --sync --onlyvisible --class krunner sleep 5 key Return");
}
$machine->waitUntilSucceeds("pgrep plasmashell");
$machine->succeed("xauth merge ~alice/.Xauthority"); $machine->succeed("xauth merge ~alice/.Xauthority");
$machine->waitForWindow("^IceWM "); $machine->waitForWindow(qr/Desktop.*/);
# Check that logging in has given the user ownership of devices.
$machine->succeed("getfacl /dev/snd/timer | grep -q alice");
krunner("dolphin");
$machine->waitForWindow(qr/.*Dolphin/);
krunner("konsole");
$machine->waitForWindow(qr/.*Konsole/);
krunner("systemsettings5");
$machine->waitForWindow(qr/.*Settings/);
$machine->sleep(20);
$machine->execute("${xdo} key Alt+F1 sleep 10");
$machine->screenshot("screen");
''; '';
}) })

View File

@ -52,7 +52,7 @@ in
--replace '#!/usr/bin/perl' '#!${perl}/bin/perl' --replace '#!/usr/bin/perl' '#!${perl}/bin/perl'
wrapProgram "$out/bin/abcde" --prefix PATH ":" \ wrapProgram "$out/bin/abcde" --prefix PATH ":" \
"$out/bin:${which}/bin:${libcdio}/bin:${cddiscid}/bin:${wget}/bin:${vorbis-tools}/bin:${id3v2}/bin:${eyeD3}/bin:${lame}/bin:${flac}/bin" ${stdenv.lib.makeBinPath [ "$out" which libcdio cddiscid wget vorbis-tools id3v2 eyeD3 lame flac ]}
wrapProgram "$out/bin/cddb-tool" --prefix PATH ":" \ wrapProgram "$out/bin/cddb-tool" --prefix PATH ":" \
"${wget}/bin" "${wget}/bin"

View File

@ -35,7 +35,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = git://git.ardour.org/ardour/ardour.git; url = git://git.ardour.org/ardour/ardour.git;
rev = "7024232855d268633760674d34c096ce447b7240"; rev = "7024232855d268633760674d34c096ce447b7240";
sha256 = "ede3730455c3c91b2fd612871fa7262bdacd3dff4ba77c5dfbc3c1f0de9b8a36"; sha256 = "0pnnx22asizin5rvf352nfv6003zarw3jd64magp10310wrfiwbq";
}; };
buildInputs = buildInputs =

View File

@ -7,7 +7,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/harryhaaren/openAV-ArtyFX.git"; url = "https://github.com/harryhaaren/openAV-ArtyFX.git";
rev = "3a8cb9a5e4ffaf27a497a31cc9cd6f2e79622d5b"; rev = "3a8cb9a5e4ffaf27a497a31cc9cd6f2e79622d5b";
sha256 = "2e3f6ab6f829c0ec177e85f4e419286616cf35fb7303445caa09d3438cac27d5"; sha256 = "0nsmycm64a686ysfnmdvnaazijvfj90z5wyp96kyr81nsrbcv2ij";
}; };
buildInputs = [ cairomm cmake libjack2 libpthreadstubs libXdmcp libxshmfence libsndfile lv2 ntk pkgconfig ]; buildInputs = [ cairomm cmake libjack2 libpthreadstubs libXdmcp libxshmfence libsndfile lv2 ntk pkgconfig ];

View File

@ -7,7 +7,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/DISTRHO/DISTRHO-Ports.git"; url = "https://github.com/DISTRHO/DISTRHO-Ports.git";
rev = "53458838505efef91ed069d0a7d970b6b3588eba"; rev = "53458838505efef91ed069d0a7d970b6b3588eba";
sha256 = "0fb4dxfvvqy8lnm9c91sxwn5wbcw8grfpm52zag25vrls251aih3"; sha256 = "1wjzgy5yyi52fn4si2m8zrbbzqsh3p75avfx744jmxj5gpq5qa92";
}; };
patchPhase = '' patchPhase = ''

View File

@ -14,7 +14,7 @@ let
src = fetchgit { src = fetchgit {
url = "git://git.code.sf.net/p/faudiostream/code"; url = "git://git.code.sf.net/p/faudiostream/code";
rev = "931fca3e649f99ef09025d37bd6a7dc70a03e6f6"; rev = "931fca3e649f99ef09025d37bd6a7dc70a03e6f6";
sha256 = "05yam8jfdnziysvpxa5w118k5bbl103vamyqgka6vyhjjizp1nx7"; sha256 = "1h2qfwxqf9406v0w6kqyxlzn88zw3xmwgxg9f01n4jvd72zxll78";
}; };
meta = with stdenv.lib; { meta = with stdenv.lib; {

View File

@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/OSSIA/i-score.git"; url = "https://github.com/OSSIA/i-score.git";
rev = "ede2453b139346ae46702b5e2643c5488f8c89fb"; rev = "ede2453b139346ae46702b5e2643c5488f8c89fb";
sha256 = "04li771nj0k8gym7vg6rnawjkp2f6d5m5mby26h0k6ksf7hg7h70"; sha256 = "0mk0zsqhx9z7ry1amjki89h6yp5ysi1qgy2j3kzhrm5sfazvf0x3";
leaveDotGit = true; leaveDotGit = true;
deepClone = true; deepClone = true;
}; };

View File

@ -7,7 +7,7 @@ stdenv.mkDerivation {
src = fetchgit { src = fetchgit {
url = https://github.com/swh/ladspa.git; url = https://github.com/swh/ladspa.git;
rev = "4b8437e8037cace3d5bf8ce6d1d1da0182aba686"; rev = "4b8437e8037cace3d5bf8ce6d1d1da0182aba686";
sha256 = "7d9aa13a064903b330bd52e35c1f810f1c8a253ea5eb4e5a3a69a051af03150e"; sha256 = "1rmqm4780dhp0pj2scl3k7m8hpp1x6w6ln4wwg954zb9570rqaxx";
}; };
buildInputs = [ autoreconfHook fftw ladspaH libxml2 pkgconfig perl perlPackages.XMLParser ]; buildInputs = [ autoreconfHook fftw ladspaH libxml2 pkgconfig perl perlPackages.XMLParser ];

View File

@ -8,7 +8,7 @@ pythonPackages.buildPythonApplication rec {
src = fetchgit { src = fetchgit {
url = "git://github.com/aszlig/LastWatch.git"; url = "git://github.com/aszlig/LastWatch.git";
rev = "refs/tags/v${version}"; rev = "refs/tags/v${version}";
sha256 = "c43f0fd87e9f3daafc7e8676daf2e89c8e21fbabc278eb1455e28d2997587a92"; sha256 = "0nlng3595j5jvnikk8i5hb915zak5zsmfn2306cc4gfcns9xzjwp";
}; };
pythonPath = [ pythonPath = [

View File

@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
url = "https://github.com/thomasvs/morituri.git"; url = "https://github.com/thomasvs/morituri.git";
fetchSubmodules = true; fetchSubmodules = true;
rev = "135b2f7bf27721177e3aeb1d26403f1b29116599"; rev = "135b2f7bf27721177e3aeb1d26403f1b29116599";
sha256 = "1ccxq1spny6xgd7nqwn13n9nqa00ay0nhflg3vbdkvbirh8fgxwq"; sha256 = "1sl5y5j3gdbynf2v0gf9dwd2hzawj8lm8ywadid7qm34yn8lx12k";
}; };
pythonPath = [ pythonPath = [

View File

@ -7,7 +7,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/cth103/plugin-torture"; url = "https://github.com/cth103/plugin-torture";
rev = "9ee06016982bdfbaa215cd0468cc6ada6367462a"; rev = "9ee06016982bdfbaa215cd0468cc6ada6367462a";
sha256 = "bfe9213fd2c1451d7acc1381d63301c4e6ff69ce86d31a886ece5159ba850706"; sha256 = "0ynzfs3z95lbw4l1w276as2a37zxp0cw6pi3lbikr0qk0r7j5j10";
}; };
buildInputs = [ boost ladspaH lilv lv2 pkgconfig serd sord sratom ]; buildInputs = [ boost ladspaH lilv lv2 pkgconfig serd sord sratom ];

View File

@ -6,7 +6,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/swh/lv2.git"; url = "https://github.com/swh/lv2.git";
rev = "978d5d8f549fd22048157a6d044af0faeaacbd7f"; rev = "978d5d8f549fd22048157a6d044af0faeaacbd7f";
sha256 = "3a9c042785b856623339aedafa5bc019b41beb8034d8594c7bbd6c9c26368065"; sha256 = "10jj8sp67caxvmzjxwyzapc34jpry5nrkkp49kyyvyk5dgkpbsjw";
}; };
patchPhase = '' patchPhase = ''

View File

@ -8,7 +8,7 @@ stdenv.mkDerivation rec {
url = "https://github.com/zamaudio/zam-plugins.git"; url = "https://github.com/zamaudio/zam-plugins.git";
deepClone = true; deepClone = true;
rev = "91fe56931a3e57b80f18c740d2dde6b44f962aee"; rev = "91fe56931a3e57b80f18c740d2dde6b44f962aee";
sha256 = "1s0s028h3z3pfd4qvi63fsg6bv33bvz0p5fbmbmhypzqjlx6mlkb"; sha256 = "1ldrqh6nk0m1axb553wjp1gfznw8b6b3k0v0z1jdwy425sl6g07d";
}; };
buildInputs = [ boost libX11 mesa liblo libjack2 ladspaH lv2 pkgconfig rubberband libsndfile ]; buildInputs = [ boost libX11 mesa liblo libjack2 ladspaH lv2 pkgconfig rubberband libsndfile ];

View File

@ -1,15 +1,15 @@
{ stdenv, fetchurl, makeWrapper, jre, cpio, gawk, gnugrep, gnused, procps, swt, gtk2, glib, libXtst }: { stdenv, fetchurl, makeWrapper, jre, cpio, gawk, gnugrep, gnused, procps, swt, gtk2, glib, libXtst }:
let let
version = "4.6.0"; version = "4.7.0";
rev = "3"; #tracks unversioned changes that occur on download.code42.com from time to time rev = "1"; #tracks unversioned changes that occur on download.code42.com from time to time
in stdenv.mkDerivation rec { in stdenv.mkDerivation rec {
name = "crashplan-${version}-r${rev}"; name = "crashplan-${version}-r${rev}";
crashPlanArchive = fetchurl { crashPlanArchive = fetchurl {
url = "https://download.code42.com/installs/linux/install/CrashPlan/CrashPlan_${version}_Linux.tgz"; url = "https://download.code42.com/installs/linux/install/CrashPlan/CrashPlan_${version}_Linux.tgz";
sha256 = "0crrx8gy132xcpjfah08qhsl8g2arx14p5mpypcihl9j6mldi6mz"; sha256 = "1r50fyswvqjxsdslbyibbxwz2fs8iim15hxr0k05jrzmkhjm4g5v";
}; };
srcs = [ crashPlanArchive ]; srcs = [ crashPlanArchive ];

View File

@ -68,14 +68,19 @@ in
stdenv.mkDerivation { stdenv.mkDerivation {
name = "sddm-${version}"; name = "sddm-${version}";
phases = "installPhase";
nativeBuildInputs = [ lndir makeQtWrapper ]; nativeBuildInputs = [ lndir makeQtWrapper ];
buildInputs = [ unwrapped ] ++ themes; buildInputs = [ unwrapped ] ++ themes;
themes = map (pkg: pkg.out or pkg) themes; themes = map (pkg: pkg.out or pkg) themes;
inherit unwrapped; inherit unwrapped;
unpackPhase = "true";
configurePhase = "runHook preConfigure; runHook postConfigure";
buildPhase = "runHook preBuild; runHook postBuild";
installPhase = '' installPhase = ''
runHook preInstall
makeQtWrapper "$unwrapped/bin/sddm" "$out/bin/sddm" makeQtWrapper "$unwrapped/bin/sddm" "$out/bin/sddm"
mkdir -p "$out/share/sddm" mkdir -p "$out/share/sddm"
@ -85,6 +90,8 @@ stdenv.mkDerivation {
lndir -silent "$sddmDir" "$out/share/sddm" lndir -silent "$sddmDir" "$out/share/sddm"
fi fi
done done
runHook postInstall
''; '';
inherit (unwrapped) meta; inherit (unwrapped) meta;

View File

@ -31,6 +31,8 @@ stdenv.mkDerivation rec {
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath "${atomEnv.libPath}" \ --set-rpath "${atomEnv.libPath}" \
$out/share/atom/resources/app/apm/bin/node $out/share/atom/resources/app/apm/bin/node
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
$out/share/atom/resources/app.asar.unpacked/node_modules/symbols-view/vendor/ctags-linux
''; '';
meta = with stdenv.lib; { meta = with stdenv.lib; {

View File

@ -1,12 +1,14 @@
diff --git a/lib/careadlinkat.h b/lib/careadlinkat.h diff --git a/lib/careadlinkat.h b/lib/careadlinkat.h
index 5cdb813..7a272e8 100644 index 84ede3e..8e8f42e 100644
--- a/lib/careadlinkat.h --- a/lib/careadlinkat.h
+++ b/lib/careadlinkat.h +++ b/lib/careadlinkat.h
@@ -23,6 +23,8 @@ @@ -23,6 +23,10 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
+#ifndef AT_FDCWD
+#define AT_FDCWD -2 +#define AT_FDCWD -2
+#endif
+ +
struct allocator; struct allocator;

View File

@ -1,12 +1,14 @@
diff --git a/lib/careadlinkat.h b/lib/careadlinkat.h diff --git a/lib/careadlinkat.h b/lib/careadlinkat.h
index 5cdb813..7a272e8 100644 index 84ede3e..8e8f42e 100644
--- a/lib/careadlinkat.h --- a/lib/careadlinkat.h
+++ b/lib/careadlinkat.h +++ b/lib/careadlinkat.h
@@ -23,6 +23,8 @@ @@ -23,6 +23,10 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
+#ifndef AT_FDCWD
+#define AT_FDCWD -2 +#define AT_FDCWD -2
+#endif
+ +
struct allocator; struct allocator;

View File

@ -6,7 +6,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/cask/cask.git"; url = "https://github.com/cask/cask.git";
rev = "717b64a9ba7640ec366e8573da0c01f9c4d57b0c"; rev = "717b64a9ba7640ec366e8573da0c01f9c4d57b0c";
sha256 = "0j18rzgpibisfcci6kcgjs8nlkfi1dw33dxp6ab6zaiarydwgcs5"; sha256 = "0bq24hac1z77g1bybwlk991dcc3pss2gjpwq0a6vvrqg5hw02lsf";
}; };
buildInputs = [ emacs python ]; buildInputs = [ emacs python ];

View File

@ -5,7 +5,7 @@ clangStdenv.mkDerivation {
src = fetchgit { src = fetchgit {
url = "git://github.com/Golevka/emacs-clang-complete-async.git"; url = "git://github.com/Golevka/emacs-clang-complete-async.git";
rev = "f01488971ec8b5752780d130fb84de0c16a46f31"; rev = "f01488971ec8b5752780d130fb84de0c16a46f31";
sha256 = "1c8zqi6axbsb951azz9iqx3j52j30nd9ypv396hvids3g02cirrf"; sha256 = "01smjinrvx0w5z847a43fh2hyr6rrq1kaglfakbr6dcr313w89x9";
}; };
buildInputs = [ llvmPackages.llvm ]; buildInputs = [ llvmPackages.llvm ];

View File

@ -6,7 +6,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/sigma/gh.el.git"; url = "https://github.com/sigma/gh.el.git";
rev = "ef03b63d063ec22f03af449aa955c98dfad7f80e"; rev = "ef03b63d063ec22f03af449aa955c98dfad7f80e";
sha256 = "efa231e0091e8c7785385149dc97b2d8dc24aba65f4b0974b8ed7f62b7596ad3"; sha256 = "1pciq16vl5l4kvj08q4ib1jzk2bb2y1makcsyaw8k9jblqviw756";
}; };
buildInputs = [ emacs ]; buildInputs = [ emacs ];

View File

@ -6,7 +6,7 @@ stdenv.mkDerivation {
src = fetchgit { src = fetchgit {
url = "git://github.com/mooz/js2-mode.git"; url = "git://github.com/mooz/js2-mode.git";
rev = "3abcd90ddc2f446ddf0fb874dd79ba870c26ad2d"; rev = "3abcd90ddc2f446ddf0fb874dd79ba870c26ad2d";
sha256 = "c0aaab4eeb8d60cfd5c382c3e30d4725e5ec492720d573e663ea69ee43aa73a8"; sha256 = "0sh9ax2w0ydhjjn4vnwbgy3926p7ad6h6nmsnm0a3zlldj9a4vwn";
}; };
buildInputs = [ emacs ]; buildInputs = [ emacs ];

File diff suppressed because it is too large Load Diff

View File

@ -37,7 +37,7 @@ self:
overrides = { overrides = {
ac-php = super.ac-php.override { ac-php = super.ac-php.override {
inherit (self.melpaPackages) company popup; inherit (self.melpaPackages) popup;
}; };
# upstream issue: mismatched filename # upstream issue: mismatched filename

View File

@ -6,7 +6,7 @@ stdenv.mkDerivation (rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/ProofGeneral/PG.git"; url = "https://github.com/ProofGeneral/PG.git";
rev = "16991280fb09743ae7320aef77f6a166afb907d7"; rev = "16991280fb09743ae7320aef77f6a166afb907d7";
sha256 = "08zhfl6xbl4q7lrl7wdp72xr155k06778by0d60g28mfx59b7sqc"; sha256 = "1yakjxfz6a09m7lrxff04sj1717gpmhq2bsibd5f9lkp6z0w2i0q";
}; };
buildInputs = [ emacs texinfo perl which ] ++ stdenv.lib.optional enableDoc texLive; buildInputs = [ emacs texinfo perl which ] ++ stdenv.lib.optional enableDoc texLive;

View File

@ -8,7 +8,7 @@ pythonPackages.buildPythonApplication rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/leo-editor/leo-editor"; url = "https://github.com/leo-editor/leo-editor";
rev = "refs/tags/Leo-${version}-final"; rev = "refs/tags/Leo-${version}-final";
sha256 = "3cc5259609890bbde9cfee71f4f60b959b3f5b740f7d403c99ea2d9796b4758e"; sha256 = "0km5mvzfpfbxxhcjr4if24qhgk2c7dsvmfinz0zrbfriip848vcp";
}; };
propagatedBuildInputs = with pythonPackages; [ pyqt4 sqlite3 ]; propagatedBuildInputs = with pythonPackages; [ pyqt4 sqlite3 ];

View File

@ -1,6 +1,6 @@
{ stdenv, fetchFromGitHub, cmake, gettext, glib, libmsgpack, libtermkey { stdenv, fetchFromGitHub, cmake, gettext, glib, libmsgpack, libtermkey
, libtool, libuv, lpeg, lua, luajit, luaMessagePack, luabitop, man, ncurses , libtool, libuv, lua, luajit, luaPackages, man, ncurses, perl, pkgconfig
, perl, pkgconfig, unibilium, makeWrapper, vimUtils, xsel , unibilium, makeWrapper, vimUtils, xsel
, withPython ? true, pythonPackages, extraPythonPackages ? [] , withPython ? true, pythonPackages, extraPythonPackages ? []
, withPython3 ? true, python3Packages, extraPython3Packages ? [] , withPython3 ? true, python3Packages, extraPython3Packages ? []
@ -21,10 +21,10 @@ let
version = "2015-11-06"; version = "2015-11-06";
src = fetchFromGitHub { src = fetchFromGitHub {
sha256 = "090pyf1n5asaw1m2l9bsbdv3zd753aq1plb0w0drbc2k43ds7k3g";
rev = "a9c7c6fd20fa35e0ad3e0e98901ca12dfca9c25c";
repo = "libvterm";
owner = "neovim"; owner = "neovim";
repo = "libvterm";
rev = "a9c7c6fd20fa35e0ad3e0e98901ca12dfca9c25c";
sha256 = "090pyf1n5asaw1m2l9bsbdv3zd753aq1plb0w0drbc2k43ds7k3g";
}; };
buildInputs = [ perl ]; buildInputs = [ perl ];
@ -39,7 +39,7 @@ let
description = "VT220/xterm/ECMA-48 terminal emulator library"; description = "VT220/xterm/ECMA-48 terminal emulator library";
homepage = http://www.leonerd.org.uk/code/libvterm/; homepage = http://www.leonerd.org.uk/code/libvterm/;
license = licenses.mit; license = licenses.mit;
maintainers = with maintainers; [ nckx ]; maintainers = with maintainers; [ nckx garbas ];
platforms = platforms.unix; platforms = platforms.unix;
}; };
}; };
@ -60,13 +60,13 @@ let
neovim = stdenv.mkDerivation rec { neovim = stdenv.mkDerivation rec {
name = "neovim-${version}"; name = "neovim-${version}";
version = "0.1.3"; version = "0.1.4";
src = fetchFromGitHub { src = fetchFromGitHub {
sha256 = "1bkyfxsgb7894848nphsi6shr8bvi9z6ch0zvh2df7vkkzji8chr";
rev = "v${version}";
repo = "neovim";
owner = "neovim"; owner = "neovim";
repo = "neovim";
rev = "v${version}";
sha256 = "14c4gydkm2mz22i616190yif1k0i6d7h5hyxa1mf5cmcyqmp3kkp";
}; };
enableParallelBuilding = true; enableParallelBuilding = true;
@ -79,13 +79,15 @@ let
# https://github.com/NixOS/nixpkgs/issues/14442 # https://github.com/NixOS/nixpkgs/issues/14442
lua lua
luajit luajit
lpeg
luaMessagePack
luabitop
libmsgpack libmsgpack
ncurses ncurses
neovimLibvterm neovimLibvterm
unibilium unibilium
luaPackages.lpeg
luaPackages.mpack
luaPackages.luabitop
] ++ optional withJemalloc jemalloc; ] ++ optional withJemalloc jemalloc;
nativeBuildInputs = [ nativeBuildInputs = [
@ -95,8 +97,12 @@ let
pkgconfig pkgconfig
]; ];
LUA_CPATH="${lpeg}/lib/lua/${lua.luaversion}/?.so;${luabitop}/lib/lua/5.2/?.so"; LUA_CPATH = "${luaPackages.lpeg}/lib/lua/${lua.luaversion}/?.so;${luaPackages.mpack}/lib/lua/${lua.luaversion}/?.so;${luaPackages.luabitop}/lib/lua/${lua.luaversion}/?.so";
LUA_PATH="${luaMessagePack}/share/lua/5.1/?.lua";
configureFlags = [
"-DCMAKE_BUILD_TYPE=RelWithDebInfo"
"-DENABLE_JEMALLOC=ON"
];
# triggers on buffer overflow bug while running tests # triggers on buffer overflow bug while running tests
hardeningDisable = [ "fortify" ]; hardeningDisable = [ "fortify" ];
@ -114,7 +120,7 @@ let
install_name_tool -change libjemalloc.1.dylib \ install_name_tool -change libjemalloc.1.dylib \
${jemalloc}/lib/libjemalloc.1.dylib \ ${jemalloc}/lib/libjemalloc.1.dylib \
$out/bin/nvim $out/bin/nvim
sed -i -e "s|'xsel|'${xsel}/bin/xsel|" share/nvim/runtime/autoload/provider/clipboard.vim sed -i -e "s|'xsel|'${xsel}/bin/xsel|" $out/share/nvim/runtime/autoload/provider/clipboard.vim
'' + optionalString withPython '' '' + optionalString withPython ''
ln -s ${pythonEnv}/bin/python $out/bin/nvim-python ln -s ${pythonEnv}/bin/python $out/bin/nvim-python
'' + optionalString withPyGUI '' '' + optionalString withPyGUI ''

View File

@ -4,7 +4,7 @@ args@{ fetchgit, stdenv, ncurses, pkgconfig, gettext
, libICE, ... }: with args; , libICE, ... }: with args;
let tag = "20140827"; let tag = "20140827";
sha256 = "02adf2212872db3c5d133642d2c12fbfc28b506e4c0c42552e3d079756f63f65"; sha256 = "0ncgbcm23z25naicxqkblz0mcl1zar2qwgi37y5ar8q8884w9ml2";
in in
let inherit (args.composableDerivation) composableDerivation edf; in let inherit (args.composableDerivation) composableDerivation edf; in

View File

@ -12,7 +12,7 @@ in
src = fetchgit { src = fetchgit {
url = "git://github.com/mkeeter/antimony.git"; url = "git://github.com/mkeeter/antimony.git";
rev = gitRev; rev = gitRev;
sha256 = "19ir3y5ipmfyygcn8mbxika4j3af6dfrv54dvhn6maz7dy8h30f4"; sha256 = "0azjdkbixz2pyk2yy7a0ya5xk60xgw3l2pd4pj4ijyqxx5jmh0sy";
}; };
patches = [ ./paths-fix.patch ]; patches = [ ./paths-fix.patch ];

View File

@ -1,18 +1,19 @@
{ stdenv, makeWrapper, fetchurl, xlibsWrapper, imlib2, libjpeg, libpng { stdenv, makeWrapper, fetchurl, xlibsWrapper, imlib2, libjpeg, libpng
, libXinerama, curl, libexif }: , libXinerama, curl, libexif, perlPackages }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "feh-2.15.2"; name = "feh-2.15.4";
src = fetchurl { src = fetchurl {
url = "http://feh.finalrewind.org/${name}.tar.bz2"; url = "http://feh.finalrewind.org/${name}.tar.bz2";
sha256 = "0bnfk50y2l5zkr292l4yyws1m7ibdmr398vxj7c0djh965frpj1q"; sha256 = "b8a9c29f37b1349228b19866f712b677e2a150837bc46be8c5d6348dd4850758";
}; };
outputs = [ "out" "doc" ]; outputs = [ "out" "doc" ];
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];
buildInputs = [ xlibsWrapper imlib2 libjpeg libpng libXinerama curl libexif ]; buildInputs = [ xlibsWrapper imlib2 libjpeg libpng libXinerama curl libexif ]
++ stdenv.lib.optional doCheck [ perlPackages.TestCommand perlPackages.TestHarness ];
preBuild = '' preBuild = ''
makeFlags="PREFIX=$out exif=1" makeFlags="PREFIX=$out exif=1"
@ -23,6 +24,11 @@ stdenv.mkDerivation rec {
--add-flags '--theme=feh' --add-flags '--theme=feh'
''; '';
checkPhase = ''
PERL5LIB="${perlPackages.TestCommand}/lib/perl5/site_perl" make test
'';
doCheck = true;
meta = { meta = {
description = "A light-weight image viewer"; description = "A light-weight image viewer";
homepage = https://derf.homelinux.org/projects/feh/; homepage = https://derf.homelinux.org/projects/feh/;

View File

@ -25,6 +25,8 @@ stdenv.mkDerivation rec {
sha256 = "06ql3x732x2rlnanv0a8aharsnj91j5kplksg574090rks51z42d"; sha256 = "06ql3x732x2rlnanv0a8aharsnj91j5kplksg574090rks51z42d";
}; };
patches = [ ./deprecated-scopedptr.patch ];
postPatch = '' postPatch = ''
patchShebangs share/extensions patchShebangs share/extensions
'' ''

View File

@ -0,0 +1,16 @@
glibmm deprecated ScopedPtr
---
diff -u src/ui/clipboard.cpp src/ui/clipboard.cpp
--- a/src/ui/clipboard.cpp 2015-01-28 04:32:28.162676000 +0100
+++ b/src/ui/clipboard.cpp 2016-04-03 09:13:12.360980533 +0200
@@ -1402,7 +1402,7 @@
Glib::ustring target;
if (atom_name) {
- target = Glib::ScopedPtr<char>(atom_name).get(); //This frees the gchar*.
+ target = Glib::make_unique_ptr_gfree(atom_name).get(); //This frees the gchar*.
}
listTargets.push_back(target);
Diff finished. Sun Apr 3 09:13:51 2016

View File

@ -0,0 +1,45 @@
{ stdenv, lib, fetchgit, cmake, extra-cmake-modules, makeQtWrapper
, karchive, kconfig, kwidgetsaddons, kcompletion, kcoreaddons
, kguiaddons, ki18n, kitemmodels, kitemviews, kwindowsystem
, kio, kcrash
, boost, libraw, fftw, eigen, exiv2, lcms2, gsl, openexr
, openjpeg, opencolorio, vc, poppler_qt5, curl, ilmbase
}:
stdenv.mkDerivation rec {
name = "krita-${version}";
version = "3.0";
src = fetchgit {
url = "http://phabricator.kde.org/diffusion/KRITA/krita.git";
rev = "refs/tags/v${version}";
sha256 = "0aas86667ncp8jz00c8qk7bm26g76l65cysh06wxr8kxbvqynrdn";
};
nativeBuildInputs = [ cmake extra-cmake-modules makeQtWrapper ];
buildInputs = [
karchive kconfig kwidgetsaddons kcompletion kcoreaddons kguiaddons
ki18n kitemmodels kitemviews kwindowsystem kio kcrash
boost libraw fftw eigen exiv2 lcms2 gsl openexr
openjpeg opencolorio vc poppler_qt5 curl ilmbase
];
NIX_CFLAGS_COMPILE = [ "-I${ilmbase}/include/OpenEXR" ];
enableParallelBuilding = true;
postInstall = ''
for i in $out/bin/*; do
wrapQtProgram "$i"
done
'';
meta = with stdenv.lib; {
description = "A free an open source painting application";
homepage = "https://krita.org/";
maintainers = with maintainers; [ abbradar ];
platforms = platforms.linux;
licenses = licenses.gpl2;
};
}

View File

@ -0,0 +1,78 @@
{ withKDE ? true
, stdenv, fetchurl, gettext, poppler_qt4, qt4
# Qt only (no KDE):
, pkgconfig
# With KDE
, cmake, automoc4, kdelibs
}:
# Warning: You will also need a working pdflatex installation containing (at
# least) auctex and pgf.
assert withKDE -> kdelibs != null;
let
version = "0.10";
qtikz = {
name = "qtikz-${version}";
conf = ''
# installation prefix:
#PREFIX = ""
# install desktop file here (*nix only):
DESKTOPDIR = ''$''${PREFIX}/share/applications
# install mimetype here:
MIMEDIR = ''$''${PREFIX}/share/mime/packages
CONFIG -= debug
CONFIG += release
# qmake command:
QMAKECOMMAND = qmake
# lrelease command:
LRELEASECOMMAND = lrelease
# qcollectiongenerator command:
#QCOLLECTIONGENERATORCOMMAND = qcollectiongenerator
# TikZ documentation default file path:
TIKZ_DOCUMENTATION_DEFAULT = ''$''${PREFIX}/share/doc/texmf/pgf/pgfmanual.pdf.gz
'';
patchPhase = ''
echo "$conf" > conf.pri
'';
configurePhase = ''
qmake PREFIX="$out" ./qtikz.pro
'';
buildInputs = [ gettext qt4 poppler_qt4 pkgconfig ];
};
ktikz = {
name = "ktikz-${version}";
buildInputs = [ kdelibs cmake qt4 automoc4 gettext poppler_qt4 ];
};
common = {
inherit version;
src = fetchurl {
url = "http://www.hackenberger.at/ktikz/ktikz_${version}.tar.gz";
md5 = "e8f0826cba2447250bcdcd389a71a2ac";
};
enableParallelBuilding = true;
meta = with stdenv.lib; {
description = "Editor for the TikZ language";
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ maintainers.layus ];
};
};
in stdenv.mkDerivation (common // (if withKDE then ktikz else qtikz))

View File

@ -58,7 +58,7 @@ buildDotnetPackage rec {
makeWrapperArgs = [ makeWrapperArgs = [
''--prefix MONO_GAC_PREFIX ':' "${gtksharp}"'' ''--prefix MONO_GAC_PREFIX ':' "${gtksharp}"''
''--prefix LD_LIBRARY_PATH ':' "${gtksharp}/lib"'' ''--prefix LD_LIBRARY_PATH ':' "${gtksharp}/lib"''
''--prefix LD_LIBRARY_PATH ':' "${gtksharp.gtk}/lib"'' ''--prefix LD_LIBRARY_PATH ':' "${gtksharp.gtk.out}/lib"''
]; ];
postInstall = '' postInstall = ''

View File

@ -9,7 +9,7 @@ stdenv.mkDerivation rec {
src = fetchgit { src = fetchgit {
url = "https://github.com/GilesBathgate/RapCAD.git"; url = "https://github.com/GilesBathgate/RapCAD.git";
rev = "refs/tags/v${version}"; rev = "refs/tags/v${version}";
sha256 = "15c18jvgbwyrfhv7r35ih0gzx35vjlsbi984h1sckgh2z17hjq8l"; sha256 = "1i5h4sw7mdbpdbssmbjccwgidndrsc606zz4wy9pjsg2wzrabw7x";
}; };
buildInputs = [ qtbase qmakeHook cgal boost gmp mpfr flex bison dxflib readline mesa_glu ]; buildInputs = [ qtbase qmakeHook cgal boost gmp mpfr flex bison dxflib readline mesa_glu ];

View File

@ -3,7 +3,7 @@
callPackage ./generic.nix (args // { callPackage ./generic.nix (args // {
version = "2016-05-09"; version = "2016-05-09";
src = fetchgit { src = fetchgit {
sha256 = "5e3d647503d1231395a6782c6aa536b52b3d45585a87a0600ce0aca8b422cf82"; sha256 = "17y2l59vz2l0y5ya89390x6lim75p1mp8s5c2wzp9l4d5fy8j8dd";
rev = "1e013654cc3af09f4731ab9ec8d8324d03a7de4a"; rev = "1e013654cc3af09f4731ab9ec8d8324d03a7de4a";
url = "git://alioth.debian.org/git/sane/sane-backends.git"; url = "git://alioth.debian.org/git/sane/sane-backends.git";
}; };

View File

@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
wrapProgram $out/bin/shutter \ wrapProgram $out/bin/shutter \
--set PERL5LIB "${stdenv.lib.makePerlPath perlModules}" \ --set PERL5LIB "${stdenv.lib.makePerlPath perlModules}" \
--prefix PATH : "${imagemagick}/bin" \ --prefix PATH : "${imagemagick.out}/bin" \
--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE"
''; '';

View File

@ -5,7 +5,7 @@ stdenv.mkDerivation {
name = "solvespace-2.0"; name = "solvespace-2.0";
src = fetchgit { src = fetchgit {
url = "https://github.com/jwesthues/solvespace.git"; url = "https://github.com/jwesthues/solvespace.git";
sha256 = "0sakxkmj2f0k27f67wy1xz2skpnwzg15yqrf7av97pgc5s8xb3da"; sha256 = "0m6zlx1kiqxkm6szdsnywwr6spnb7xjg6vqsq30nrr44cx37w861";
rev = "e587d0e"; rev = "e587d0e";
}; };

View File

@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
cat >> "$out/bin/avrdudess" << __EOF__ cat >> "$out/bin/avrdudess" << __EOF__
#!${stdenv.shell} #!${stdenv.shell}
export LD_LIBRARY_PATH="${gtk}/lib:${mono}/lib" export LD_LIBRARY_PATH="${stdenv.lib.makeLibraryPath [gtk mono]}"
# We need PATH from user env for xdg-open to find its tools, which # We need PATH from user env for xdg-open to find its tools, which
# typically depend on the currently running desktop environment. # typically depend on the currently running desktop environment.
export PATH="${avrgcclibc}/bin:${avrdude}/bin:${xdg_utils}/bin:\$PATH" export PATH="${avrgcclibc}/bin:${avrdude}/bin:${xdg_utils}/bin:\$PATH"

View File

@ -5,12 +5,12 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "2.57.1"; version = "2.58.0";
name = "calibre-${version}"; name = "calibre-${version}";
src = fetchurl { src = fetchurl {
url = "http://download.calibre-ebook.com/${version}/${name}.tar.xz"; url = "http://download.calibre-ebook.com/${version}/${name}.tar.xz";
sha256 = "0bgkm2cf1icx73v7r6njkx31jdm3l7psnfwd9kjqc21p7ii70h11"; sha256 = "0npqvfjqj1vwa7nmnsyd4d30z40brydw275ldf1jankrp6dr9dyd";
}; };
inherit python; inherit python;

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