diff --git a/.version b/.version
index 07167f90842e05d9609d89c409e23df59ac786c2..af805b45bd8dde117ee661e83a282e9a24ccda1c 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-14.02
\ No newline at end of file
+14.04
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8ded8807ede9deec3851eea9a8aa483aa8b3455b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,10 @@
+Nixpkgs is a collection of packages for [Nix](http://nixos.org/nix/) package
+manager. Nixpkgs also includes [NixOS](http://nixos.org/nixos/) linux distribution source code.
+
+* [NixOS installation instructions](http://nixos.org/nixos/manual/#installing-nixos)
+* [Manual (How to write packages for Nix)](http://nixos.org/nixpkgs/manual/)
+* [Manual (NixOS)](http://nixos.org/nixos/manual/)
+* [Continuous build](http://hydra.nixos.org/jobset/nixos/trunk-combined)
+* [Tests](http://hydra.nixos.org/job/nixos/trunk-combined/tested#tabs-constituents)
+* [Mailing list](http://lists.science.uu.nl/mailman/listinfo/nix-dev)
+* [IRC - #nixos on freenode.net](irc://irc.freenode.net/#nixos)
diff --git a/default.nix b/default.nix
index 9d5764a6307f11b0f91e45e066ebffe66c7d5494..c1b9bfd39f92aa324c4d3aa36e89770880b8bf44 100644
--- a/default.nix
+++ b/default.nix
@@ -1 +1,7 @@
-import ./pkgs/top-level/all-packages.nix
+if ! builtins ? nixVersion || builtins.compareVersions "1.6" builtins.nixVersion == 1 then
+
+ abort "This version of Nixpkgs requires Nix >= 1.6, please upgrade!"
+
+else
+
+ import ./pkgs/top-level/all-packages.nix
diff --git a/doc/coding-conventions.xml b/doc/coding-conventions.xml
index e55f86ae3d31f92719bba105b4a38a0cdc0f57b0..61d373738f90026e19946fce64ff19a6aab02681 100644
--- a/doc/coding-conventions.xml
+++ b/doc/coding-conventions.xml
@@ -235,12 +235,7 @@ Most of the time, these are the same. For instance, the package
bound to the variable name e2fsprogs in
all-packages.nix, and the Nix expression is in
pkgs/os-specific/linux/e2fsprogs/default.nix.
-However, identifiers in the Nix language don’t allow certain
-characters (e.g. dashes), so sometimes a different variable name
-should be used. For instance, the
-module-init-tools package is bound to the
-module_init_tools variable in
-all-packages.nix.
+
There are a few naming guidelines:
@@ -261,17 +256,20 @@ should be used. For instance, the
a package named hello-svn by
nix-env.
- Dashes in the package name should be changed to
- underscores in variable names, rather than to camel case — e.g.,
- module_init_tools instead of
- moduleInitTools.
+ Dashes in the package name should be preserved
+ in new variable names, rather than converted to underscores
+ (which was convention up to around 2013 and most names
+ still have underscores instead of dashes) — e.g.,
+ http-parser instead of
+ http_parser.
If there are multiple versions of a package, this
should be reflected in the variable names in
all-packages.nix,
- e.g. hello_0_3 and hello_0_4.
+ e.g. json-c-0-9 and json-c-0-11.
If there is an obvious “default” version, make an attribute like
- hello = hello_0_4;.
+ json-c = json-c-0-9;.
+ See also
@@ -288,7 +286,7 @@ dashes between words — not in camel case. For instance, it should be
allPackages.nix or
AllPackages.nix.
-Hierachy
+Hierarchy
Each package should be stored in its own directory somewhere in
the pkgs/ tree, i.e. in
@@ -567,7 +565,7 @@ splitting up an existing category.
-Versioning
+Versioning
Because every version of a package in Nixpkgs creates a
potential maintenance burden, old versions of a package should not be
diff --git a/doc/language-support.xml b/doc/language-support.xml
index 69361e3be6c32e53f21da7a54ca3b823f611ca52..f5e89df57fcce28537b1b307f35d3a778d76dfa4 100644
--- a/doc/language-support.xml
+++ b/doc/language-support.xml
@@ -108,7 +108,7 @@ a preConfigure hook to generate a configuration
file used by Makefile.PL:
-{buildPerlPackage, fetchurl, db4}:
+{buildPerlPackage, fetchurl, db}:
buildPerlPackage rec {
name = "BerkeleyDB-0.36";
@@ -119,8 +119,8 @@ buildPerlPackage rec {
};
preConfigure = ''
- echo "LIB = ${db4}/lib" > config.in
- echo "INCLUDE = ${db4}/include" >> config.in
+ echo "LIB = ${db}/lib" > config.in
+ echo "INCLUDE = ${db}/include" >> config.in
'';
}
diff --git a/doc/meta.xml b/doc/meta.xml
index 00e9b8ac67a170023b8521f285b10e69e273f850..6c8e458509a7dba96d4f56301ee8a972bb8248a4 100644
--- a/doc/meta.xml
+++ b/doc/meta.xml
@@ -164,7 +164,7 @@ meta.hydraPlatforms = [];
If set to true, the package is
marked as “broken”, meaning that it won’t show up in
nix-env -qa, and cannot be built or installed.
- Sush packages should be removed from Nixpkgs eventually unless
+ Such packages should be removed from Nixpkgs eventually unless
they are fixed.
diff --git a/doc/outline.txt b/doc/outline.txt
deleted file mode 100644
index 816cdbdc3ed7eae22f5267b56ef20671653c2c44..0000000000000000000000000000000000000000
--- a/doc/outline.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-- The standard environment
-
- (Some of this can be moved from the Nix manual)
-
- - Special attributes
-
- - Generic builder
-
- - Helper functions
-
- - GCC / ld wrapper (+ env vars)
-
- - Phases (+ how to add phases) and hooks
-
- - Override functions for stdenv
-
- - Overriding GCC
-
- - Overriding the setup script
-
- - Predefined override functions in all-packages.nix: static binary
- stdenv, dietlibc stdenv
-
- - Stdenv bootstrap; how to update the Linux bootstrap binaries
-
- - Specific platform notes (Linux, Native, Cygwin, Mingw)
-
-
-- Support for specific languages
-
- - Perl
-
- - Generic Perl builder
-
- - Python
-
- - Wrapper generation
-
- - Haskell
-
- - TODO
-
- - Java
-
- - TODO; Java needs lots of improvement
-
- - TeX/LaTeX
-
- - Special support for building TeX documents
-
-
-- Special kinds of applications
-
- - OpenGL apps
-
- - Binary-only apps
-
- - Linux kernel modules
-
- - Mozilla plugins/extensions
-
- - X apps
-
- - KDE apps
-
- - GConf-based apps
-
- - Programs that need wrappers
-
- - makeWrapper etc.
-
- - Initial ramdisks
-
-
-- Library functions
-
- - i.e. in lib/default.nix
-
-
-- Specific package notes
-
- - Linux kernel; how to update; feature tests
-
- - X.org; how to update
-
- - Gnome; how to update
-
- - GCC?
-
- - GHC?
-
- - ...
-
-
-- Meta attributes
-
- - License attr; possible values
-
-
-- Virtual machine support (for the build farm)
-
- - vmtools
-
- - KVM notes
-
- - Performing a build in a VM
-
- - In the host FS
-
- - In a disk image
-
- - RPM builds
-
- - RPM image creation
-
- - Deb builds
-
- - Deb image creation
-
- - Debugging VM builds
-
-
-- Guidelines for Nixpkgs contributions
-
- - File naming conventions
-
- - Versioning of packages
-
- - Tree organisation
-
- - Variable naming
-
- - Layout / indentations style
-
- - Output FS hierarchy (e.g. $out/share/man instead of $out/man)
-
-
-- Misc
-
- - Building outside of the Nixpkgs tree
-
- - Config options
-
- - Downloading stuff
-
- - fetchurl
-
- - mirror:// scheme
-
- - fetchsvn
-
- - fetchcvs
-
- - fetchdarcs
-
-
-- Appendix: Nixpkgs config options
-
diff --git a/doc/quick-start.xml b/doc/quick-start.xml
index 35983f0b114a1ae21ca2d5372f36ed238f4a1d5a..49c674052b95d42d6d9695ae9cbde0eb1e3aadce 100644
--- a/doc/quick-start.xml
+++ b/doc/quick-start.xml
@@ -71,7 +71,7 @@ $ git add pkgs/development/libraries/libfoo/default.nix
GNU Multiple Precision arithmetic library (GMP): pkgs/development/libraries/gmp/5.1.1.nix.
+ xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/gmp/5.1.x.nix">pkgs/development/libraries/gmp/5.1.x.nix.
Also done by the generic builder, but has a dependency on
m4.
diff --git a/doc/stdenv.xml b/doc/stdenv.xml
index f0cabe425a3d60d4848cddaaff02a0a46f6ab8e8..74eb63b4b4983afb7e874a84a422cd283b57c7ec 100644
--- a/doc/stdenv.xml
+++ b/doc/stdenv.xml
@@ -298,6 +298,13 @@ executed and in what order:
+
+ preFixupPhases
+
+ Additional phases executed just before the fixup phase.
+
+
+
preDistPhases
@@ -1156,12 +1163,27 @@ echo @foo@
to Qt’s path.
+
+ gdk-pixbuf
+ Exports GDK_PIXBUF_MODULE_FILE
+ environment variable the the builder. Add librsvg package
+ to buildInputs to get svg support.
+
+
GHC
Creates a temporary package database and registers
every Haskell build input in it (TODO: how?).
+
+ GStreamer
+ Adds the
+ GStreamer plugins subdirectory of
+ each build input to the GST_PLUGIN_SYSTEM_PATH_1_0 or
+ GST_PLUGIN_SYSTEM_PATH environment variable.
+
+
diff --git a/lib/licenses.nix b/lib/licenses.nix
index b13a72f3f644200bc66eed4e0b5c4c58a03910b9..20c1b2200315ff7f1be8c1d4844acc84dbe84012 100644
--- a/lib/licenses.nix
+++ b/lib/licenses.nix
@@ -25,19 +25,15 @@
amd = {
shortName = "amd";
fullName = "AMD License Agreement";
- url = "http://developer.amd.com/amd-license-agreement/";
- };
+ url = http://developer.amd.com/amd-license-agreement/;
+ };#
- amdadl = {
- shortName = "amd-adl";
- fullName = "amd-adl license";
- url = "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/AMD-ADL?revision=1.1";
+ apsl20 = {
+ shortName = "APSL 2.0";
+ fullName = "Apple Public Source License 2.0";
+ url = http://opensource.org/licenses/APSL-2.0;
};
- # Apple Public Source License 2.0;
- # http://opensource.org/licenses/APSL-2.0
- apsl20 = "APSL 2.0";
-
asl20 = {
shortName = "ASL2.0";
fullName = "Apache Software License 2.0";
@@ -68,6 +64,12 @@
url = https://fedoraproject.org/wiki/Licensing/BSD;
};
+ cc-by-30 = {
+ shortName = "CC BY 3.0";
+ fullName = "Creative Commons Attribution 3.0";
+ url = http://creativecommons.org/licenses/by/3.0;
+ };
+
cddl = {
shortName = "CDDL";
fullName = "Common Development Distribution License ";
@@ -86,7 +88,11 @@
url = http://www.eclipse.org/legal/epl-v10.html;
};
- gpl2 = "GPLv2";
+ gpl2 = {
+ shortName = "GPLv2";
+ fullName = "GNU General Public License version 2";
+ url = http://www.gnu.org/licenses/old-licenses/gpl-2.0.html;
+ };
gpl2Oss = {
shortName = "GPLv2+OSS";
@@ -94,9 +100,11 @@
url = http://www.mysql.com/about/legal/licensing/foss-exception;
};
- # GNU General Public License version 2 or later;
- # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- gpl2Plus = "GPLv2+";
+ gpl2Plus = {
+ shortName = "GPLv2+";
+ fullName = "GNU General Public License version 2 or later";
+ url = http://www.gnu.org/licenses/old-licenses/gpl-2.0.html;
+ };
gpl3 = {
shortName = "GPLv3";
@@ -140,7 +148,11 @@
url = https://fedoraproject.org/wiki/Licensing/libtiff;
};
- lgpl2 = "LGPLv2";
+ lgpl2 = {
+ shortName = "LGPLv2";
+ fullName = "GNU Library General Public License version 2";
+ url = http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html;
+ };
lgpl2Plus = {
shortName = "LGPLv2+";
@@ -148,7 +160,11 @@
url = http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html;
};
- lgpl21 = "LGPLv2.1";
+ lgpl21 = {
+ shortName = "LGPLv2.1";
+ fullName = "GNU Lesser General Public License version 2.1";
+ url = http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html;
+ };
lgpl21Plus = {
shortName = "LGPLv2.1+";
@@ -238,4 +254,10 @@
fullName = "Zope Public License 2.1";
url = "http://old.zope.org/Resources/License/ZPL-2.1";
};
+
+ sleepycat = {
+ shortName = "Sleepycat";
+ fullName = "Sleepycat Public License";
+ url = "https://en.wikipedia.org/wiki/Sleepycat_License";
+ };
}
diff --git a/lib/lists.nix b/lib/lists.nix
index 71a897027962be690e99f94db41acec1f082b716..4b5f04a67585afe628d791c1371e5568701c6ac2 100644
--- a/lib/lists.nix
+++ b/lib/lists.nix
@@ -226,4 +226,5 @@ in rec {
deepSeqList = xs: y: if any (x: deepSeq x false) xs then y else y;
crossLists = f: foldl (fs: args: concatMap (f: map f args) fs) [f];
+
}
diff --git a/lib/maintainers.nix b/lib/maintainers.nix
index c29259c6386cc5f21235b7dc5ed50724a87f3b37..78355eff00453ffb69b15e9ba88b2f9e51d161a7 100644
--- a/lib/maintainers.nix
+++ b/lib/maintainers.nix
@@ -4,35 +4,46 @@
/* Add your name and email address here. Keep the list
alphabetically sorted. */
+ _1126 = "Christian Lask ";
aforemny = "Alexander Foremny ";
+ akc = "Anders Claesson ";
algorith = "Dries Van Daele ";
all = "Nix Committers ";
amiddelk = "Arie Middelkoop ";
amorsillo = "Andrew Morsillo ";
+ AndersonTorres = "Anderson Torres ";
andres = "Andres Loeh ";
antono = "Antono Vasiljev ";
astsmtl = "Alexander Tsamutali ";
aszlig = "aszlig ";
bbenoist = "Baptist BENOIST ";
+ bennofs = "Benno Fünfstück ";
bjg = "Brian Gough ";
bjornfor = "Bjørn Forsman ";
bluescreen303 = "Mathijs Kwik ";
bodil = "Bodil Stokke ";
+ calrama = "Moritz Maxeiner ";
chaoflow = "Florian Friesdorf ";
coconnor = "Corey O'Connor ";
coroa = "Jonas Hörsch ";
edwtjo = "Edward Tjörnhammar ";
eelco = "Eelco Dolstra ";
- ertes = "Ertugrul Söylemez ";
+ emery = "Emery Hemingawy ";
+ ertes = "Ertugrul Söylemez ";
+ falsifian = "James Cook ";
garbas = "Rok Garbas ";
goibhniu = "Cillian de Róiste ";
guibert = "David Guibert ";
+ hinton = "Tom Hinton ";
ianwookim = "Ian-Woo Kim ";
iElectric = "Domen Kozar ";
iyzsong = "Song Wenwu ";
jcumming = "Jack Cummings ";
+ jwiegley = "John Wiegley ";
kkallio = "Karn Kallio ";
ktosiek = "Tomasz Kontusz ";
+ lethalman = "Luca Bruno ";
+ linquize = "Linquize ";
lovek323 = "Jason O'Conal ";
ludo = "Ludovic Courtès ";
madjar = "Georges Dubus ";
@@ -40,6 +51,7 @@
matejc = "Matej Cotman ";
modulistic = "Pablo Costa ";
mornfall = "Petr Ročkai ";
+ msackman = "Matthew Sackman ";
ocharles = "Oliver Charles ";
offline = "Jaka Hudoklin ";
orbitz = "Malcolm Matalka ";
@@ -47,26 +59,34 @@
phreedom = "Evgeny Egorochkin ";
pierron = "Nicolas B. Pierron ";
piotr = "Piotr Pietraszkiewicz ";
+ pkmx = "Chih-Mao Chen ";
pSub = "Pascal Wittmann ";
qknight = "Joachim Schiele ";
raskin = "Michael Raskin <7c6f434c@mail.ru>";
+ redbaron = "Maxim Ivanov ";
rickynils = "Rickard Nilsson ";
rob = "Rob Vermaas ";
roconnor = "Russell O'Connor ";
roelof = "Roelof Wobben ";
+ romildo = "José Romildo Malaquias ";
+ rszibele = "Richard Szibele ";
sander = "Sander van der Burg ";
shlevy = "Shea Levy ";
simons = "Peter Simons ";
smironov = "Sergey Mironov ";
+ sprock = "Roger Mason ";
thammers = "Tobias Hammerschmidt ";
the-kenny = "Moritz Ulrich ";
+ thoughtpolice = "Austin Seipp ";
tomberek = "Thomas Bereknyei ";
+ ttuegel = "Thomas Tuegel ";
urkud = "Yury G. Kudryashov ";
vcunat = "Vladimír Čunát ";
viric = "Lluís Batlle i Rossell ";
vizanto = "Danny Wilson ";
vlstill = "Vladimír Štill ";
winden = "Antonio Vargas Gonzalez ";
+ wizeman = "Ricardo M. Correia ";
z77z = "Marco Maggesi ";
zef = "Zef Hemel ";
zimbatm = "zimbatm ";
diff --git a/lib/meta.nix b/lib/meta.nix
index 74e9cfb411c4e3103465370fe898176af90387af..44e3cc011f187b6dbf5e89a6decf4709674cd9dc 100644
--- a/lib/meta.nix
+++ b/lib/meta.nix
@@ -14,7 +14,7 @@ rec {
addMetaAttrs {description = "Bla blah";} somePkg
*/
addMetaAttrs = newAttrs: drv:
- drv // { meta = (if drv ? meta then drv.meta else {}) // newAttrs; };
+ drv // { meta = (drv.meta or {}) // newAttrs; };
/* Change the symbolic name of a package for presentation purposes
@@ -31,11 +31,10 @@ rec {
updateName = updater: drv: drv // {name = updater (drv.name);};
- /* Append a suffix to the name of a package. !!! the suffix should
- really be appended *before* the version, at least most of the
- time.
- */
- appendToName = suffix: updateName (name: "${name}-${suffix}");
+ /* Append a suffix to the name of a package (before the version
+ part). */
+ appendToName = suffix: updateName (name:
+ let x = builtins.parseDrvName name; in "${x.name}-${suffix}-${x.version}");
/* Apply a function to each derivation and only to derivations in an attrset
@@ -51,7 +50,7 @@ rec {
/* Apply lowPrio to an attrset with derivations
*/
- lowPrioSet = set: mapDerivationAttrset lowPrio set;
+ lowPrioSet = set: mapDerivationAttrset lowPrio set;
/* Increase the nix-env priority of the package, i.e., this
@@ -63,5 +62,5 @@ rec {
/* Apply hiPrio to an attrset with derivations
*/
hiPrioSet = set: mapDerivationAttrset hiPrio set;
-
+
}
diff --git a/lib/modules.nix b/lib/modules.nix
index fa31ce6399ce351742a730535a17aab7dfc4aef5..017c9255246fdaa213ec2da40b0be218542cfa4f 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -12,7 +12,7 @@ rec {
and ‘config’: the nested set of all option values. */
evalModules = { modules, prefix ? [], args ? {}, check ? true }:
let
- args' = args // result;
+ args' = args // { lib = import ./.; } // result;
closed = closeModules modules args';
# Note: the list of modules is reversed to maintain backward
# compatibility with the old module system. Not sure if this is
@@ -155,8 +155,14 @@ rec {
let
# Process mkOverride properties, adding in the default
# value specified in the option declaration (if any).
- defsFinal = filterOverrides
+ defsFinal' = filterOverrides
((if opt ? default then [{ file = head opt.declarations; value = mkOptionDefault opt.default; }] else []) ++ defs);
+ # Sort mkOrder properties.
+ defsFinal =
+ # Avoid sorting if we don't have to.
+ if any (def: def.value._type or "" == "order") defsFinal'
+ then sortProperties defsFinal'
+ else defsFinal';
files = map (def: def.file) defsFinal;
# Type-check the remaining definitions, and merge them if
# possible.
@@ -180,7 +186,7 @@ rec {
};
/* Given a config set, expand mkMerge properties, and push down the
- mkIf properties into the children. The result is a list of
+ other properties into the children. The result is a list of
config sets that do not have properties at top-level. For
example,
@@ -201,7 +207,7 @@ rec {
map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content)
else if cfg._type or "" == "override" then
map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content)
- else
+ else # FIXME: handle mkOrder?
[ cfg ];
/* Given a config value, expand mkMerge properties, and discharge
@@ -253,6 +259,19 @@ rec {
strip = def: if def.value._type or "" == "override" then def // { value = def.value.content; } else def;
in concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs;
+ /* Sort a list of properties. The sort priority of a property is
+ 1000 by default, but can be overriden by wrapping the property
+ using mkOrder. */
+ sortProperties = defs:
+ let
+ strip = def:
+ if def.value._type or "" == "order"
+ then def // { value = def.value.content; inherit (def.value) priority; }
+ else def;
+ defs' = map strip defs;
+ compare = a: b: (a.priority or 1000) < (b.priority or 1000);
+ in sort compare defs';
+
/* Hack for backward compatibility: convert options of type
optionSet to configOf. FIXME: remove eventually. */
fixupOptionType = loc: opt:
@@ -302,8 +321,13 @@ rec {
mkFixStrictness = id; # obsolete, no-op
- # FIXME: Add mkOrder back in. It's not currently used anywhere in
- # NixOS, but it should be useful.
+ mkOrder = priority: content:
+ { _type = "order";
+ inherit priority content;
+ };
+
+ mkBefore = mkOrder 500;
+ mkAfter = mkOrder 1500;
/* Compatibility. */
diff --git a/lib/sources.nix b/lib/sources.nix
index 6f8554d340be359bd03c563b54fcbcdfafa95eca..a80e4397d6a4e0025227af2c2548892b8f8e210f 100644
--- a/lib/sources.nix
+++ b/lib/sources.nix
@@ -10,9 +10,12 @@ rec {
cleanSource =
let filter = name: type: let baseName = baseNameOf (toString name); in ! (
# Filter out Subversion and CVS directories.
- (type == "directory" && (baseName == ".git" || baseName == ".svn" || baseName == "CVS")) ||
+ (type == "directory" && (baseName == ".git" || baseName == ".svn" || baseName == "CVS" || baseName == ".hg")) ||
# Filter out backup files.
- (lib.hasSuffix "~" baseName)
+ lib.hasSuffix "~" baseName ||
+ # Filter out generates files.
+ lib.hasSuffix ".o" baseName ||
+ lib.hasSuffix ".so" baseName
);
in src: builtins.filterSource filter src;
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 760a74ce66642a070fd9dd229204993c84fc0660..e073da4900cc0a1d2b9d40afd79a4928e7876d06 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -41,4 +41,13 @@ rec {
pathExists readFile isBool isFunction
isInt add sub lessThan;
+ # Return the Nixpkgs version number.
+ nixpkgsVersion =
+ let suffixFile = ../.version-suffix; in
+ readFile ../.version
+ + (if pathExists suffixFile then readFile suffixFile else "pre-git");
+
+ # Whether we're being called by nix-shell. This is useful to
+ inNixShell = builtins.getEnv "IN_NIX_SHELL" == "1";
+
}
diff --git a/lib/types.nix b/lib/types.nix
index bdd21f1239527ae04433167981d4742b9b13c408..baf8aa5e5743ca0002f2f3a0e91d757414198c40 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -10,7 +10,6 @@ with import ./strings.nix;
rec {
isType = type: x: (x._type or "") == type;
- typeOf = x: x._type or "";
setType = typeName: value: value // {
_type = typeName;
@@ -132,7 +131,7 @@ rec {
{ inherit (def) file;
value = listToAttrs (
imap (elemIdx: elem:
- { name = "unnamed-${toString defIdx}.${toString elemIdx}";
+ { name = elem.name or "unnamed-${toString defIdx}.${toString elemIdx}";
value = elem;
}) def.value);
}
diff --git a/maintainers/scripts/copy-tarball.sh b/maintainers/scripts/copy-tarball.sh
deleted file mode 100755
index 792071c129b931023d85af8ed9df7af83c87d61e..0000000000000000000000000000000000000000
--- a/maintainers/scripts/copy-tarball.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#! /bin/sh -e
-
-distDir=${NIX_TARBALLS_CACHE:-/tarballs}
-
-url="$1"
-file="$2"
-if [ -z "$url" ]; then echo "syntax: $0 URL"; exit 0; fi
-
-base="$(basename "$url")"
-if [ -z "$base" ]; then echo "bad URL"; exit 1; fi
-dstPath="$distDir/$base"
-
-if [ -e "$dstPath" ]; then if [ -n "$VERBOSE" ]; then echo "$dstPath already exists"; fi; exit 0; fi
-
-if [ -z "$file" ]; then
-
- echo "downloading $url to $dstPath"
-
- if [ -n "$DRY_RUN" ]; then exit 0; fi
-
- declare -a res
- if ! res=($(PRINT_PATH=1 nix-prefetch-url "$url")); then
- exit
- fi
-
- storePath=${res[1]}
-
-else
- storePath="$file"
-fi
-
-cp $storePath "$dstPath.tmp.$$"
-mv -f "$dstPath.tmp.$$" "$dstPath"
-
-echo "hashing $dstPath"
-
-md5=$(nix-hash --flat --type md5 "$dstPath")
-ln -sfn "../$base" $distDir/md5/$md5
-
-sha1=$(nix-hash --flat --type sha1 "$dstPath")
-ln -sfn "../$base" $distDir/sha1/$sha1
-
-sha256=$(nix-hash --flat --type sha256 "$dstPath")
-ln -sfn "../$base" $distDir/sha256/$sha256
-ln -sfn "../$base" $distDir/sha256/$(nix-hash --type sha256 --to-base32 "$sha256")
diff --git a/maintainers/scripts/copy-tarballs.pl b/maintainers/scripts/copy-tarballs.pl
new file mode 100755
index 0000000000000000000000000000000000000000..0746fb21069d6dd86b57378079261f0005eb5a42
--- /dev/null
+++ b/maintainers/scripts/copy-tarballs.pl
@@ -0,0 +1,95 @@
+#! /run/current-system/sw/bin/perl -w
+
+use strict;
+use XML::Simple;
+use File::Basename;
+use File::Path;
+use File::Copy 'cp';
+use IPC::Open2;
+use Nix::Store;
+
+my $myDir = dirname($0);
+
+my $tarballsCache = $ENV{'NIX_TARBALLS_CACHE'} // "/tarballs";
+
+my $xml = `nix-instantiate --eval-only --xml --strict ''`;
+die "$0: evaluation failed\n" if $? != 0;
+
+my $data = XMLin($xml) or die;
+
+mkpath($tarballsCache);
+mkpath("$tarballsCache/md5");
+mkpath("$tarballsCache/sha1");
+mkpath("$tarballsCache/sha256");
+
+foreach my $file (@{$data->{list}->{attrs}}) {
+ my $url = $file->{attr}->{url}->{string}->{value};
+ my $algo = $file->{attr}->{type}->{string}->{value};
+ my $hash = $file->{attr}->{hash}->{string}->{value};
+
+ if ($url !~ /^http:/ && $url !~ /^https:/ && $url !~ /^ftp:/ && $url !~ /^mirror:/) {
+ print STDERR "skipping $url (unsupported scheme)\n";
+ next;
+ }
+
+ $url =~ /([^\/]+)$/;
+ my $fn = $1;
+
+ if (!defined $fn) {
+ print STDERR "skipping $url (no file name)\n";
+ next;
+ }
+
+ if ($fn =~ /[&?=%]/ || $fn =~ /^\./) {
+ print STDERR "skipping $url (bad character in file name)\n";
+ next;
+ }
+
+ if ($fn !~ /[a-zA-Z]/) {
+ print STDERR "skipping $url (no letter in file name)\n";
+ next;
+ }
+
+ if ($fn !~ /[0-9]/) {
+ print STDERR "skipping $url (no digit in file name)\n";
+ next;
+ }
+
+ if ($fn !~ /[-_\.]/) {
+ print STDERR "skipping $url (no dash/dot/underscore in file name)\n";
+ next;
+ }
+
+ my $dstPath = "$tarballsCache/$fn";
+
+ next if -e $dstPath;
+
+ print "downloading $url to $dstPath...\n";
+
+ next if $ENV{DRY_RUN};
+
+ $ENV{QUIET} = 1;
+ $ENV{PRINT_PATH} = 1;
+ my $fh;
+ my $pid = open($fh, "-|", "nix-prefetch-url", "--type", $algo, $url, $hash) or die;
+ waitpid($pid, 0) or die;
+ if ($? != 0) {
+ print STDERR "failed to fetch $url: $?\n";
+ last if $? >> 8 == 255;
+ next;
+ }
+ <$fh>; my $storePath = <$fh>; chomp $storePath;
+
+ die unless -e $storePath;
+
+ cp($storePath, $dstPath) or die;
+
+ my $md5 = hashFile("md5", 0, $storePath) or die;
+ symlink("../$fn", "$tarballsCache/md5/$md5");
+
+ my $sha1 = hashFile("sha1", 0, $storePath) or die;
+ symlink("../$fn", "$tarballsCache/sha1/$sha1");
+
+ my $sha256 = hashFile("sha256", 0, $storePath) or die;
+ symlink("../$fn", "$tarballsCache/sha256/$sha256");
+}
diff --git a/maintainers/scripts/copy-tarballs.sh b/maintainers/scripts/copy-tarballs.sh
deleted file mode 100755
index a261f81758593b1c04565e2f8707782e707a612e..0000000000000000000000000000000000000000
--- a/maintainers/scripts/copy-tarballs.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /bin/sh -e
-
-urls=$(nix-instantiate --eval-only --xml --strict '' \
- | grep -A2 'name="urls"' \
- | grep ' \$filter,
"maintainer|m=s" => \$maintainer,
"file|f=s" => \$path,
"help" => sub { showHelp() }
- )
- or die("syntax: $0 ...\n");
+ ) or exit 1;
# Evaluate Nixpkgs into an XML representation.
my $xml = `nix-env -f '$path' -qa '$filter' --xml --meta --drv-path`;
diff --git a/nixos/.topmsg b/nixos/.topmsg
deleted file mode 100644
index 9632e5926312c995e9b5254cc8cad03c08bb4497..0000000000000000000000000000000000000000
--- a/nixos/.topmsg
+++ /dev/null
@@ -1 +0,0 @@
-improvements to vsftpd module
diff --git a/nixos/doc/manual/configuration.xml b/nixos/doc/manual/configuration.xml
index e6d7dee251afbe94e88155ae113d262339259e9f..0ffee826dc492b39664480b1eabe06f4ba45cded 100644
--- a/nixos/doc/manual/configuration.xml
+++ b/nixos/doc/manual/configuration.xml
@@ -237,7 +237,7 @@ postgresql.package = pkgs.postgresql90;
-Abstractions
+Abstractions
If you find yourself repeating yourself over and over, it’s time
to abstract. Take, for instance, this Apache HTTP Server configuration:
@@ -399,7 +399,7 @@ of an expression to be spliced into a string.
-Modularity
+Modularity
The NixOS configuration mechanism is modular. If your
configuration.nix becomes too big, you can split
@@ -443,8 +443,20 @@ Note that both configuration.nix and
define an option, NixOS will try to merge the
definitions. In the case of
, that’s easy: the lists of
-packages can simply be concatenated. For other types of options, a
-merge may not be possible: for instance, if two modules define
+packages can simply be concatenated. The value in
+configuration.nix is merged last, so for
+list-type options, it will appear at the end of the merged list. If
+you want it to appear first, you can use mkBefore:
+
+
+boot.kernelModules = mkBefore [ "kvm-intel" ];
+
+
+This causes the kvm-intel kernel module to be
+loaded before any other kernel modules.
+
+For other types of options, a merge may not be possible. For
+instance, if two modules define
,
nixos-rebuild will give an error:
@@ -526,7 +538,7 @@ nix-repl> map (x: x.hostName) config.services.httpd.virtualHosts
-Syntax summary
+Syntax summary
Below is a summary of the most important syntactic constructs in
the Nix expression language. It’s not complete. In particular, there
@@ -718,7 +730,7 @@ manual for the rest.
-Package management
+Package management
This section describes how to add additional packages to your
system. NixOS has two distinct styles of package management:
@@ -923,7 +935,7 @@ environment.systemPackages = [ (import ./my-hello.nix) ];
where my-hello.nix contains:
-with <nixpkgs> {}; # bring all of Nixpkgs into scope
+with import <nixpkgs> {}; # bring all of Nixpkgs into scope
stdenv.mkDerivation rec {
name = "hello-2.8";
@@ -1025,7 +1037,6 @@ users.extraUsers.alice =
home = "/home/alice";
description = "Alice Foobar";
extraGroups = [ "wheel" ];
- isSystemUser = false;
useDefaultShell = true;
openssh.authorizedKeys.keys = [ "ssh-dss AAAAB3Nza... alice@foobar" ];
};
@@ -1172,7 +1183,7 @@ fileSystems."/".device = "/dev/mapper/crypted";
-X Window System
+X Window System
The X Window System (X11) provides the basis of NixOS’ graphical
user interface. It can be enabled as follows:
@@ -1184,7 +1195,7 @@ driver from a set of X.org drivers (such as vesa
and intel). You can also specify a driver
manually, e.g.
-services.xserver.videoDrivers = [ "r128" ];
+hardware.opengl.videoDrivers = [ "r128" ];
to enable X.org’s xf86-video-r128 driver.
@@ -1227,7 +1238,7 @@ $ systemctl start display-manager.service
has better 3D performance than the X.org drivers. It is not enabled
by default because it’s not free software. You can enable it as follows:
-services.xserver.videoDrivers = [ "nvidia" ];
+hardware.opengl.videoDrivers = [ "nvidia" ];
You may need to reboot after enabling this driver to prevent a clash
with other kernel modules.
@@ -1264,9 +1275,9 @@ services.xserver.synaptics.twoFingerScroll = true;
-Networking
+Networking
-Secure shell access
+Secure shell access
Secure shell (SSH) access to your machine can be enabled by
setting:
@@ -1294,7 +1305,7 @@ users.extraUsers.alice.openssh.authorizedKeys.keys =
-IPv4 configuration
+IPv4 configuration
By default, NixOS uses DHCP (specifically,
dhcpcd) to automatically configure network
@@ -1337,7 +1348,7 @@ provide the host name.
-IPv6 configuration
+IPv6 configuration
IPv6 is enabled by default. Stateless address autoconfiguration
is used to automatically assign IPv6 addresses to all interfaces. You
@@ -1352,17 +1363,19 @@ networking.enableIPv6 = false;
-Firewall
+Firewall
NixOS has a simple stateful firewall that blocks incoming
connections and other unexpected packets. The firewall applies to
-both IPv4 and IPv6 traffic. It can be enabled as follows:
+both IPv4 and IPv6 traffic. It is enabled by default. It can be
+disabled as follows:
-networking.firewall.enable = true;
+networking.firewall.enable = false;
-You can open specific TCP ports to the outside world:
+If the firewall is enabled, you can open specific TCP ports to the
+outside world:
networking.firewall.allowedTCPPorts = [ 80 443 ];
@@ -1384,7 +1397,7 @@ always allowed.)
-Wireless networks
+Wireless networks
NixOS will start wpa_supplicant for you if you enable this setting:
@@ -1445,7 +1458,7 @@ networking.localCommands =
-Linux kernel
+Linux kernel
You can override the Linux kernel and associated packages using
the option . For instance, this
diff --git a/nixos/doc/manual/containers.xml b/nixos/doc/manual/containers.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8f170fc614f7e8efff8b7d67030e380fb1665f2
--- /dev/null
+++ b/nixos/doc/manual/containers.xml
@@ -0,0 +1,242 @@
+
+
+Containers
+
+NixOS allows you to easily run other NixOS instances as
+containers. Containers are a light-weight
+approach to virtualisation that runs software in the container at the
+same speed as in the host system. NixOS containers share the Nix store
+of the host, making container creation very efficient.
+
+Currently, NixOS containers are not perfectly isolated
+from the host system. This means that a user with root access to the
+container can do things that affect the host. So you should not give
+container root access to untrusted users.
+
+NixOS containers can be created in two ways: imperatively, using
+the command nixos-container, and declaratively, by
+specifying them in your configuration.nix. The
+declarative approach implies that containers get upgraded along with
+your host system when you run nixos-rebuild, which
+is often not what you want. By contrast, in the imperative approach,
+containers are configured and updated independently from the host
+system.
+
+
+Imperative container management
+
+We’ll cover imperative container management using
+nixos-container first. You create a container with
+identifier foo as follows:
+
+
+$ nixos-container create foo
+
+
+This creates the container’s root directory in
+/var/lib/containers/foo and a small configuration
+file in /etc/containers/foo.conf. It also builds
+the container’s initial system configuration and stores it in
+/nix/var/nix/profiles/per-container/foo/system. You
+can modify the initial configuration of the container on the command
+line. For instance, to create a container that has
+sshd running, with the given public key for
+root:
+
+
+$ nixos-container create foo --config 'services.openssh.enable = true; \
+ users.extraUsers.root.openssh.authorizedKeys.keys = ["ssh-dss AAAAB3N…"];'
+
+
+
+
+Creating a container does not start it. To start the container,
+run:
+
+
+$ nixos-container start foo
+
+
+This command will return as soon as the container has booted and has
+reached multi-user.target. On the host, the
+container runs within a systemd unit called
+container@container-name.service.
+Thus, if something went wrong, you can get status info using
+systemctl:
+
+
+$ systemctl status container@foo
+
+
+
+
+If the container has started succesfully, you can log in as
+root using the root-login operation:
+
+
+$ nixos-container root-login foo
+[root@foo:~]#
+
+
+Note that only root on the host can do this (since there is no
+authentication). You can also get a regular login prompt using the
+login operation, which is available to all users on
+the host:
+
+
+$ nixos-container login foo
+foo login: alice
+Password: ***
+
+
+With nixos-container run, you can execute arbitrary
+commands in the container:
+
+
+$ 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
+
+
+
+
+There are several ways to change the configuration of the
+container. First, on the host, you can edit
+/var/lib/container/name/etc/nixos/configuration.nix,
+and run
+
+
+$ nixos-container update foo
+
+
+This will build and activate the new configuration. You can also
+specify a new configuration on the command line:
+
+
+$ nixos-container update foo --config 'services.httpd.enable = true; \
+ services.httpd.adminAddr = "foo@example.org";'
+
+$ curl http://$(nixos-container show-ip foo)/
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">…
+
+
+However, note that this will overwrite the container’s
+/etc/nixos/configuration.nix.
+
+Alternatively, you can change the configuration from within the
+container itself by running nixos-rebuild switch
+inside the container. Note that the container by default does not have
+a copy of the NixOS channel, so you should run nix-channel
+--update first.
+
+Containers can be stopped and started using
+nixos-container stop and nixos-container
+start, respectively, or by using
+systemctl on the container’s service unit. To
+destroy a container, including its file system, do
+
+
+$ nixos-container destroy foo
+
+
+
+
+
+
+
+Declarative container specification
+
+You can also specify containers and their configuration in the
+host’s configuration.nix. For example, the
+following specifies that there shall be a container named
+database running PostgreSQL:
+
+
+containers.database =
+ { config =
+ { config, pkgs, ... }:
+ { services.postgresql.enable = true;
+ services.postgresql.package = pkgs.postgresql92;
+ };
+ };
+
+
+If you run nixos-rebuild switch, the container will
+be built and started. If the container was already running, it will be
+updated in place, without rebooting.
+
+By default, declarative containers share the network namespace
+of the host, meaning that they can listen on (privileged)
+ports. However, they cannot change the network configuration. You can
+give a container its own network as follows:
+
+
+containers.database =
+ { privateNetwork = true;
+ hostAddress = "192.168.100.10";
+ localAddress = "192.168.100.11";
+ };
+
+
+This gives the container a private virtual Ethernet interface with IP
+address 192.168.100.11, which is hooked up to a
+virtual Ethernet interface on the host with IP address
+192.168.100.10. (See the next section for details
+on container networking.)
+
+To disable the container, just remove it from
+configuration.nix and run nixos-rebuild
+switch. Note that this will not delete the root directory of
+the container in /var/lib/containers.
+
+
+
+
+Networking
+
+When you create a container using nixos-container
+create, it gets it own private IPv4 address in the range
+10.233.0.0/16. You can get the container’s IPv4
+address as follows:
+
+
+$ nixos-container show-ip foo
+10.233.4.2
+
+$ ping -c1 10.233.4.2
+64 bytes from 10.233.4.2: icmp_seq=1 ttl=64 time=0.106 ms
+
+
+
+
+Networking is implemented using a pair of virtual Ethernet
+devices. The network interface in the container is called
+eth0, while the matching interface in the host is
+called c-container-name
+(e.g., c-foo). The container has its own network
+namespace and the CAP_NET_ADMIN capability, so it
+can perform arbitrary network configuration such as setting up
+firewall rules, without affecting or having access to the host’s
+network.
+
+By default, containers cannot talk to the outside network. If
+you want that, you should set up Network Address Translation (NAT)
+rules on the host to rewrite container traffic to use your external
+IP address. This can be accomplished using the following configuration
+on the host:
+
+
+networking.nat.enable = true;
+networking.nat.internalInterfaces = ["c-+"];
+networking.nat.externalInterface = "eth0";
+
+where eth0 should be replaced with the desired
+external interface. Note that c-+ is a wildcard
+that matches all container interfaces.
+
+
+
+
+
+
diff --git a/nixos/doc/manual/development.xml b/nixos/doc/manual/development.xml
index be1cbc97d5edc313dafcfb91d5a8f8f3befc2d29..a93b4b163bd5cdb1f1a3d7d773060022f858426a 100644
--- a/nixos/doc/manual/development.xml
+++ b/nixos/doc/manual/development.xml
@@ -1,5 +1,6 @@
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:id="ch-development">
Development
@@ -9,7 +10,7 @@ NixOS.
-
+
Getting the sources
@@ -74,7 +75,7 @@ in nixos/ as packages.
-
+
Writing NixOS modules
@@ -188,9 +189,9 @@ commands to be executed periodically by cron).
NixOS module for the “locate” service
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let locatedb = "/var/cache/locatedb"; in
@@ -579,7 +580,7 @@ systemd.services.dhcpcd =
-
+
Building specific parts of NixOS
@@ -692,7 +693,7 @@ $ systemctl start tmp-httpd.service
-
+
Building your own NixOS CD
@@ -748,57 +749,310 @@ $ ./result/bin/nixos-install
-Whole-system testing using virtual machines
+
+
+NixOS tests
+
+When you add some feature to NixOS, you should write a test for
+it. NixOS tests are kept in the directory nixos/tests,
+and are executed (using Nix) by a testing framework that automatically
+starts one or more virtual machines containing the NixOS system(s)
+required for the test.
+
+Writing tests
+
+A NixOS test is a Nix expression that has the following structure:
+
+
+import ./make-test.nix {
+
+ # Either the configuration of a single machine:
+ machine =
+ { config, pkgs, ... }:
+ { configuration…
+ };
+
+ # Or a set of machines:
+ nodes =
+ { machine1 =
+ { config, pkgs, ... }: { … };
+ machine2 =
+ { config, pkgs, ... }: { … };
+ …
+ };
+
+ testScript =
+ ''
+ Perl code…
+ '';
+}
+
+
+The attribute testScript is a bit of Perl code that
+executes the test (described below). During the test, it will start
+one or more virtual machines, the configuration of which is described
+by the attribute machine (if you need only one
+machine in your test) or by the attribute nodes (if
+you need multiple machines). For instance, login.nix
+only needs a single machine to test whether users can log in on the
+virtual console, whether device ownership is correctly maintained when
+switching between consoles, and so on. On the other hand, nfs.nix,
+which tests NFS client and server functionality in the Linux kernel
+(including whether locks are maintained across server crashes),
+requires three machines: a server and two clients.
+
+There are a few special NixOS configuration options for test
+VMs:
+
+
+
+
+
+
+
+ The memory of the VM in
+ megabytes.
+
+
+
+
+ The virtual networks to which the VM is
+ connected. See nat.nix
+ for an example.
+
+
+
+
+ By default, the Nix store in the VM is not
+ writable. If you enable this option, a writable union file system
+ is mounted on top of the Nix store to make it appear
+ writable. This is necessary for tests that run Nix operations that
+ modify the store.
+
+
+
+
+For more options, see the module qemu-vm.nix.
+
+The test script is a sequence of Perl statements that perform
+various actions, such as starting VMs, executing commands in the VMs,
+and so on. Each virtual machine is represented as an object stored in
+the variable $name,
+where name is the identifier of the machine
+(which is just machine if you didn’t specify
+multiple machines using the nodes attribute). For
+instance, the following starts the machine, waits until it has
+finished booting, then executes a command and checks that the output
+is more-or-less correct:
+
+
+$machine->start;
+$machine->waitForUnit("default.target");
+$machine->succeed("uname") =~ /Linux/;
+
+
+The first line is actually unnecessary; machines are implicitly
+started when you first execute an action on them (such as
+waitForUnit or succeed). If you
+have multiple machines, you can speed up the test by starting them in
+parallel:
+
+
+startAll;
+
+
+
+
+The following methods are available on machine objects:
+
+
+
+
+ start
+ Start the virtual machine. This method is
+ asynchronous — it does not wait for the machine to finish
+ booting.
+
+
+
+ shutdown
+ Shut down the machine, waiting for the VM to
+ exit.
+
+
+
+ crash
+ Simulate a sudden power failure, by telling the VM
+ to exit immediately.
+
+
+
+ block
+ Simulate unplugging the Ethernet cable that
+ connects the machine to the other machines.
+
+
+
+ unblock
+ Undo the effect of
+ block.
+
+
+
+ screenshot
+ Take a picture of the display of the virtual
+ machine, in PNG format. The screenshot is linked from the HTML
+ log.
+
+
+
+ sendMonitorCommand
+ Send a command to the QEMU monitor. This is rarely
+ used, but allows doing stuff such as attaching virtual USB disks
+ to a running machine.
+
+
+
+ sendKeys
+ Simulate pressing keys on the virtual keyboard,
+ e.g., sendKeys("ctrl-alt-delete").
+
+
+
+ sendChars
+ Simulate typing a sequence of characters on the
+ virtual keyboard, e.g., sendKeys("foobar\n")
+ will type the string foobar followed by the
+ Enter key.
+
+
+
+ execute
+ Execute a shell command, returning a list
+ (status,
+ stdout).
+
+
+
+ succeed
+ Execute a shell command, raising an exception if
+ the exit status is not zero, otherwise returning the standard
+ output.
+
+
+
+ fail
+ Like succeed, but raising
+ an exception if the command returns a zero status.
+
-Complete NixOS GNU/Linux systems can be tested in virtual
-machines (VMs). This makes it possible to test a system upgrade or
-configuration change before rebooting into it, using the
-nixos-rebuild build-vm or nixos-rebuild
-build-vm-with-bootloader command.
+
+ waitUntilSucceeds
+ Repeat a shell command with 1-second intervals
+ until it succeeds.
+
+
+
+ waitUntilFails
+ Repeat a shell command with 1-second intervals
+ until it fails.
+
-
-The tests/ directory in the NixOS source
-tree contains several whole-system unit tests.
-These tests can be runNixOS tests can be run both from
-NixOS and from a non-NixOS GNU/Linux distribution, provided the Nix
-package manager is installed. from the NixOS source
-tree as follows:
+
+ waitForUnit
+ Wait until the specified systemd unit has reached
+ the “active” state.
+
+
+
+ waitForFile
+ Wait until the specified file
+ exists.
+
+
+
+ waitForOpenPort
+ Wait until a process is listening on the given TCP
+ port (on localhost, at least).
+
+
+
+ waitForClosedPort
+ Wait until nobody is listening on the given TCP
+ port.
+
+
+
+ waitForX
+ Wait until the X11 server is accepting
+ connections.
+
+
+
+ waitForWindow
+ Wait until an X11 window has appeared whose name
+ matches the given regular expression, e.g.,
+ waitForWindow(qr/Terminal/).
+
+
+
+
+
+
+
+
+
+Running tests
+
+You can run tests using nix-build. For
+example, to run the test login.nix,
+you just do:
-$ nix-build tests/ -A nfs.test
+$ nix-build '<nixpkgs/nixos/tests/login.nix>'
-This performs an automated test of the NFS client and server
-functionality in the Linux kernel, including file locking semantics
-(e.g., whether locks are maintained across server crashes). It will
-first build or download all the dependencies of the test (e.g., all
-packages needed to run a NixOS VM). The test is defined in
-tests/nfs.nix. If the test succeeds,
-nix-build will place a symlink
-./result in the current directory pointing at the
-location in the Nix store of the test results (e.g., screenshots, test
-reports, and so on). In particular, a pretty-printed log of the test
-is written to log.html, which can be viewed using
-a web browser like this:
+or, if you don’t want to rely on NIX_PATH:
+
+
+$ cd /my/nixpkgs/nixos/tests
+$ nix-build login.nix
+…
+running the VM test script
+machine: QEMU running (pid 8841)
+…
+6 out of 6 tests succeeded
+
+
+After building/downloading all required dependencies, this will
+perform a build that starts a QEMU/KVM virtual machine containing a
+NixOS system. The virtual machine mounts the Nix store of the host;
+this makes VM creation very fast, as no disk image needs to be
+created. Afterwards, you can view a pretty-printed log of the test:
$ firefox result/log.html
+
It is also possible to run the test environment interactively,
allowing you to experiment with the VMs. For example:
-$ nix-build tests/ -A nfs.driver
+$ nix-build login.nix -A driver
$ ./result/bin/nixos-run-vms
-The script nixos-run-vms starts the three virtual
-machines defined in the NFS test using QEMU/KVM. The root file system
-of the VMs is created on the fly and kept across VM restarts in
+The script nixos-run-vms starts the virtual
+machines defined by test. The root file system of the VMs is created
+on the fly and kept across VM restarts in
./hostname.qcow2.
Finally, the test itself can be run interactively. This is
@@ -811,17 +1065,11 @@ starting VDE switch for network 1
>
-Perl statements can now be typed in to start or manipulate the VMs:
+You can then take any Perl statement, e.g.
-> startAll;
-(the VMs start booting)
-> $server->waitForJob("nfs-kernel-nfsd");
-> $client1->succeed("flock -x /data/lock -c 'sleep 100000' &");
-> $client2->fail("flock -n -s /data/lock true");
-> $client1->shutdown;
-(this releases client1's lock)
-> $client2->succeed("flock -n -s /data/lock true");
+> startAll
+> $machine->succeed("touch /tmp/foo")
The function testScript executes the entire test
@@ -829,54 +1077,7 @@ script and drops you back into the test driver command line upon its
completion. This allows you to inspect the state of the VMs after the
test (e.g. to debug the test script).
-This and other tests are continuously run on the Hydra
-instance at nixos.org, which allows
-developers to be notified of any regressions introduced by a NixOS or
-Nixpkgs change.
-
-The actual Nix programming interface to VM testing is in NixOS,
-under
-lib/testing.nix. This file defines a
-function which takes an attribute set containing a
-nixpkgs attribute (the path to a Nixpkgs checkout),
-and a system attribute (the system type). It
-returns an attribute set containing several utility functions, among
-which the main entry point is makeTest.
-
-
-The makeTest function takes a function
-similar to that found in
-tests/nfs.nix (discussed above). It
-returns an attribute set containing (among others):
-
-
-
-
- test
- A derivation containing the test log as an HTML
- file, as seen above, suitable for presentation in the Hydra
- continuous build system.
-
-
-
- report
- A derivation containing a code coverage report, with
- meta-data suitable for Hydra.
-
-
-
- driver
- A derivation containing scripts to run the VM test or
- interact with the VM network interactively, as seen above.
-
-
-
-
-
-
+
diff --git a/nixos/doc/manual/installation.xml b/nixos/doc/manual/installation.xml
index 70001577692e7e98838a89bf9f9b60efcbcbdac1..03540aa83aaa07c3d9c540f222bc0383e121c1ae 100644
--- a/nixos/doc/manual/installation.xml
+++ b/nixos/doc/manual/installation.xml
@@ -1,12 +1,13 @@
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:id="ch-installation">
Installing NixOS
-
+
Obtaining NixOS
@@ -50,7 +51,7 @@ running NixOS system through several other means:
-
+
Installation
@@ -295,8 +296,74 @@ $ reboot
}
+
+
+UEFI Installation
+
+NixOS can also be installed on UEFI systems. The procedure
+is by and large the same as a BIOS installation, with the following
+changes:
+
+
+
+ You should boot the live CD in UEFI mode (consult your
+ specific hardware's documentation for instructions).
+
+
+ Instead of fdisk, you should use
+ gdisk to partition your disks. You will need to
+ have a separate partition for /boot with
+ partition code EF00, and it should be formatted as a
+ vfat filesystem.
+
+
+ You must set to
+ true, and
+ to false. nixos-generate-config
+ should do this automatically for new configurations when booted in
+ UEFI mode.
+
+
+ You may want to look at the options starting with
+ and
+ as well.
+
+
+ To see console messages during early boot, add "fbcon"
+ to your .
+
+
+
+
+
+
+
+
+Booting from a USB stick
+
+For systems withoua CD drive, the NixOS livecd can be booted from
+a usb stick. For non-UEFI installations,
+unetbootin
+will work. For UEFI installations, you should mount the ISO, copy its contents
+verbatim to your drive, then either:
+
+
+
+ Change the label of the disk partition to the label of the ISO
+ (visible with the blkid command), or
+
+
+ Edit loader/entries/nixos-livecd.conf on the drive
+ and change the root= field in the options
+ line to point to your drive (see the documentation on root=
+ in
+ the kernel documentation for more details).
+
+
+
+
diff --git a/nixos/doc/manual/manual.xml b/nixos/doc/manual/manual.xml
index 6e13281cbd94dfa9fc904f3cbba96130290e367f..8d7c28dee7336b58756e74b0f69f770edba54d35 100644
--- a/nixos/doc/manual/manual.xml
+++ b/nixos/doc/manual/manual.xml
@@ -54,10 +54,14 @@
+
-
- List of options
+
+
+
+
+ Configuration options
-
+
diff --git a/nixos/doc/manual/options-to-docbook.xsl b/nixos/doc/manual/options-to-docbook.xsl
index 6d11ad7a6c4a8c1c1611520514330182059fcf1f..bb65a49217f025a4c802314e14931ed7971f33d7 100644
--- a/nixos/doc/manual/options-to-docbook.xsl
+++ b/nixos/doc/manual/options-to-docbook.xsl
@@ -18,15 +18,13 @@
-
+
-
-
+
+
+
diff --git a/nixos/doc/manual/release-notes.xml b/nixos/doc/manual/release-notes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7995497708e01f74ad1c6ed47ff6e4e90a71102b
--- /dev/null
+++ b/nixos/doc/manual/release-notes.xml
@@ -0,0 +1,84 @@
+
+
+Release notes
+
+
+
+
+
+Release 14.04 (“Baboon”, 2014/04/??)
+
+This is the second stable release branch of NixOS. The main
+enhancements are the following:
+
+
+
+ Installation on UEFI systems is now supported. See
+ for
+ details.
+
+ NixOS is now based on Glibc 2.19 and GCC
+ 4.8.
+
+
+
+
+
+When upgrading from a previous release, please be aware of the
+following incompatible changes:
+
+
+
+ Nixpkgs no longer exposes unfree packages by
+ default. If your NixOS configuration requires unfree packages from
+ Nixpkgs, you need to enable support for them explicitly by setting:
+
+
+nixpkgs.config.allowUnfree = true;
+
+
+ Otherwise, you get an error message such as:
+
+
+error: package ‘nvidia-x11-331.49-3.12.17’ in ‘…/nvidia-x11/default.nix:56’
+ has an unfree license, refusing to evaluate
+
+
+
+
+ The firewall is now enabled by default. If you don’t
+ want this, you need to disable it explicitly:
+
+
+networking.firewall.enable = false;
+
+
+
+
+ The option
+ has been renamed to
+ .
+
+ The mysql55 service has been
+ merged into the mysql service, which no longer
+ sets a default for the option
+ .
+
+
+
+
+
+
+
+
+
+
+
+Release 13.10 (“Aardvark”, 2013/10/31)
+
+This is the first stable release branch of NixOS.
+
+
+
+
diff --git a/nixos/doc/manual/running.xml b/nixos/doc/manual/running.xml
index e50099707cc539a150fcabafd33b3d948c4bb77b..e1a358df2aacb47d82ec1d86436ee00ac5ddb7d1 100644
--- a/nixos/doc/manual/running.xml
+++ b/nixos/doc/manual/running.xml
@@ -11,7 +11,7 @@ service manager.
-Service management
+Service management
In NixOS, all system services are started and monitored using
the systemd program. Systemd is the “init” process of the system
@@ -92,7 +92,7 @@ necessary).
-Rebooting and shutting down
+Rebooting and shutting down
The system can be shut down (and automatically powered off) by
doing:
@@ -134,7 +134,7 @@ authentication.
-User sessions
+User sessions
Systemd keeps track of all users who are logged into the system
(e.g. on a virtual console or remotely via SSH). The command
@@ -185,7 +185,7 @@ $ loginctl terminate-session c3
-Control groups
+Control groups
To keep track of the processes in a running system, systemd uses
control groups (cgroups). A control group is a
@@ -258,7 +258,7 @@ usage.
-Logging
+Logging
System-wide logging is provided by systemd’s
journal, which subsumes traditional logging
@@ -308,7 +308,7 @@ groups. All users have a private journal that can be read using
-Cleaning up the Nix store
+Cleaning up the Nix store
Nix has a purely functional model, meaning that packages are
never upgraded in place. Instead new versions of packages end up in a
diff --git a/nixos/doc/manual/troubleshooting.xml b/nixos/doc/manual/troubleshooting.xml
index c6e0a3a7888c5fc2dc473098db17ce775af6d8f5..c7d65112b64925f8c267bf836cdbb773299f973f 100644
--- a/nixos/doc/manual/troubleshooting.xml
+++ b/nixos/doc/manual/troubleshooting.xml
@@ -1,12 +1,13 @@
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:id="ch-troubleshooting">
Troubleshooting
-Boot problems
+Boot problems
If NixOS fails to boot, there are a number of kernel command
line parameters that may help you to identify or fix the issue. You
@@ -69,7 +70,7 @@ unless something is very wrong.)
-Maintenance mode
+Maintenance mode
You can enter rescue mode by running:
@@ -85,7 +86,7 @@ just exit from the rescue shell.
-Rolling back configuration changes
+Rolling back configuration changes
After running nixos-rebuild to switch to a
new configuration, you may find that the new configuration doesn’t
@@ -131,7 +132,7 @@ lrwxrwxrwx 1 root root 78 Aug 12 13:54 /nix/var/nix/profiles/system-268-link ->
-Nix store corruption
+Nix store corruption
After a system crash, it’s possible for files in the Nix store
to become corrupted. (For instance, the Ext4 file system has the
@@ -166,7 +167,7 @@ binary cache; otherwise, they cannot be repaired.
-Nix network issues
+Nix network issues
Nix uses a so-called binary cache to
optimise building a package from source into downloading it as a
diff --git a/nixos/lib/eval-config.nix b/nixos/lib/eval-config.nix
index 4b8c7354a7ecf72047ef17a02faceda922fff24e..0fa00637a93a4993eb228bf6b0201e8173d09ebc 100644
--- a/nixos/lib/eval-config.nix
+++ b/nixos/lib/eval-config.nix
@@ -26,10 +26,15 @@ rec {
# These are the extra arguments passed to every module. In
# particular, Nixpkgs is passed through the "pkgs" argument.
+ # FIXME: we enable config.allowUnfree to make packages like
+ # nvidia-x11 available. This isn't a problem because if the user has
+ # ‘nixpkgs.config.allowUnfree = false’, then evaluation will fail on
+ # the 64-bit package anyway. However, it would be cleaner to respect
+ # nixpkgs.config here.
extraArgs = extraArgs_ // {
inherit pkgs modules baseModules;
modulesPath = ../modules;
- pkgs_i686 = import ./nixpkgs.nix { system = "i686-linux"; };
+ pkgs_i686 = import ./nixpkgs.nix { system = "i686-linux"; config.allowUnfree = true; };
utils = import ./utils.nix pkgs;
};
@@ -53,7 +58,7 @@ rec {
inherit system extraArgs modules prefix;
# For efficiency, leave out most NixOS modules; they don't
# define nixpkgs.config, so it's pointless to evaluate them.
- baseModules = [ ../modules/misc/nixpkgs.nix ];
+ baseModules = [ ../modules/misc/nixpkgs.nix ../modules/config/no-x-libs.nix ];
pkgs = import ./nixpkgs.nix { system = system_; config = {}; };
check = false;
}).config.nixpkgs;
diff --git a/nixos/lib/test-driver/Machine.pm b/nixos/lib/test-driver/Machine.pm
index a28214ea934f3435398b599426158f7053c4747f..e2bd3393d8728420205d6e89567ac9d88bceea0d 100644
--- a/nixos/lib/test-driver/Machine.pm
+++ b/nixos/lib/test-driver/Machine.pm
@@ -495,7 +495,9 @@ sub waitForX {
my ($self, $regexp) = @_;
$self->nest("waiting for the X11 server", sub {
retry sub {
- my ($status, $out) = $self->execute("xwininfo -root > /dev/null 2>&1");
+ my ($status, $out) = $self->execute("journalctl -b SYSLOG_IDENTIFIER=systemd | grep 'session opened'");
+ return 0 if $status != 0;
+ ($status, $out) = $self->execute("xwininfo -root > /dev/null 2>&1");
return 1 if $status == 0;
}
});
diff --git a/nixos/lib/test-driver/test-driver.pl b/nixos/lib/test-driver/test-driver.pl
index c6a707cdf6b9e8f028dad3b94fd4e45e5a0ab5ce..358c29e515f252e0ac1b37f08e65772605ef5067 100644
--- a/nixos/lib/test-driver/test-driver.pl
+++ b/nixos/lib/test-driver/test-driver.pl
@@ -144,6 +144,13 @@ sub runTests {
}
});
+ $log->nest("syncing", sub {
+ foreach my $vm (values %vms) {
+ next unless $vm->isUp();
+ $vm->execute("sync");
+ }
+ });
+
if ($nrTests != 0) {
$log->log("$nrSucceeded out of $nrTests tests succeeded",
($nrSucceeded < $nrTests ? { error => 1 } : { }));
diff --git a/nixos/lib/testing.nix b/nixos/lib/testing.nix
index 3407229e921a8650748f0f6ff8224fd91e3efe64..8d17958b9d2f702997c83e7910bbbec4ac72bf45 100644
--- a/nixos/lib/testing.nix
+++ b/nixos/lib/testing.nix
@@ -67,103 +67,55 @@ rec {
};
- # Generate a coverage report from the coverage data produced by
- # runTests.
- makeReport = x: runCommand "report" { buildInputs = [rsync]; }
- ''
- mkdir -p $TMPDIR/gcov/
-
- for d in ${x}/coverage-data/*; do
- echo "doing $d"
- [ -n "$(ls -A "$d")" ] || continue
-
- for i in $(cd $d/nix/store && ls); do
- if ! test -e $TMPDIR/gcov/nix/store/$i; then
- echo "copying $i"
- mkdir -p $TMPDIR/gcov/$(echo $i | cut -c34-)
- rsync -rv /nix/store/$i/.build/* $TMPDIR/gcov/
- fi
- done
-
- chmod -R u+w $TMPDIR/gcov
-
- find $TMPDIR/gcov -name "*.gcda" -exec rm {} \;
-
- for i in $(cd $d/nix/store && ls); do
- rsync -rv $d/nix/store/$i/.build/* $TMPDIR/gcov/
- done
-
- find $TMPDIR/gcov -name "*.gcda" -exec chmod 644 {} \;
-
- echo "producing info..."
- ${pkgs.lcov}/bin/geninfo --ignore-errors source,gcov $TMPDIR/gcov --output-file $TMPDIR/app.info
- cat $TMPDIR/app.info >> $TMPDIR/full.info
- done
-
- echo "making report..."
- mkdir -p $out/coverage
- ${pkgs.lcov}/bin/genhtml --show-details $TMPDIR/full.info -o $out/coverage
- cp $TMPDIR/full.info $out/coverage/
-
- mkdir -p $out/nix-support
- cat ${x}/nix-support/hydra-build-products >> $out/nix-support/hydra-build-products
- echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products
- [ ! -e ${x}/nix-support/failed ] || touch $out/nix-support/failed
- ''; # */
+ makeTest =
+ { testScript, makeCoverageReport ? false, ... } @ t:
+ let
- makeTest = testFun: complete (call testFun);
- makeTests = testsFun: lib.mapAttrs (name: complete) (call testsFun);
-
- apply = makeTest; # compatibility
- call = f: f { inherit pkgs system; };
-
- complete = t: t // rec {
- nodes = buildVirtualNetwork (
- if t ? nodes then t.nodes else
- if t ? machine then { machine = t.machine; }
- else { } );
+ nodes = buildVirtualNetwork (
+ t.nodes or (if t ? machine then { machine = t.machine; } else { }));
- testScript =
- # Call the test script with the computed nodes.
- if builtins.isFunction t.testScript
- then t.testScript { inherit nodes; }
- else t.testScript;
+ testScript' =
+ # Call the test script with the computed nodes.
+ if builtins.isFunction testScript
+ then testScript { inherit nodes; }
+ else testScript;
- vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
+ vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
- vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
+ vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
- # Generate onvenience wrappers for running the test driver
- # interactively with the specified network, and for starting the
- # VMs from the command line.
- driver = runCommand "nixos-test-driver"
- { buildInputs = [ makeWrapper];
- inherit testScript;
- preferLocalBuild = true;
- }
- ''
- mkdir -p $out/bin
- echo "$testScript" > $out/test-script
- ln -s ${testDriver}/bin/nixos-test-driver $out/bin/
- vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)"
- wrapProgram $out/bin/nixos-test-driver \
- --add-flags "$vms" \
- --run "testScript=\"\$(cat $out/test-script)\"" \
- --set testScript '"$testScript"' \
- --set VLANS '"${toString vlans}"'
- ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
- wrapProgram $out/bin/nixos-run-vms \
- --add-flags "$vms" \
- --set tests '"startAll; joinAll;"' \
- --set VLANS '"${toString vlans}"' \
- ${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"}
- ''; # "
-
- test = runTests driver;
-
- report = makeReport test;
- };
+ # Generate onvenience wrappers for running the test driver
+ # interactively with the specified network, and for starting the
+ # VMs from the command line.
+ driver = runCommand "nixos-test-driver"
+ { buildInputs = [ makeWrapper];
+ testScript = testScript';
+ preferLocalBuild = true;
+ }
+ ''
+ mkdir -p $out/bin
+ echo "$testScript" > $out/test-script
+ ln -s ${testDriver}/bin/nixos-test-driver $out/bin/
+ vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)"
+ wrapProgram $out/bin/nixos-test-driver \
+ --add-flags "$vms" \
+ --run "testScript=\"\$(cat $out/test-script)\"" \
+ --set testScript '"$testScript"' \
+ --set VLANS '"${toString vlans}"'
+ ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
+ wrapProgram $out/bin/nixos-run-vms \
+ --add-flags "$vms" \
+ --set tests '"startAll; joinAll;"' \
+ --set VLANS '"${toString vlans}"' \
+ ${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"}
+ ''; # "
+
+ test = runTests driver;
+
+ report = releaseTools.gcovReport { coverageRuns = [ test ]; };
+
+ in (if makeCoverageReport then report else test) // { inherit driver test; };
runInMachine =
@@ -193,7 +145,7 @@ rec {
exit $?
'';
- testscript = ''
+ testScript = ''
startAll;
$client->waitForUnit("multi-user.target");
${preBuild}
@@ -206,7 +158,7 @@ rec {
${coreutils}/bin/mkdir $out
${coreutils}/bin/mkdir -p vm-state-client/xchg
export > vm-state-client/xchg/saved-env
- export tests='${testscript}'
+ export tests='${testScript}'
${testDriver}/bin/nixos-test-driver ${vm.config.system.build.vm}/bin/run-*-vm
''; # */
diff --git a/nixos/maintainers/scripts/ec2/create-ebs-amis.py b/nixos/maintainers/scripts/ec2/create-ebs-amis.py
index 541eadd7b8c9b5aefd2173fc50e7c06133d62da6..eab111a2665b21deee9b19296f1497de67cf3959 100755
--- a/nixos/maintainers/scripts/ec2/create-ebs-amis.py
+++ b/nixos/maintainers/scripts/ec2/create-ebs-amis.py
@@ -203,7 +203,7 @@ f = open("{0}.{1}.ami-id".format(args.region, image_type), "w")
f.write("{0}".format(ami_id))
f.close()
-for dest in [ 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1']:
+for dest in [ 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', 'ap-southeast-1', 'ap-southeast-2', 'ap-northeast-1', 'sa-east-1']:
if args.region != dest:
print >> sys.stderr, "copying image from region {0} to {1}".format(args.region, dest)
conn = boto.ec2.connect_to_region(dest)
diff --git a/nixos/maintainers/scripts/gce/create-gce.sh b/nixos/maintainers/scripts/gce/create-gce.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8bf36f33c7db4068e41013a4ea40ff2eb7025101
--- /dev/null
+++ b/nixos/maintainers/scripts/gce/create-gce.sh
@@ -0,0 +1,14 @@
+#! /bin/sh -e
+
+export NIX_PATH=nixpkgs=../../../..
+export NIXOS_CONFIG=$(dirname $(readlink -f $0))/../../../modules/virtualisation/google-compute-image.nix
+export TIMESTAMP=$(date +%Y%m%d%H%M)
+
+nix-build '' \
+ -A config.system.build.googleComputeImage --argstr system x86_64-linux -o gce --option extra-binary-caches http://hydra.nixos.org -j 10
+
+img=$(echo gce/*.tar.gz)
+if ! gsutil ls gs://nixos/$(basename $img); then
+ gsutil cp $img gs://nixos/$(basename $img)
+fi
+gcutil addimage $(basename $img .raw.tar.gz | sed 's|\.|-|' | sed 's|_|-|') gs://nixos/$(basename $img)
diff --git a/nixos/modules/config/fonts/corefonts.nix b/nixos/modules/config/fonts/corefonts.nix
index 7de95200cfa90b03d70b51f48c1c04d74b9c4ca0..51a6676fe4a0cbd53d929e723452ba2ae63ae3a0 100644
--- a/nixos/modules/config/fonts/corefonts.nix
+++ b/nixos/modules/config/fonts/corefonts.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/config/fonts/fontconfig.nix b/nixos/modules/config/fonts/fontconfig.nix
index 987bb1088c0dbc6af27c02c781541cad7864caa0..cf70ca264d6aa64f566e920650253064d169bbb1 100644
--- a/nixos/modules/config/fonts/fontconfig.nix
+++ b/nixos/modules/config/fonts/fontconfig.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/config/fonts/fontdir.nix b/nixos/modules/config/fonts/fontdir.nix
index a4f69809b2a45ca6544a5f20a506dd11efd5801c..c78b52fe29e1d04a29ad2913559c7d43b53a9f99 100644
--- a/nixos/modules/config/fonts/fontdir.nix
+++ b/nixos/modules/config/fonts/fontdir.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/config/fonts/fonts.nix b/nixos/modules/config/fonts/fonts.nix
index f43784f6d03eac364d2ba64c39912046b9317000..16df197d87f304142e5a77b22af4684ccb5b9c36 100644
--- a/nixos/modules/config/fonts/fonts.nix
+++ b/nixos/modules/config/fonts/fonts.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/config/fonts/ghostscript.nix b/nixos/modules/config/fonts/ghostscript.nix
index 9ef00396808cf33a561fd717de33bcc60bdc4c81..a41f00a76c5719e322385332f2215d0a8109d0e9 100644
--- a/nixos/modules/config/fonts/ghostscript.nix
+++ b/nixos/modules/config/fonts/ghostscript.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/config/gnu.nix b/nixos/modules/config/gnu.nix
index 6f5d2950463f988a2576e954416a4548050d515a..f8c35b440d12d34af7bdc5c532abdc2c8a85a656 100644
--- a/nixos/modules/config/gnu.nix
+++ b/nixos/modules/config/gnu.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
options = {
@@ -36,7 +36,7 @@ with pkgs.lib;
# GNU lsh.
services.openssh.enable = false;
services.lshd.enable = true;
- services.xserver.startOpenSSHAgent = false;
+ programs.ssh.startAgent = false;
services.xserver.startGnuPGAgent = true;
# TODO: GNU dico.
diff --git a/nixos/modules/config/i18n.nix b/nixos/modules/config/i18n.nix
index 56d541cb9b3b99c88fe4de9fd4c4164fb43a95fe..8182b8ae8081c1fce95b5a2bcb0da72b006777a6 100644
--- a/nixos/modules/config/i18n.nix
+++ b/nixos/modules/config/i18n.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -53,7 +53,11 @@ in
};
consoleKeyMap = mkOption {
- type = types.str;
+ type = mkOptionType {
+ name = "string or path";
+ check = t: (isString t || types.path.check t);
+ };
+
default = "us";
example = "fr";
description = ''
@@ -72,7 +76,12 @@ in
environment.systemPackages = [ glibcLocales ];
- environment.variables.LANG = config.i18n.defaultLocale;
+ environment.variables =
+ { LANG = config.i18n.defaultLocale;
+ LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
+ };
+
+ systemd.globalEnvironment.LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive";
# ‘/etc/locale.conf’ is used by systemd.
environment.etc = singleton
diff --git a/nixos/modules/config/krb5.nix b/nixos/modules/config/krb5.nix
index 3323046ac5b43f6dc4179c18f5bf466cb6e9af19..bb5a95ebc844fd54375c6d38ca978a40d4e51fa4 100644
--- a/nixos/modules/config/krb5.nix
+++ b/nixos/modules/config/krb5.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/config/ldap.nix b/nixos/modules/config/ldap.nix
index 113f5d8bcbde249e79ad306b8872157fd48cbea2..8171f460385b92fdb10670706bfbc947a64e09e9 100644
--- a/nixos/modules/config/ldap.nix
+++ b/nixos/modules/config/ldap.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
with pkgs;
let
diff --git a/nixos/modules/config/networking.nix b/nixos/modules/config/networking.nix
index 9ac68b428190446d38d14bcca28f41a51e057d5e..43717697ebd30d1b5f9ec6b859402363e52d1880 100644
--- a/nixos/modules/config/networking.nix
+++ b/nixos/modules/config/networking.nix
@@ -1,8 +1,8 @@
# /etc files related to networking, such as /etc/services.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/config/no-x-libs.nix b/nixos/modules/config/no-x-libs.nix
index ec7bf3fea7b5c9e08605a8a2eada43f98f934e8c..f91dbb4cc281754423fc5540590b7257db41e2e4 100644
--- a/nixos/modules/config/no-x-libs.nix
+++ b/nixos/modules/config/no-x-libs.nix
@@ -1,6 +1,9 @@
-{ config, pkgs, ... }:
+# This module gets rid of all dependencies on X11 client libraries
+# (including fontconfig).
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+
+with lib;
{
options = {
@@ -8,18 +11,22 @@ with pkgs.lib;
type = types.bool;
default = false;
description = ''
- Switch off the options in the default configuration that require X libraries.
- Currently this includes: ssh X11 forwarding, dbus, fonts.enableCoreFonts,
- fonts.enableFontConfig
+ Switch off the options in the default configuration that
+ require X11 libraries. This includes client-side font
+ configuration and SSH forwarding of X11 authentication
+ in. Thus, you probably do not want to enable this option if
+ you want to run X11 programs on this machine via SSH.
'';
};
};
config = mkIf config.environment.noXlibs {
programs.ssh.setXAuthLocation = false;
- fonts = {
- enableCoreFonts = false;
- enableFontConfig = false;
- };
+ security.pam.services.su.forwardXAuth = lib.mkForce false;
+
+ fonts.enableFontConfig = false;
+
+ nixpkgs.config.packageOverrides = pkgs:
+ { dbus = pkgs.dbus.override { useX11 = false; }; };
};
}
diff --git a/nixos/modules/config/nsswitch.nix b/nixos/modules/config/nsswitch.nix
index 2e2125d44f7b464cad4f3a44d2a39f4c70439def..45695d9cb89f6fe67c10b7a14a81a7caca8bad18 100644
--- a/nixos/modules/config/nsswitch.nix
+++ b/nixos/modules/config/nsswitch.nix
@@ -1,8 +1,8 @@
# Configuration for the Name Service Switch (/etc/nsswitch.conf).
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/config/power-management.nix b/nixos/modules/config/power-management.nix
index 7299136235ed07cc318a051d49d5a0e2b1826402..17f3ed00b9be5cde42eaf53e3bb6acc9369b2768 100644
--- a/nixos/modules/config/power-management.nix
+++ b/nixos/modules/config/power-management.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -65,14 +65,7 @@ in
config = mkIf cfg.enable {
- # Enable the ACPI daemon. Not sure whether this is essential.
- services.acpid.enable = true;
-
- boot.kernelModules =
- [ "acpi_cpufreq" "powernow-k8" "cpufreq_performance" "cpufreq_powersave" "cpufreq_ondemand"
- "cpufreq_conservative"
- ];
-
+ # FIXME: Implement powersave governor for sandy bridge or later Intel CPUs
powerManagement.cpuFreqGovernor = mkDefault "ondemand";
powerManagement.scsiLinkPolicy = mkDefault "min_power";
diff --git a/nixos/modules/config/pulseaudio.nix b/nixos/modules/config/pulseaudio.nix
index e7cbe7a28f36d2f35dc2324894ec58d665102cc2..eedc4ca2b2f2a1de7db50f7fe2ead37c2957123e 100644
--- a/nixos/modules/config/pulseaudio.nix
+++ b/nixos/modules/config/pulseaudio.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
with pkgs;
let
@@ -77,7 +77,7 @@ in {
};
package = mkOption {
- type = types.path;
+ type = types.package;
default = pulseaudio;
example = literalExample "pulseaudio.override { jackaudioSupport = true; }";
description = ''
diff --git a/nixos/modules/config/shells-environment.nix b/nixos/modules/config/shells-environment.nix
index 0b4f75a352165b1a44821e509ccf69b1bcb3df72..9e212847e489e36f78aaf1911110590a04b990ef 100644
--- a/nixos/modules/config/shells-environment.nix
+++ b/nixos/modules/config/shells-environment.nix
@@ -1,9 +1,9 @@
# This module defines a global environment configuration and
# a common configuration for all shells.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/config/swap.nix b/nixos/modules/config/swap.nix
index 65d7722abfa7b9356045800df7c69f2a68213cfd..427b2519cbdf6f1d49c3ebd77774a6e6b870e266 100644
--- a/nixos/modules/config/swap.nix
+++ b/nixos/modules/config/swap.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, utils, ... }:
+{ config, lib, pkgs, utils, ... }:
-with pkgs.lib;
+with lib;
with utils;
{
diff --git a/nixos/modules/config/sysctl.nix b/nixos/modules/config/sysctl.nix
index 8f9b31dccff3215f4616f1be9e2680644d1a3104..542360219193d80c0196d6769a1372833f376afb 100644
--- a/nixos/modules/config/sysctl.nix
+++ b/nixos/modules/config/sysctl.nix
@@ -1,12 +1,12 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
sysctlOption = mkOptionType {
name = "sysctl option value";
- check = x: isBool x || isString x || isInt x;
+ check = x: isBool x || isString x || isInt x || isNull x;
merge = args: defs: (last defs).value; # FIXME: hacky way to allow overriding in configuration.nix.
};
@@ -29,8 +29,9 @@ in
8. Note that sysctl
parameters names must be enclosed in quotes
(e.g. "vm.swappiness" instead of
- vm.swappiness). The value of each parameter
- may be a string, integer or Boolean.
+ vm.swappiness). The value of each
+ parameter may be a string, integer, boolean, or null
+ (signifying the option will not appear at all).
'';
};
@@ -39,22 +40,13 @@ in
config = {
environment.etc."sysctl.d/nixos.conf".text =
- concatStrings (mapAttrsToList (n: v: "${n}=${if v == false then "0" else toString v}\n") config.boot.kernel.sysctl);
+ concatStrings (mapAttrsToList (n: v:
+ optionalString (v != null) "${n}=${if v == false then "0" else toString v}\n"
+ ) config.boot.kernel.sysctl);
systemd.services.systemd-sysctl =
- { description = "Apply Kernel Variables";
- before = [ "sysinit.target" "shutdown.target" ];
- wantedBy = [ "sysinit.target" "multi-user.target" ];
+ { wantedBy = [ "multi-user.target" ];
restartTriggers = [ config.environment.etc."sysctl.d/nixos.conf".source ];
- unitConfig = {
- DefaultDependencies = false; # needed to prevent a cycle
- ConditionPathIsReadWrite = "/proc/sys/"; # prevent systemd-sysctl in containers
- };
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
- ExecStart = "${config.systemd.package}/lib/systemd/systemd-sysctl";
- };
};
# Enable hardlink and symlink restrictions. See
@@ -65,8 +57,9 @@ in
# Hide kernel pointers (e.g. in /proc/modules) for unprivileged
# users as these make it easier to exploit kernel vulnerabilities.
- boot.kernel.sysctl."kernel.kptr_restrict" = 1;
-
+ #
+ # Removed under grsecurity.
+ boot.kernel.sysctl."kernel.kptr_restrict" =
+ if config.security.grsecurity.enable then null else 1;
};
-
}
diff --git a/nixos/modules/config/system-path.nix b/nixos/modules/config/system-path.nix
index 2f61947c3bccb5063495238d563aaeb6eb31ef78..2ea998bbb6353b3e8721c3a4921548730e4a1b41 100644
--- a/nixos/modules/config/system-path.nix
+++ b/nixos/modules/config/system-path.nix
@@ -1,9 +1,9 @@
# This module defines the packages that appear in
# /run/current-system/sw.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -46,6 +46,7 @@ let
pkgs.rsync
pkgs.strace
pkgs.sysvtools
+ pkgs.su
pkgs.time
pkgs.usbutils
pkgs.utillinux
@@ -134,6 +135,10 @@ in
if [ -x $out/bin/glib-compile-schemas -a -w $out/share/glib-2.0/schemas ]; then
$out/bin/glib-compile-schemas $out/share/glib-2.0/schemas
fi
+
+ if [ -x $out/bin/update-desktop-database -a -w $out/share/applications ]; then
+ $out/bin/update-desktop-database $out/share/applications
+ fi
'';
};
diff --git a/nixos/modules/config/timezone.nix b/nixos/modules/config/timezone.nix
index 42fbe841d070304b3c3c9446ffb8b13f50ee95ea..88aa7866c2b2d3fbdb3820c1ed792dfb3e9c3743 100644
--- a/nixos/modules/config/timezone.nix
+++ b/nixos/modules/config/timezone.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
options = {
diff --git a/nixos/modules/config/unix-odbc-drivers.nix b/nixos/modules/config/unix-odbc-drivers.nix
index 0f60846905893eb913b060b1254eade7474f556d..b725e6cae7321f433ecfd5d1912c8bc44b94b610 100644
--- a/nixos/modules/config/unix-odbc-drivers.nix
+++ b/nixos/modules/config/unix-odbc-drivers.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
# unixODBC drivers (this solution is not perfect.. Because the user has to
# ask the admin to add a driver.. but it's simple and works
diff --git a/nixos/modules/config/users-groups.nix b/nixos/modules/config/users-groups.nix
index 714de646eb7a55a2ed31ce56d169d6a9f3e8defc..8b8f6bd909e3d3ac6d7bac6a45f12e0c26b83f75 100644
--- a/nixos/modules/config/users-groups.nix
+++ b/nixos/modules/config/users-groups.nix
@@ -1,11 +1,32 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
ids = config.ids;
- users = config.users;
+ cfg = config.users;
+
+ nonUidUsers = filterAttrs (n: u: u.createUser && u.uid == null) cfg.extraUsers;
+ nonGidGroups = filterAttrs (n: g: g.gid == null) cfg.extraGroups;
+
+ passwordDescription = ''
+ The options hashedPassword,
+ password and passwordFile
+ controls what password is set for the user.
+ hashedPassword overrides both
+ password and passwordFile.
+ password overrides passwordFile.
+ If none of these three options are set, no password is assigned to
+ the user, and the user will not be able to do password logins.
+ If the option users.mutableUsers is true, the
+ password defined in one of the three options will only be set when
+ the user is created for the first time. After that, you are free to
+ change the password with the ordinary user management commands. If
+ users.mutableUsers is false, you cannot change
+ user passwords, they will always be set according to the password
+ options.
+ '';
userOpts = { name, config, ... }: {
@@ -13,7 +34,10 @@ let
name = mkOption {
type = types.str;
- description = "The name of the user account. If undefined, the name of the attribute set will be used.";
+ description = ''
+ The name of the user account. If undefined, the name of the
+ attribute set will be used.
+ '';
};
description = mkOption {
@@ -28,9 +52,14 @@ let
};
uid = mkOption {
- type = with types; uniq (nullOr int);
+ type = with types; nullOr int;
default = null;
- description = "The account UID. If undefined, NixOS will select a free UID.";
+ description = ''
+ The account UID. If the mutableUsers option
+ is false, the UID cannot be null. Otherwise, the UID might be
+ null, in which case a free UID is picked on activation (by the
+ useradd command).
+ '';
};
group = mkOption {
@@ -60,31 +89,54 @@ let
createHome = mkOption {
type = types.bool;
default = false;
- description = "If true, the home directory will be created automatically.";
+ description = ''
+ If true, the home directory will be created automatically. If this
+ option is true and the home directory already exists but is not
+ owned by the user, directory owner and group will be changed to
+ match the user.
+ '';
};
useDefaultShell = mkOption {
type = types.bool;
default = false;
- description = "If true, the user's shell will be set to users.defaultUserShell.";
+ description = ''
+ If true, the user's shell will be set to
+ cfg.defaultUserShell.
+ '';
+ };
+
+ hashedPassword = mkOption {
+ type = with types; uniq (nullOr str);
+ default = null;
+ description = ''
+ Specifies the (hashed) password for the user.
+ ${passwordDescription}
+ '';
};
password = mkOption {
type = with types; uniq (nullOr str);
default = null;
description = ''
- The user's password. If undefined, no password is set for
- the user. Warning: do not set confidential information here
- because it is world-readable in the Nix store. This option
- should only be used for public accounts such as
- guest.
+ Specifies the (clear text) password for the user.
+ Warning: do not set confidential information here
+ because it is world-readable in the Nix store. This option
+ should only be used for public accounts.
+ ${passwordDescription}
'';
};
- isSystemUser = mkOption {
- type = types.bool;
- default = true;
- description = "Indicates if the user is a system user or not.";
+ passwordFile = mkOption {
+ type = with types; uniq (nullOr string);
+ default = null;
+ description = ''
+ The path to a file that contains the user's password. The password
+ file is read on each system activation. The file should contain
+ exactly one line, which should be the password in an encrypted form
+ that is suitable for the chpasswd -e command.
+ ${passwordDescription}
+ '';
};
createUser = mkOption {
@@ -96,19 +148,11 @@ let
then not modify any of the basic properties for the user account.
'';
};
-
- isAlias = mkOption {
- type = types.bool;
- default = false;
- description = "If true, the UID of this user is not required to be unique and can thus alias another user.";
- };
-
};
config = {
name = mkDefault name;
- uid = mkDefault (attrByPath [name] null ids.uids);
- shell = mkIf config.useDefaultShell (mkDefault users.defaultUserShell);
+ shell = mkIf config.useDefaultShell (mkDefault cfg.defaultUserShell);
};
};
@@ -119,41 +163,167 @@ let
name = mkOption {
type = types.str;
- description = "The name of the group. If undefined, the name of the attribute set will be used.";
+ description = ''
+ The name of the group. If undefined, the name of the attribute set
+ will be used.
+ '';
};
gid = mkOption {
- type = with types; uniq (nullOr int);
+ type = with types; nullOr int;
default = null;
- description = "The GID of the group. If undefined, NixOS will select a free GID.";
+ description = ''
+ The group GID. If the mutableUsers option
+ is false, the GID cannot be null. Otherwise, the GID might be
+ null, in which case a free GID is picked on activation (by the
+ groupadd command).
+ '';
+ };
+
+ members = mkOption {
+ type = with types; listOf string;
+ default = [];
+ description = ''
+ The user names of the group members, added to the
+ /etc/group file.
+ '';
};
};
config = {
name = mkDefault name;
- gid = mkDefault (attrByPath [name] null ids.gids);
};
};
- # Note: the 'X' in front of the password is to distinguish between
- # having an empty password, and not having a password.
- serializedUser = u: "${u.name}\n${u.description}\n${if u.uid != null then toString u.uid else ""}\n${u.group}\n${toString (concatStringsSep "," u.extraGroups)}\n${u.home}\n${u.shell}\n${toString u.createHome}\n${if u.password != null then "X" + u.password else ""}\n${toString u.isSystemUser}\n${toString u.createUser}\n${toString u.isAlias}\n";
-
- usersFile = pkgs.writeText "users" (
+ getGroup = gname:
+ let
+ groups = mapAttrsToList (n: g: g) (
+ filterAttrs (n: g: g.name == gname) cfg.extraGroups
+ );
+ in
+ if length groups == 1 then head groups
+ else if groups == [] then throw "Group ${gname} not defined"
+ else throw "Group ${gname} has multiple definitions";
+
+ getUser = uname:
+ let
+ users = mapAttrsToList (n: u: u) (
+ filterAttrs (n: u: u.name == uname) cfg.extraUsers
+ );
+ in
+ if length users == 1 then head users
+ else if users == [] then throw "User ${uname} not defined"
+ else throw "User ${uname} has multiple definitions";
+
+ mkGroupEntry = gname:
let
- p = partition (u: u.isAlias) (attrValues config.users.extraUsers);
- in concatStrings (map serializedUser p.wrong ++ map serializedUser p.right));
+ g = getGroup gname;
+ users = mapAttrsToList (n: u: u.name) (
+ filterAttrs (n: u: elem g.name u.extraGroups) cfg.extraUsers
+ );
+ in concatStringsSep ":" [
+ g.name "x" (toString g.gid)
+ (concatStringsSep "," (users ++ (filter (u: !(elem u users)) g.members)))
+ ];
+
+ mkPasswdEntry = uname: let u = getUser uname; in
+ concatStringsSep ":" [
+ u.name "x" (toString u.uid)
+ (toString (getGroup u.group).gid)
+ u.description u.home u.shell
+ ];
+
+ sortOn = a: sort (as1: as2: lessThan (getAttr a as1) (getAttr a as2));
+
+ groupFile = pkgs.writeText "group" (
+ concatStringsSep "\n" (map (g: mkGroupEntry g.name) (
+ let f = g: g.gid != null; in
+ sortOn "gid" (filter f (attrValues cfg.extraGroups))
+ ))
+ );
+
+ passwdFile = pkgs.writeText "passwd" (
+ concatStringsSep "\n" (map (u: mkPasswdEntry u.name) (
+ let f = u: u.createUser && (u.uid != null); in
+ sortOn "uid" (filter f (attrValues cfg.extraUsers))
+ ))
+ );
+
+ # If mutableUsers is true, this script adds all users/groups defined in
+ # users.extra{Users,Groups} to /etc/{passwd,group} iff there isn't any
+ # existing user/group with the same name in those files.
+ # If mutableUsers is false, the /etc/{passwd,group} files will simply be
+ # replaced with the users/groups defined in the NixOS configuration.
+ # The merging procedure could certainly be improved, and instead of just
+ # keeping the lines as-is from /etc/{passwd,group} they could be combined
+ # in some way with the generated content from the NixOS configuration.
+ merger = src: pkgs.writeScript "merger" ''
+ #!${pkgs.bash}/bin/bash
+
+ PATH=${pkgs.gawk}/bin:${pkgs.gnugrep}/bin:$PATH
+
+ ${if !cfg.mutableUsers
+ then ''cp ${src} $1.tmp''
+ else ''awk -F: '{ print "^"$1":.*" }' $1 | egrep -vf - ${src} | cat $1 - > $1.tmp''
+ }
+
+ # set mtime to +1, otherwise change might go unnoticed (vipw/vigr only looks at mtime)
+ touch -m -t $(date -d @$(($(stat -c %Y $1)+1)) +%Y%m%d%H%M.%S) $1.tmp
+
+ mv -f $1.tmp $1
+ '';
+
+ idsAreUnique = set: idAttr: !(fold (name: args@{ dup, acc }:
+ let
+ id = builtins.toString (builtins.getAttr idAttr (builtins.getAttr name set));
+ exists = builtins.hasAttr id acc;
+ newAcc = acc // (builtins.listToAttrs [ { name = id; value = true; } ]);
+ in if dup then args else if exists
+ then builtins.trace "Duplicate ${idAttr} ${id}" { dup = true; acc = null; }
+ else { dup = false; acc = newAcc; }
+ ) { dup = false; acc = {}; } (builtins.attrNames set)).dup;
-in
+ uidsAreUnique = idsAreUnique (filterAttrs (n: u: u.uid != null) cfg.extraUsers) "uid";
+ gidsAreUnique = idsAreUnique (filterAttrs (n: g: g.gid != null) cfg.extraGroups) "gid";
-{
+in {
###### interface
options = {
+ users.mutableUsers = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ If true, you are free to add new users and groups to the system
+ with the ordinary useradd and
+ groupadd commands. On system activation, the
+ existing contents of the /etc/passwd and
+ /etc/group files will be merged with the
+ contents generated from the users.extraUsers and
+ users.extraGroups options. If
+ mutableUsers is false, the contents of the user and
+ group files will simply be replaced on system activation. This also
+ holds for the user passwords; if this option is false, all changed
+ passwords will be reset according to the
+ users.extraUsers configuration on activation. If
+ this option is true, the initial password for a user will be set
+ according to users.extraUsers, but existing passwords
+ will not be changed.
+ '';
+ };
+
+ users.enforceIdUniqueness = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to require that no two users/groups share the same uid/gid.
+ '';
+ };
+
users.extraUsers = mkOption {
default = {};
type = types.loaOf types.optionSet;
@@ -194,11 +364,17 @@ in
example = "!";
description = ''
The (hashed) password for the root account set on initial
- installation. The empty string denotes that root can login
+ installation. The empty string denotes that root can login
locally without a password (but not via remote services such
as SSH, or indirectly via su or
- sudo). The string !
+ sudo). The string !
prevents root from logging in using a password.
+ Note, setting this option sets
+ users.extraUsers.root.hashedPassword.
+ Note, if users.mutableUsers is false
+ you cannot change the root password manually, so in that case
+ the name of this option is a bit misleading, since it will define
+ the root password beyond the user initialisation phase.
'';
};
@@ -211,144 +387,120 @@ in
users.extraUsers = {
root = {
+ uid = ids.uids.root;
description = "System administrator";
home = "/root";
- shell = config.users.defaultUserShell;
+ shell = cfg.defaultUserShell;
group = "root";
+ extraGroups = [ "grsecurity" ];
+ hashedPassword = mkDefault config.security.initialRootPassword;
};
nobody = {
+ uid = ids.uids.nobody;
description = "Unprivileged account (don't use!)";
+ group = "nogroup";
};
};
users.extraGroups = {
- root = { };
- wheel = { };
- disk = { };
- kmem = { };
- tty = { };
- floppy = { };
- uucp = { };
- lp = { };
- cdrom = { };
- tape = { };
- audio = { };
- video = { };
- dialout = { };
- nogroup = { };
- users = { };
- nixbld = { };
- utmp = { };
- adm = { }; # expected by journald
+ root.gid = ids.gids.root;
+ wheel.gid = ids.gids.wheel;
+ disk.gid = ids.gids.disk;
+ kmem.gid = ids.gids.kmem;
+ tty.gid = ids.gids.tty;
+ floppy.gid = ids.gids.floppy;
+ uucp.gid = ids.gids.uucp;
+ lp.gid = ids.gids.lp;
+ cdrom.gid = ids.gids.cdrom;
+ tape.gid = ids.gids.tape;
+ audio.gid = ids.gids.audio;
+ video.gid = ids.gids.video;
+ dialout.gid = ids.gids.dialout;
+ nogroup.gid = ids.gids.nogroup;
+ users.gid = ids.gids.users;
+ nixbld.gid = ids.gids.nixbld;
+ utmp.gid = ids.gids.utmp;
+ adm.gid = ids.gids.adm;
+ grsecurity.gid = ids.gids.grsecurity;
};
- system.activationScripts.rootPasswd = stringAfter [ "etc" ]
- ''
- # If there is no password file yet, create a root account with an
- # empty password.
- if ! test -e /etc/passwd; then
- rootHome=/root
- touch /etc/passwd; chmod 0644 /etc/passwd
- touch /etc/group; chmod 0644 /etc/group
- touch /etc/shadow; chmod 0600 /etc/shadow
- # Can't use useradd, since it complains that it doesn't know us
- # (bootstrap problem!).
- echo "root:x:0:0:System administrator:$rootHome:${config.users.defaultUserShell}" >> /etc/passwd
- echo "root:${config.security.initialRootPassword}:::::::" >> /etc/shadow
- fi
- '';
-
- # Print a reminder for users to set a root password.
- environment.interactiveShellInit =
- ''
- if [ "$UID" = 0 ]; then
- read _l < /etc/shadow
- if [ "''${_l:0:6}" = root:: ]; then
- cat >&2 < $out
+ '' else u.passwordFile;
+ setpw = n: u: ''
+ setpw=yes
+ ${optionalString cfg.mutableUsers ''
+ test "$(getent shadow '${u.name}' | cut -d: -f2)" != "x" && setpw=no
+ ''}
+ if [ "$setpw" == "yes" ]; then
+ ${if !(isNull (pwFile u))
+ then ''
+ echo -n "${u.name}:" | cat - "${pwFile u}" | \
+ ${pkgs.shadow}/sbin/chpasswd -e
+ ''
+ else "passwd -l '${u.name}' &>/dev/null"
+ }
+ fi
+ '';
+ mkhome = n: u: ''
+ uid="$(id -u ${u.name})"
+ gid="$(id -g ${u.name})"
+ h="${u.home}"
+ test -a "$h" || mkdir -p "$h" || true
+ test "$(stat -c %u "$h")" = $uid || chown $uid "$h" || true
+ test "$(stat -c %g "$h")" = $gid || chgrp $gid "$h" || true
+ '';
+ groupadd = n: g: ''
+ if [ -z "$(getent group "${g.name}")" ]; then
+ echo "Adding group ${g.name}"
+ ${pkgs.shadow}/sbin/groupadd "${g.name}"
+ fi
+ '';
+ useradd = n: u: ''
+ if ! id "${u.name}" &>/dev/null; then
+ echo "Adding user ${u.name}"
+ ${pkgs.shadow}/sbin/useradd \
+ -g "${u.group}" \
+ -s "${u.shell}" \
+ -d "${u.home}" \
+ "${u.name}"
+ echo "${u.name}:x" | ${pkgs.shadow}/sbin/chpasswd -e
+ fi
+ '';
+ in stringAfter [ "etc" ] ''
+ touch /etc/group
+ touch /etc/passwd
+ VISUAL=${merger groupFile} ${pkgs.shadow}/sbin/vigr &>/dev/null
+ VISUAL=${merger passwdFile} ${pkgs.shadow}/sbin/vipw &>/dev/null
+ ${pkgs.shadow}/sbin/grpconv
+ ${pkgs.shadow}/sbin/pwconv
+ ${concatStrings (mapAttrsToList groupadd nonGidGroups)}
+ ${concatStrings (mapAttrsToList useradd nonUidUsers)}
+ ${concatStrings (mapAttrsToList mkhome mkhomeUsers)}
+ ${concatStrings (mapAttrsToList setpw setpwUsers)}
'';
- system.activationScripts.groups = stringAfter [ "rootPasswd" "binsh" "etc" "var" ]
- ''
- echo "updating groups..."
-
- createGroup() {
- name="$1"
- gid="$2"
-
- if ! curEnt=$(getent group "$name"); then
- groupadd --system \
- ''${gid:+--gid $gid} \
- "$name"
- fi
- }
-
- ${flip concatMapStrings (attrValues config.users.extraGroups) (g: ''
- createGroup '${g.name}' '${toString g.gid}'
- '')}
- '';
+ # for backwards compatibility
+ system.activationScripts.groups = stringAfter [ "users" ] "";
+
+ assertions = [
+ { assertion = !cfg.enforceIdUniqueness || (uidsAreUnique && gidsAreUnique);
+ message = "uids and gids must be unique!";
+ }
+ { assertion = cfg.mutableUsers || (nonUidUsers == {});
+ message = "When mutableUsers is false, no uid can be null";
+ }
+ { assertion = cfg.mutableUsers || (nonGidGroups == {});
+ message = "When mutableUsers is false, no gid can be null";
+ }
+ ];
};
diff --git a/nixos/modules/hardware/all-firmware.nix b/nixos/modules/hardware/all-firmware.nix
index 027dd827b4dd4cc35aee25982bc8571e06fc6213..3820a95b12e263a490204a5c2b0bbc17a6596615 100644
--- a/nixos/modules/hardware/all-firmware.nix
+++ b/nixos/modules/hardware/all-firmware.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/hardware/cpu/amd-microcode.nix b/nixos/modules/hardware/cpu/amd-microcode.nix
index 5720a63834f5585f43a2abe47448114a218e74a2..86a3df5da21dc484f3e00e6c511f34998bd6bedc 100644
--- a/nixos/modules/hardware/cpu/amd-microcode.nix
+++ b/nixos/modules/hardware/cpu/amd-microcode.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/hardware/cpu/intel-microcode.nix b/nixos/modules/hardware/cpu/intel-microcode.nix
index 9046ddf83bbf4d6a35e03f5849081410379912fc..800c391b293a17e54912669d564d5664944c3689 100644
--- a/nixos/modules/hardware/cpu/intel-microcode.nix
+++ b/nixos/modules/hardware/cpu/intel-microcode.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/hardware/network/b43.nix b/nixos/modules/hardware/network/b43.nix
index 03f81f92ef0b83c15f81d9b3aa91fa372aff6d70..e63f2d04d1a6f1481ddbe61354457882fc16ea69 100644
--- a/nixos/modules/hardware/network/b43.nix
+++ b/nixos/modules/hardware/network/b43.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let kernelVersion = config.boot.kernelPackages.kernel.version; in
diff --git a/nixos/modules/services/x11/mesa.nix b/nixos/modules/hardware/opengl.nix
similarity index 68%
rename from nixos/modules/services/x11/mesa.nix
rename to nixos/modules/hardware/opengl.nix
index f892a1517582a04fc4dc3e65878b18e4921bbb5d..485ac008dd8a61fb1cbc2bd692e3539a7546f9ab 100644
--- a/nixos/modules/services/x11/mesa.nix
+++ b/nixos/modules/hardware/opengl.nix
@@ -2,19 +2,19 @@
let
inherit (pkgs.lib) mkOption types mkIf optional optionals elem optionalString optionalAttrs;
- cfg = config.services.mesa;
+ cfg = config.hardware.opengl;
kernelPackages = config.boot.kernelPackages;
in {
options = {
- services.mesa.enable = mkOption {
- description = "Whether this configuration requires mesa.";
+ hardware.opengl.enable = mkOption {
+ description = "Whether this configuration requires opengl.";
type = types.bool;
default = false;
internal = true;
};
- services.mesa.driSupport = mkOption {
+ hardware.opengl.driSupport = mkOption {
type = types.bool;
default = true;
description = ''
@@ -23,51 +23,55 @@ in {
'';
};
- services.mesa.driSupport32Bit = mkOption {
+ hardware.opengl.driSupport32Bit = mkOption {
type = types.bool;
default = false;
description = ''
On 64-bit systems, whether to support Direct Rendering for
32-bit applications (such as Wine). This is currently only
supported for the nvidia driver and for
- mesa.
+ Mesa.
'';
};
- services.mesa.s3tcSupport = mkOption {
+ hardware.opengl.s3tcSupport = mkOption {
type = types.bool;
default = false;
description = ''
Make S3TC(S3 Texture Compression) via libtxc_dxtn available
- to OpenGL drivers. It is essential for many games to work
- with FOSS GPU drivers.
+ to OpenGL drivers instead of the patent-free S2TC replacement.
Using this library may require a patent license depending on your location.
'';
};
- services.mesa.videoDrivers = mkOption {
+ hardware.opengl.videoDrivers = mkOption {
type = types.listOf types.str;
# !!! We'd like "nv" here, but it segfaults the X server.
default = [ "ati" "cirrus" "intel" "vesa" "vmware" ];
example = [ "vesa" ];
description = ''
- The names of the video drivers that the mesa should
- support. Mesa will try all of the drivers listed
- here until it finds one that supports your video card.
+ The names of the opengl video drivers the configuration
+ supports. They will be tried in order until one that
+ supports your card is found.
'';
};
};
config = mkIf cfg.enable {
+ assertions = pkgs.lib.singleton {
+ assertion = cfg.driSupport32Bit -> pkgs.stdenv.isx86_64;
+ message = "Option driSupport32Bit only makes sens on a 64-bit system.";
+ };
+
system.activationScripts.setup-opengl.deps = [];
system.activationScripts.setup-opengl.text = ''
rm -f /run/opengl-driver{,-32}
- ${optionalString (!cfg.driSupport32Bit) "ln -sf opengl-driver /run/opengl-driver-32"}
-
- ${# !!! The OpenGL driver depends on what's detected at runtime.
- if elem "nvidia" cfg.videoDrivers then
+ ${optionalString (pkgs.stdenv.isi686) "ln -sf opengl-driver /run/opengl-driver-32"}
+ ''
+ #TODO: The OpenGL driver should depend on what's detected at runtime.
+ +( if elem "nvidia" cfg.videoDrivers then
''
ln -sf ${kernelPackages.nvidia_x11} /run/opengl-driver
${optionalString cfg.driSupport32Bit
@@ -84,18 +88,25 @@ in {
else if elem "ati_unfree" cfg.videoDrivers then
"ln -sf ${kernelPackages.ati_drivers_x11} /run/opengl-driver"
else
+ let
+ lib_fun = p: p.buildEnv {
+ name = "mesa-drivers+txc-${p.mesa_drivers.version}";
+ paths = [
+ p.mesa_drivers
+ p.mesa_noglu # mainly for libGL
+ (if cfg.s3tcSupport then p.libtxc_dxtn else p.libtxc_dxtn_s2tc)
+ ];
+ };
+ in
''
- ${optionalString cfg.driSupport "ln -sf ${pkgs.mesa_drivers} /run/opengl-driver"}
+ ${optionalString cfg.driSupport "ln -sf ${lib_fun pkgs} /run/opengl-driver"}
${optionalString cfg.driSupport32Bit
- "ln -sf ${pkgs_i686.mesa_drivers} /run/opengl-driver-32"}
+ "ln -sf ${lib_fun pkgs_i686} /run/opengl-driver-32"}
''
- }
- '';
+ );
environment.variables.LD_LIBRARY_PATH =
- [ "/run/opengl-driver/lib" "/run/opengl-driver-32/lib" ]
- ++ optional cfg.s3tcSupport "${pkgs.libtxc_dxtn}/lib"
- ++ optional (cfg.s3tcSupport && cfg.driSupport32Bit) "${pkgs_i686.libtxc_dxtn}/lib";
+ [ "/run/opengl-driver/lib" "/run/opengl-driver-32/lib" ];
boot.extraModulePackages =
optional (elem "nvidia" cfg.videoDrivers) kernelPackages.nvidia_x11 ++
diff --git a/nixos/modules/hardware/pcmcia.nix b/nixos/modules/hardware/pcmcia.nix
index 206846567505a044fab3e32b988778663c854750..d7d002ae6c8a7dc30ec489434e740681088117b3 100644
--- a/nixos/modules/hardware/pcmcia.nix
+++ b/nixos/modules/hardware/pcmcia.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/hardware/video/bumblebee.nix b/nixos/modules/hardware/video/bumblebee.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f06139adc445f65959f0c6a323ec2470867658c4
--- /dev/null
+++ b/nixos/modules/hardware/video/bumblebee.nix
@@ -0,0 +1,41 @@
+{ config, lib, pkgs, ... }:
+
+let kernel = config.boot.kernelPackages; in
+with lib;
+
+{
+
+ options = {
+ hardware.bumblebee.enable = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Enable the bumblebee daemon to manage Optimus hybrid video cards.
+ This should power off secondary GPU until its use is requested
+ by running an application with optirun.
+
+ Only nvidia driver is supported so far.
+ '';
+ };
+ };
+
+ config = mkIf config.hardware.bumblebee.enable {
+ boot.blacklistedKernelModules = [ "nouveau" "nvidia" ];
+ boot.kernelModules = [ "bbswitch" ];
+ boot.extraModulePackages = [ kernel.bbswitch kernel.nvidia_x11 ];
+
+ environment.systemPackages = [ pkgs.bumblebee ];
+
+ systemd.services.bumblebeed = {
+ description = "Bumblebee Hybrid Graphics Switcher";
+ wantedBy = [ "display-manager.service" ];
+ script = "bumblebeed --use-syslog";
+ path = [ kernel.bbswitch pkgs.bumblebee ];
+ serviceConfig = {
+ Restart = "always";
+ RestartSec = 60;
+ CPUSchedulingPolicy = "idle";
+ };
+ };
+ };
+}
diff --git a/nixos/modules/installer/cd-dvd/channel.nix b/nixos/modules/installer/cd-dvd/channel.nix
index 9aca5b89d2584a2b6ec507cb926555512208940c..ca0e233f9e3f39e8c026341fe0a015517108f1bb 100644
--- a/nixos/modules/installer/cd-dvd/channel.nix
+++ b/nixos/modules/installer/cd-dvd/channel.nix
@@ -1,9 +1,9 @@
# Provide an initial copy of the NixOS channel so that the user
# doesn't need to run "nix-channel --update" first.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -28,7 +28,7 @@ in
{
# Provide the NixOS/Nixpkgs sources in /etc/nixos. This is required
# for nixos-install.
- boot.postBootCommands =
+ boot.postBootCommands = mkAfter
''
if ! [ -e /var/lib/nixos/did-channel-init ]; then
echo "unpacking the NixOS/Nixpkgs sources..."
diff --git a/nixos/modules/installer/cd-dvd/installation-cd-base.nix b/nixos/modules/installer/cd-dvd/installation-cd-base.nix
index 1aba67dcd9e9a8dd8c4e699f42e904ff5cd191c8..a120a01041bde21a80ded5f4b1d8895026dfdc12 100644
--- a/nixos/modules/installer/cd-dvd/installation-cd-base.nix
+++ b/nixos/modules/installer/cd-dvd/installation-cd-base.nix
@@ -1,9 +1,9 @@
# This module contains the basic configuration for building a NixOS
# installation CD.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
imports =
@@ -19,7 +19,7 @@ with pkgs.lib;
# ISO naming.
isoImage.isoName = "${config.isoImage.isoBaseName}-${config.system.nixosVersion}-${pkgs.stdenv.system}.iso";
- isoImage.volumeID = substring 0 32 "NIXOS_${config.system.nixosVersion}";
+ isoImage.volumeID = substring 0 11 "NIXOS_${config.system.nixosVersion}";
# Make the installer more likely to succeed in low memory
# environments. The kernel's overcommit heustistics bite us
@@ -29,14 +29,15 @@ with pkgs.lib;
boot.kernel.sysctl."vm.overcommit_memory" = "1";
# To speed up installation a little bit, include the complete stdenv
- # in the Nix store on the CD.
- isoImage.storeContents = [ pkgs.stdenv pkgs.busybox ];
+ # in the Nix store on the CD. Archive::Cpio is needed for the
+ # initrd builder.
+ isoImage.storeContents = [ pkgs.stdenv pkgs.busybox pkgs.perlPackages.ArchiveCpio ];
# EFI booting
isoImage.makeEfiBootable = true;
# Add Memtest86+ to the CD.
- boot.loader.grub.memtest86 = true;
+ boot.loader.grub.memtest86.enable = true;
# Get a console as soon as the initrd loads fbcon on EFI boot
boot.initrd.kernelModules = [ "fbcon" ];
diff --git a/nixos/modules/installer/cd-dvd/installation-cd-graphical.nix b/nixos/modules/installer/cd-dvd/installation-cd-graphical.nix
index debf3e7db906fc054fc75773559eb8106c324831..65aa11670893139b0be0c45876bfd4196e8047be 100644
--- a/nixos/modules/installer/cd-dvd/installation-cd-graphical.nix
+++ b/nixos/modules/installer/cd-dvd/installation-cd-graphical.nix
@@ -1,9 +1,9 @@
# This module defines a NixOS installation CD that contains X11 and
# KDE 4.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
imports = [ ./installation-cd-base.nix ../../profiles/graphical.nix ];
diff --git a/nixos/modules/installer/cd-dvd/iso-image.nix b/nixos/modules/installer/cd-dvd/iso-image.nix
index 00a9e91c73384bf62cf1480b4986323b54392321..00f5fae84342f66a64ef87bcabf4207953ef91f5 100644
--- a/nixos/modules/installer/cd-dvd/iso-image.nix
+++ b/nixos/modules/installer/cd-dvd/iso-image.nix
@@ -2,9 +2,9 @@
# configuration. The derivation for the ISO image will be placed in
# config.system.build.isoImage.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix b/nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix
index 13ed95d4cebd5cd469b9564bb2de1549322db2a3..c274970c553676baa990869252be6d605d5095df 100644
--- a/nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix
+++ b/nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/installer/cd-dvd/system-tarball-pc.nix b/nixos/modules/installer/cd-dvd/system-tarball-pc.nix
index fcb96f7a24fe201c5e116abb850fb2cc0e311db8..0357bf801960846893cbc26a4d1da5bb22e75e05 100644
--- a/nixos/modules/installer/cd-dvd/system-tarball-pc.nix
+++ b/nixos/modules/installer/cd-dvd/system-tarball-pc.nix
@@ -1,9 +1,9 @@
# This module contains the basic configuration for building a NixOS
# tarball, that can directly boot, maybe using PXE or unpacking on a fs.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix b/nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix
index 7f253d595dc3878d2e5bc3af2376147b93c2ff47..1008bd5d3d0de50e70e0b11014bb1ba9e34835a6 100644
--- a/nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix
+++ b/nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix
@@ -1,9 +1,9 @@
# This module contains the basic configuration for building a NixOS
# tarball for the sheevaplug.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -138,8 +138,7 @@ in
};
# Setting vesa, we don't get the nvidia driver, which can't work in arm.
- services.xserver.videoDriver = "vesa";
- services.xserver.videoDrivers = [];
+ hardware.opengl.videoDrivers = [ "vesa" ];
services.nixosManual.enable = false;
# Include the firmware for various wireless cards.
diff --git a/nixos/modules/installer/cd-dvd/system-tarball.nix b/nixos/modules/installer/cd-dvd/system-tarball.nix
index 8d678fba71f54d8c792d63a002c75af89a86bd80..eaecbe1381f50f6e84f22997c6ff34076235e33e 100644
--- a/nixos/modules/installer/cd-dvd/system-tarball.nix
+++ b/nixos/modules/installer/cd-dvd/system-tarball.nix
@@ -2,9 +2,9 @@
# configuration. The derivation for the ISO image will be placed in
# config.system.build.tarball.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/installer/scan/detected.nix b/nixos/modules/installer/scan/detected.nix
index 09d04608e68586b2f272a2b66a3433867d1a775c..f350cd986afa0a2495843acbc9f8c36d7dec82b1 100644
--- a/nixos/modules/installer/scan/detected.nix
+++ b/nixos/modules/installer/scan/detected.nix
@@ -1,8 +1,8 @@
# List all devices which are detected by nixos-hardware-scan.
# Common devices are enabled by default.
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
config = mkDefault {
diff --git a/nixos/modules/installer/scan/not-detected.nix b/nixos/modules/installer/scan/not-detected.nix
index 814858fdffda0fbcf94c6d8c66253a8af4cb2608..b30c569ed2a7a0c466ea2363d3171898f3742e70 100644
--- a/nixos/modules/installer/scan/not-detected.nix
+++ b/nixos/modules/installer/scan/not-detected.nix
@@ -1,8 +1,8 @@
# List all devices which are _not_ detected by nixos-hardware-scan.
# Common devices are enabled by default.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
hardware.enableAllFirmware = true;
diff --git a/nixos/modules/installer/tools/nixos-checkout.nix b/nixos/modules/installer/tools/nixos-checkout.nix
index 41899855686434f6cfd827e404eb51db907cecf8..3338e5119acb8283690dcefe11a8fd3b3898005b 100644
--- a/nixos/modules/installer/tools/nixos-checkout.nix
+++ b/nixos/modules/installer/tools/nixos-checkout.nix
@@ -1,9 +1,9 @@
# This module generates the nixos-checkout script, which replaces the
# Nixpkgs source trees in /etc/nixos/nixpkgs with a Git checkout.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/installer/tools/nixos-generate-config.pl b/nixos/modules/installer/tools/nixos-generate-config.pl
index 6b42058a89263180a02131317c352ea6ab1db19c..da1d26882772c4951acc7a8227e8074c56fa8c08 100644
--- a/nixos/modules/installer/tools/nixos-generate-config.pl
+++ b/nixos/modules/installer/tools/nixos-generate-config.pl
@@ -61,7 +61,7 @@ my @attrs = ();
my @kernelModules = ();
my @initrdKernelModules = ();
my @modulePackages = ();
-my @imports = ("");
+my @imports = ("");
sub debug {
@@ -96,9 +96,9 @@ my $videoDriver;
sub pciCheck {
my $path = shift;
- my $vendor = read_file "$path/vendor";
- my $device = read_file "$path/device";
- my $class = read_file "$path/class";
+ my $vendor = read_file "$path/vendor"; chomp $vendor;
+ my $device = read_file "$path/device"; chomp $device;
+ my $class = read_file "$path/class"; chomp $class;
my $module;
if (-e "$path/driver/module") {
@@ -130,6 +130,7 @@ sub pciCheck {
# broadcom STA driver (wl.ko)
# list taken from http://www.broadcom.com/docs/linux_sta/README.txt
+ # FIXME: still needed?
if ($vendor eq "0x14e4" &&
($device eq "0x4311" || $device eq "0x4312" || $device eq "0x4313" ||
$device eq "0x4315" || $device eq "0x4327" || $device eq "0x4328" ||
@@ -156,6 +157,7 @@ sub pciCheck {
# Assume that all NVIDIA cards are supported by the NVIDIA driver.
# There may be exceptions (e.g. old cards).
+ # FIXME: do we want to enable an unfree driver here?
$videoDriver = "nvidia" if $vendor eq "0x10de" && $class =~ /^0x03/;
}
@@ -163,16 +165,16 @@ foreach my $path (glob "/sys/bus/pci/devices/*") {
pciCheck $path;
}
-push @attrs, "services.xserver.videoDrivers = [ \"$videoDriver\" ];" if $videoDriver;
+push @attrs, "hardware.opengl.videoDrivers = [ \"$videoDriver\" ];" if $videoDriver;
# Idem for USB devices.
sub usbCheck {
my $path = shift;
- my $class = read_file "$path/bInterfaceClass";
- my $subclass = read_file "$path/bInterfaceSubClass";
- my $protocol = read_file "$path/bInterfaceProtocol";
+ my $class = read_file "$path/bInterfaceClass"; chomp $class;
+ my $subclass = read_file "$path/bInterfaceSubClass"; chomp $subclass;
+ my $protocol = read_file "$path/bInterfaceProtocol"; chomp $protocol;
my $module;
if (-e "$path/driver/module") {
@@ -216,14 +218,22 @@ foreach my $path (glob "/sys/class/block/*") {
}
+my $dmi = `@dmidecode@/sbin/dmidecode`;
+
+
# Check if we're a VirtualBox guest. If so, enable the guest
# additions.
-my $dmi = `@dmidecode@/sbin/dmidecode`;
if ($dmi =~ /Manufacturer: innotek/) {
push @attrs, "services.virtualbox.enable = true;"
}
+# Likewise for QEMU.
+if ($dmi =~ /Manufacturer: Bochs/) {
+ push @imports, "";
+}
+
+
# Generate the swapDevices option from the currently activated swap
# devices.
my @swaps = read_file("/proc/swaps");
@@ -256,7 +266,7 @@ foreach my $fs (read_file("/proc/self/mountinfo")) {
$mountPoint = "/" if $mountPoint eq "";
# Skip special filesystems.
- next if in($mountPoint, "/proc") || in($mountPoint, "/dev") || in($mountPoint, "/sys") || in($mountPoint, "/run");
+ next if in($mountPoint, "/proc") || in($mountPoint, "/dev") || in($mountPoint, "/sys") || in($mountPoint, "/run") || $mountPoint eq "/var/lib/nfs/rpc_pipefs";
# Skip the optional fields.
my $n = 6; $n++ while $fields[$n] ne "-"; $n++;
@@ -305,7 +315,15 @@ EOF
fileSystems.\"$mountPoint\" =
{ device = \"$device\";
fsType = \"$fsType\";
- options = \"${\join ",", uniq(@extraOptions, @superOptions, @mountOptions)}\";
+EOF
+
+ if (scalar @extraOptions > 0) {
+ $fileSystems .= <&2 "An error occured while looking for attribute names."
+ echo 1>&2 "An error occurred while looking for attribute names."
echo $result
fi
fi
diff --git a/nixos/modules/installer/tools/nixos-rebuild.sh b/nixos/modules/installer/tools/nixos-rebuild.sh
index 5c89394abceb37f685c1ab907e298be275ed01d5..d7b749573fa9e9220dc6fc1598c727ed1a7e370e 100644
--- a/nixos/modules/installer/tools/nixos-rebuild.sh
+++ b/nixos/modules/installer/tools/nixos-rebuild.sh
@@ -1,4 +1,8 @@
-#! @shell@ -e
+#! @shell@
+
+if [ -x "@shell@" ]; then export SHELL="@shell@"; fi;
+
+set -e
showSyntax() {
exec man nixos-rebuild
@@ -7,6 +11,7 @@ showSyntax() {
# Parse the command line.
+origArgs=("$@")
extraBuildFlags=()
action=
buildNix=1
@@ -40,7 +45,7 @@ while [ "$#" -gt 0 ]; do
repair=1
extraBuildFlags+=("$i")
;;
- --show-trace|--no-build-hook|--keep-failed|-K|--keep-going|-k|--verbose|-v|-vv|-vvv|-vvvv|-vvvvv|--fallback|--repair)
+ --show-trace|--no-build-hook|--keep-failed|-K|--keep-going|-k|--verbose|-v|-vv|-vvv|-vvvv|-vvvvv|--fallback|--repair|--no-build-output|-Q)
extraBuildFlags+=("$i")
;;
--max-jobs|-j|--cores|-I)
@@ -76,8 +81,30 @@ done
if [ -z "$action" ]; then showSyntax; fi
-if [ -n "$rollback" ]; then
- buildNix=
+# Only run shell scripts from the Nixpkgs tree if the action is
+# "switch", "boot", or "test". With other actions (such as "build"),
+# the user may reasonably expect that no code from the Nixpkgs tree is
+# executed, so it's safe to run nixos-rebuild against a potentially
+# untrusted tree.
+canRun=
+if [ "$action" = switch -o "$action" = boot -o "$action" = test ]; then
+ canRun=1
+fi
+
+
+# If ‘--upgrade’ is given, run ‘nix-channel --update nixos’.
+if [ -n "$upgrade" -a -z "$_NIXOS_REBUILD_REEXEC" ]; then
+ nix-channel --update nixos
+fi
+
+
+# Re-execute nixos-rebuild from the Nixpkgs tree.
+if [ -z "$_NIXOS_REBUILD_REEXEC" -a -n "$canRun" ]; then
+ if p=$(nix-instantiate --find-file nixpkgs/nixos/modules/installer/tools/nixos-rebuild.sh "${extraBuildFlags[@]}"); then
+ export _NIXOS_REBUILD_REEXEC=1
+ exec $SHELL -e $p "${origArgs[@]}"
+ exit 1
+ fi
fi
@@ -98,20 +125,33 @@ if [ -z "$repair" ] && systemctl show nix-daemon.socket nix-daemon.service | gre
fi
-# If ‘--upgrade’ is given, run ‘nix-channel --update nixos’.
-if [ -n "$upgrade" ]; then
- nix-channel --update nixos
+# First build Nix, since NixOS may require a newer version than the
+# current one.
+if [ -n "$rollback" -o "$action" = dry-run ]; then
+ buildNix=
fi
-
-# First build Nix, since NixOS may require a newer version than the
-# current one. Of course, the same goes for Nixpkgs, but Nixpkgs is
-# more conservative.
-if [ "$action" != dry-run -a -n "$buildNix" ]; then
+if [ -n "$buildNix" ]; then
echo "building Nix..." >&2
if ! nix-build '' -A config.nix.package -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null; then
if ! nix-build '' -A nixFallback -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null; then
- nix-build '' -A nixUnstable -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null
+ if ! nix-build '' -A nix -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null; then
+ machine="$(uname -m)"
+ if [ "$machine" = x86_64 ]; then
+ nixStorePath=/nix/store/d34q3q2zj9nriq4ifhn3dnnngqvinjb3-nix-1.7
+ elif [[ "$machine" =~ i.86 ]]; then
+ nixStorePath=/nix/store/qlah0darpcn6sf3lr2226rl04l1gn4xz-nix-1.7
+ else
+ echo "$0: unsupported platform"
+ exit 1
+ fi
+ if ! nix-store -r $nixStorePath --add-root $tmpDir/nix --indirect \
+ --option extra-binary-caches http://cache.nixos.org/; then
+ echo "warning: don't know how to get latest Nix" >&2
+ fi
+ # Older version of nix-store -r don't support --add-root.
+ [ -e $tmpDir/nix ] || ln -sf $nixStorePath $tmpDir/nix
+ fi
fi
fi
PATH=$tmpDir/nix/bin:$PATH
@@ -120,10 +160,12 @@ fi
# Update the version suffix if we're building from Git (so that
# nixos-version shows something useful).
-if nixpkgs=$(nix-instantiate --find-file nixpkgs "${extraBuildFlags[@]}"); then
- suffix=$(@shell@ $nixpkgs/nixos/modules/installer/tools/get-version-suffix "${extraBuildFlags[@]}" || true)
- if [ -n "$suffix" ]; then
- echo -n "$suffix" > "$nixpkgs/.version-suffix" || true
+if [ -n "$canRun" ]; then
+ if nixpkgs=$(nix-instantiate --find-file nixpkgs "${extraBuildFlags[@]}"); then
+ suffix=$($SHELL $nixpkgs/nixos/modules/installer/tools/get-version-suffix "${extraBuildFlags[@]}" || true)
+ if [ -n "$suffix" ]; then
+ echo -n "$suffix" > "$nixpkgs/.version-suffix" || true
+ fi
fi
fi
diff --git a/nixos/modules/installer/tools/tools.nix b/nixos/modules/installer/tools/tools.nix
index 652bfa917dfa3048c37f1eb398ae01602d862535..7dbcc261485df3ea5e72371ad295a34a2d6c9bdb 100644
--- a/nixos/modules/installer/tools/tools.nix
+++ b/nixos/modules/installer/tools/tools.nix
@@ -80,9 +80,9 @@ in
/*
options = {
- installer.enableGraphicalTools = pkgs.lib.mkOption {
+ installer.enableGraphicalTools = mkOption {
default = false;
- type = with pkgs.lib.types; bool;
+ type = types.bool;
example = true;
description = ''
Enable the installation of graphical tools.
diff --git a/nixos/modules/installer/virtualbox-demo.nix b/nixos/modules/installer/virtualbox-demo.nix
index 76cc29a1facd96cc275d4128b8fcbe65485cbdb5..0a52cbea28979dbc2163bc7854e7f43463a2032b 100644
--- a/nixos/modules/installer/virtualbox-demo.nix
+++ b/nixos/modules/installer/virtualbox-demo.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
imports =
@@ -15,5 +15,5 @@ with pkgs.lib;
# Add some more video drivers to give X11 a shot at working in
# VMware and QEMU.
- services.xserver.videoDrivers = mkOverride 40 [ "virtualbox" "vmware" "cirrus" "vesa" ];
+ hardware.opengl.videoDrivers = mkOverride 40 [ "virtualbox" "vmware" "cirrus" "vesa" ];
}
diff --git a/nixos/modules/misc/assertions.nix b/nixos/modules/misc/assertions.nix
index 5fb88308b77669ce5db99e474b21bcca65471cab..786ec7d250c424bd29a5aa98280230b1c82b28e1 100644
--- a/nixos/modules/misc/assertions.nix
+++ b/nixos/modules/misc/assertions.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/misc/check-config.nix b/nixos/modules/misc/check-config.nix
index f759c88d3a1f117fc47f57bf2ea5603c04517875..e9803de21961ae2c466d214a9a14232ccc24ffe9 100644
--- a/nixos/modules/misc/check-config.nix
+++ b/nixos/modules/misc/check-config.nix
@@ -1,6 +1,6 @@
-{ pkgs, ... }:
+{ lib, ... }:
-with pkgs.lib;
+with lib;
{
options = {
diff --git a/nixos/modules/misc/crashdump.nix b/nixos/modules/misc/crashdump.nix
index 6e71baa9a4317c3c73edbc7c3ff2dd0ad6da599c..d68f38bae2f521e79a5a31ea984b3020f8174343 100644
--- a/nixos/modules/misc/crashdump.nix
+++ b/nixos/modules/misc/crashdump.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
crashdump = config.boot.crashDump;
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 16eec904321230a87f91843f2e804d79ab5c2f8e..2d9ea1450ff05bf62d7c4a80430c73c65cf1a099 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -110,6 +110,27 @@
openldap = 99;
memcached = 100;
cgminer = 101;
+ munin = 102;
+ logcheck = 103;
+ nix-ssh = 104;
+ dictd = 105;
+ couchdb = 106;
+ searx = 107;
+ kippo = 108;
+ jenkins = 109;
+ systemd-journal-gateway = 110;
+ notbit = 111;
+ ngircd = 112;
+ btsync = 113;
+ minecraft = 114;
+ monetdb = 115;
+ rippled = 116;
+ murmur = 117;
+ foundationdb = 118;
+ newrelic = 119;
+ starbound = 120;
+ hydra = 122;
+ spiped = 123;
# When adding a uid, make sure it doesn't match an existing gid.
@@ -199,6 +220,22 @@
haproxy = 92;
openldap = 93;
connman = 94;
+ munin = 95;
+ keys = 96;
+ dictd = 105;
+ couchdb = 106;
+ searx = 107;
+ kippo = 108;
+ jenkins = 109;
+ systemd-journal-gateway = 110;
+ notbit = 111;
+ monetdb = 115;
+ foundationdb = 118;
+ newrelic = 119;
+ starbound = 120;
+ grsecurity = 121;
+ hydra = 122;
+ spiped = 123;
# When adding a gid, make sure it doesn't match an existing uid.
diff --git a/nixos/modules/misc/locate.nix b/nixos/modules/misc/locate.nix
index b6408be5844f0b4304fadce551601db249b9cea8..45da0df7967c759ba99fb552bb0fb41a10dd2c60 100644
--- a/nixos/modules/misc/locate.nix
+++ b/nixos/modules/misc/locate.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/misc/nixpkgs.nix b/nixos/modules/misc/nixpkgs.nix
index 7433fab168e2fe93d6eb0f2a6e9c4765b40bb03b..a5dad7dd9071098694b722b45af3dbd5a3d9ece7 100644
--- a/nixos/modules/misc/nixpkgs.nix
+++ b/nixos/modules/misc/nixpkgs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
isConfig = x:
diff --git a/nixos/modules/misc/version.nix b/nixos/modules/misc/version.nix
index ae9fb5fb2a0eb90a2c0818eb4030756b29653f6f..67bafac4c455dfb63bcfef9c7ee4a4c036dfba1b 100644
--- a/nixos/modules/misc/version.nix
+++ b/nixos/modules/misc/version.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 442edd8029def26c622598102dd4b2a7cd536130..5c30d74be69416beb850063dff33213055095d32 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -29,7 +29,9 @@
./hardware/network/intel-3945abg.nix
./hardware/network/ralink.nix
./hardware/network/rtl8192c.nix
+ ./hardware/opengl.nix
./hardware/pcmcia.nix
+ ./hardware/video/bumblebee.nix
./installer/tools/nixos-checkout.nix
./installer/tools/tools.nix
./misc/assertions.nix
@@ -59,6 +61,8 @@
./security/apparmor.nix
./security/apparmor-suid.nix
./security/ca.nix
+ ./security/duosec.nix
+ ./security/grsecurity.nix
./security/pam.nix
./security/pam_usb.nix
./security/polkit.nix
@@ -76,20 +80,34 @@
./services/backup/bacula.nix
./services/backup/mysql-backup.nix
./services/backup/postgresql-backup.nix
- ./services/backup/sitecopy-backup.nix
./services/backup/rsnapshot.nix
+ ./services/backup/sitecopy-backup.nix
+ ./services/backup/tarsnap.nix
+ ./services/continuous-integration/jenkins/default.nix
+ ./services/continuous-integration/jenkins/slave.nix
./services/databases/4store-endpoint.nix
./services/databases/4store.nix
+ ./services/databases/couchdb.nix
./services/databases/firebird.nix
./services/databases/memcached.nix
./services/databases/mongodb.nix
./services/databases/redis.nix
./services/databases/mysql.nix
- ./services/databases/mysql55.nix
./services/databases/openldap.nix
./services/databases/postgresql.nix
./services/databases/virtuoso.nix
+ ./services/databases/monetdb.nix
+ ./services/desktops/accountservice.nix
+ ./services/desktops/gnome3/at-spi2-core.nix
+ ./services/desktops/gnome3/evolution-data-server.nix
+ ./services/desktops/gnome3/gnome-keyring.nix
+ ./services/desktops/gnome3/gnome-online-accounts.nix
+ ./services/desktops/gnome3/gnome-user-share.nix
+ ./services/desktops/gnome3/sushi.nix
+ ./services/desktops/gnome3/tracker.nix
+ ./services/desktops/telepathy.nix
./services/games/ghost-one.nix
+ ./services/games/minecraft-server.nix
./services/hardware/acpid.nix
./services/hardware/amd-hybrid-graphics.nix
./services/hardware/bluetooth.nix
@@ -116,13 +134,16 @@
./services/mail/spamassassin.nix
./services/misc/autofs.nix
./services/misc/cgminer.nix
+ ./services/misc/dictd.nix
./services/misc/disnix.nix
./services/misc/felix.nix
./services/misc/folding-at-home.nix
./services/misc/gpsd.nix
./services/misc/nix-daemon.nix
./services/misc/nix-gc.nix
+ ./services/misc/nix-ssh-serve.nix
./services/misc/nixos-manual.nix
+ ./services/misc/rippled.nix
./services/misc/rogue.nix
./services/misc/svnserve.nix
./services/misc/synergy.nix
@@ -142,11 +163,14 @@
./services/network-filesystems/drbd.nix
./services/network-filesystems/nfsd.nix
./services/network-filesystems/openafs-client/default.nix
+ ./services/network-filesystems/rsyncd.nix
./services/network-filesystems/samba.nix
./services/networking/amuled.nix
./services/networking/avahi-daemon.nix
./services/networking/bind.nix
./services/networking/bitlbee.nix
+ ./services/networking/btsync.nix
+ ./services/networking/cjdns.nix
./services/networking/connman.nix
./services/networking/cntlm.nix
./services/networking/chrony.nix
@@ -170,8 +194,11 @@
./services/networking/ircd-hybrid/default.nix
./services/networking/kippo.nix
./services/networking/minidlna.nix
+ ./services/networking/murmur.nix
./services/networking/nat.nix
./services/networking/networkmanager.nix
+ ./services/networking/ngircd.nix
+ ./services/networking/notbit.nix
./services/networking/ntopng.nix
./services/networking/ntpd.nix
./services/networking/oidentd.nix
@@ -184,7 +211,10 @@
./services/networking/rdnssd.nix
./services/networking/rpcbind.nix
./services/networking/sabnzbd.nix
+ ./services/networking/searx.nix
+ ./services/networking/spiped.nix
./services/networking/supybot.nix
+ ./services/networking/syncthing.nix
./services/networking/ssh/lshd.nix
./services/networking/ssh/sshd.nix
./services/networking/tftpd.nix
@@ -200,6 +230,7 @@
./services/scheduling/cron.nix
./services/scheduling/fcron.nix
./services/search/elasticsearch.nix
+ ./services/search/solr.nix
./services/security/clamav.nix
./services/security/haveged.nix
./services/security/fprot.nix
@@ -222,8 +253,10 @@
./services/web-servers/lighttpd/cgit.nix
./services/web-servers/lighttpd/gitweb.nix
./services/web-servers/nginx/default.nix
+ ./services/web-servers/phpfpm.nix
./services/web-servers/tomcat.nix
./services/web-servers/varnish/default.nix
+ ./services/web-servers/winstone.nix
./services/web-servers/zope2.nix
./services/x11/desktop-managers/default.nix
./services/x11/display-managers/auto.nix
@@ -234,7 +267,6 @@
./services/x11/hardware/multitouch.nix
./services/x11/hardware/synaptics.nix
./services/x11/hardware/wacom.nix
- ./services/x11/mesa.nix
./services/x11/window-managers/awesome.nix
#./services/x11/window-managers/compiz.nix
./services/x11/window-managers/default.nix
@@ -282,6 +314,7 @@
./tasks/scsi-link-power-management.nix
./tasks/swraid.nix
./testing/service-runner.nix
+ ./virtualisation/container-config.nix
./virtualisation/containers.nix
./virtualisation/libvirtd.nix
#./virtualisation/nova.nix
diff --git a/nixos/modules/profiles/clone-config.nix b/nixos/modules/profiles/clone-config.nix
index 04ee76d8d3e95c098aab07b14dbbfb5c248aa0a0..f0d60bb6c428ec5080ad7da17dcc161853e3d48d 100644
--- a/nixos/modules/profiles/clone-config.nix
+++ b/nixos/modules/profiles/clone-config.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, modules, ... }:
+{ config, lib, pkgs, modules, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/profiles/demo.nix b/nixos/modules/profiles/demo.nix
index 396dcf6c5d3b60e4edd358ebbc4a7da949fa82cb..605cc6aad1de8112638545b715d5651fa5f31305 100644
--- a/nixos/modules/profiles/demo.nix
+++ b/nixos/modules/profiles/demo.nix
@@ -11,6 +11,6 @@
createHome = true;
useDefaultShell = true;
password = "demo";
- isSystemUser = false;
+ uid = 1000;
};
}
diff --git a/nixos/modules/profiles/headless.nix b/nixos/modules/profiles/headless.nix
index 541c46ca50c2d7f6f4e6ec3eba23e15781383b00..14fc905f783e3835c2dff4c227c581789555bed6 100644
--- a/nixos/modules/profiles/headless.nix
+++ b/nixos/modules/profiles/headless.nix
@@ -1,9 +1,9 @@
# Common configuration for headless machines (e.g., Amazon EC2
# instances).
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
sound.enable = false;
diff --git a/nixos/modules/profiles/installation-device.nix b/nixos/modules/profiles/installation-device.nix
index 3b058c6e971575da16592c9a94be807dcc0e393c..5aab2a2954e7c919c2b6bbd7b27d89701040df0d 100644
--- a/nixos/modules/profiles/installation-device.nix
+++ b/nixos/modules/profiles/installation-device.nix
@@ -1,7 +1,7 @@
# Provide a basic configuration for installation devices like CDs.
-{ config, pkgs, modules, ... }:
+{ config, lib, ... }:
-with pkgs.lib;
+with lib;
{
imports =
@@ -45,7 +45,7 @@ with pkgs.lib;
# Enable wpa_supplicant, but don't start it by default.
networking.wireless.enable = true;
- jobs.wpa_supplicant.startOn = pkgs.lib.mkOverride 50 "";
+ jobs.wpa_supplicant.startOn = mkOverride 50 "";
# Tell the Nix evaluator to garbage collect more aggressively.
# This is desirable in memory-constrained environments that don't
diff --git a/nixos/modules/profiles/minimal.nix b/nixos/modules/profiles/minimal.nix
index 821b9f93465a526a17cec6f1d3ee51a7ad1a3a2d..5067622aaf16dd50429d88fff153a823bedb9931 100644
--- a/nixos/modules/profiles/minimal.nix
+++ b/nixos/modules/profiles/minimal.nix
@@ -1,11 +1,8 @@
# This module defines a small NixOS configuration. It does not
# contain any graphical stuff.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
{
- # Don't include X libraries.
- programs.ssh.setXAuthLocation = false;
- fonts.enableFontConfig = false;
- fonts.enableCoreFonts = false;
+ environment.noXlibs = true;
}
diff --git a/nixos/modules/profiles/qemu-guest.nix b/nixos/modules/profiles/qemu-guest.nix
index c8e6fd4aa7687f235121e99a372663a5446f5f12..0a92b7ace507f4c76f08ad8705f5ab4d04ca1c41 100644
--- a/nixos/modules/profiles/qemu-guest.nix
+++ b/nixos/modules/profiles/qemu-guest.nix
@@ -5,5 +5,13 @@
{
boot.initrd.availableKernelModules = [ "virtio_net" "virtio_pci" "virtio_blk" "9p" "9pnet_virtio" ];
- boot.kernelModules = [ "virtio_balloon" "virtio_console" ];
+ boot.initrd.kernelModules = [ "virtio_balloon" "virtio_console" ];
+
+ boot.initrd.postDeviceCommands =
+ ''
+ # Set the system time from the hardware clock to work around a
+ # bug in qemu-kvm > 1.5.2 (where the VM clock is initialised
+ # to the *boot time* of the host).
+ hwclock -s
+ '';
}
diff --git a/nixos/modules/programs/atop.nix b/nixos/modules/programs/atop.nix
index 7fdaab9d67dfe374942b7bb83229d6ad1521380f..e457db22333bc29d72e8974cb5cbf7df79527b68 100644
--- a/nixos/modules/programs/atop.nix
+++ b/nixos/modules/programs/atop.nix
@@ -1,8 +1,8 @@
# Global configuration for atop.
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.programs.atop;
diff --git a/nixos/modules/programs/bash/bash.nix b/nixos/modules/programs/bash/bash.nix
index 9d33e26c495980179535928ba95701ea5066928e..9584f07b0945a2b253600c033c3edfc6c2677b51 100644
--- a/nixos/modules/programs/bash/bash.nix
+++ b/nixos/modules/programs/bash/bash.nix
@@ -1,9 +1,9 @@
# This module defines global configuration for the Bash shell, in
# particular /etc/bashrc and /etc/profile.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/programs/bash/command-not-found.nix b/nixos/modules/programs/bash/command-not-found.nix
index 502320446a37ea2bab7ff9cf636f5da3f6185f19..8c86d48b0808a2de54c70063f2929ed1bfec8eb9 100644
--- a/nixos/modules/programs/bash/command-not-found.nix
+++ b/nixos/modules/programs/bash/command-not-found.nix
@@ -3,9 +3,9 @@
# SQLite database that maps program names to Nix package names (e.g.,
# "pdflatex" is mapped to "tetex").
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/programs/environment.nix b/nixos/modules/programs/environment.nix
index 7c1922cdfd89727b26d6fb34b69ec6162c0923b8..aa9aec0783422ac06145d22613e45854aeeb4e42 100644
--- a/nixos/modules/programs/environment.nix
+++ b/nixos/modules/programs/environment.nix
@@ -2,9 +2,9 @@
# Most of the stuff here should probably be moved elsewhere sometime.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -17,8 +17,7 @@ in
config = {
environment.variables =
- { LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
- LOCATE_PATH = "/var/cache/locatedb";
+ { LOCATE_PATH = "/var/cache/locatedb";
NIXPKGS_CONFIG = "/etc/nix/nixpkgs-config.nix";
NIX_PATH =
[ "/nix/var/nix/profiles/per-user/root/channels/nixos"
@@ -45,7 +44,7 @@ in
TERMINFO_DIRS = [ "${i}/share/terminfo" ];
PERL5LIB = [ "${i}/lib/perl5/site_perl" ];
ALSA_PLUGIN_DIRS = [ "${i}/lib/alsa-lib" ];
- GST_PLUGIN_PATH = [ "${i}/lib/gstreamer-0.10" ];
+ GST_PLUGIN_SYSTEM_PATH = [ "${i}/lib/gstreamer-0.10" ];
KDEDIRS = [ "${i}" ];
STRIGI_PLUGIN_PATH = [ "${i}/lib/strigi/" ];
QT_PLUGIN_PATH = [ "${i}/lib/qt4/plugins" "${i}/lib/kde4/plugins" ];
diff --git a/nixos/modules/programs/shadow.nix b/nixos/modules/programs/shadow.nix
index 9e46ab8b298fbf4e754b31c4fd83f750b083e1e1..a243509949929b4a8aa6b194a1724cc7f48ed080 100644
--- a/nixos/modules/programs/shadow.nix
+++ b/nixos/modules/programs/shadow.nix
@@ -1,8 +1,8 @@
# Configuration for the pwdutils suite of tools: passwd, useradd, etc.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -58,7 +58,8 @@ in
config = {
- environment.systemPackages = [ pkgs.shadow ];
+ environment.systemPackages =
+ pkgs.lib.optional config.users.mutableUsers pkgs.shadow;
environment.etc =
[ { # /etc/login.defs: global configuration for pwdutils. You
@@ -94,6 +95,8 @@ in
groupmems = { rootOK = true; };
groupdel = { rootOK = true; };
login = { startSession = true; allowNullPassword = true; showMotd = true; updateWtmp = true; };
+ chpasswd = { rootOK = true; };
+ chgpasswd = { rootOK = true; };
};
security.setuidPrograms = [ "passwd" "chfn" "su" "newgrp" ];
diff --git a/nixos/modules/programs/shell.nix b/nixos/modules/programs/shell.nix
index 8052502c21ea5627ef1ad0cebeec5efbec31a45f..80d40a7c708c00d6d6c73a8649f8bcd82c9e2561 100644
--- a/nixos/modules/programs/shell.nix
+++ b/nixos/modules/programs/shell.nix
@@ -1,8 +1,8 @@
# This module defines a standard configuration for NixOS shells.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -28,34 +28,36 @@ in
echo "WARNING: bad ownership on $NIX_USER_PROFILE_DIR" >&2
fi
- if ! test -L $HOME/.nix-profile; then
- if test "$USER" != root; then
- ln -s $NIX_USER_PROFILE_DIR/profile $HOME/.nix-profile
- else
- # Root installs in the system-wide profile by default.
- ln -s /nix/var/nix/profiles/default $HOME/.nix-profile
- fi
- fi
+ if test -w $HOME; then
+ if ! test -L $HOME/.nix-profile; then
+ if test "$USER" != root; then
+ ln -s $NIX_USER_PROFILE_DIR/profile $HOME/.nix-profile
+ else
+ # Root installs in the system-wide profile by default.
+ ln -s /nix/var/nix/profiles/default $HOME/.nix-profile
+ fi
+ fi
- # Subscribe the root user to the NixOS channel by default.
- if [ "$USER" = root -a ! -e $HOME/.nix-channels ]; then
- echo "${config.system.defaultChannel} nixos" > $HOME/.nix-channels
- fi
+ # Subscribe the root user to the NixOS channel by default.
+ if [ "$USER" = root -a ! -e $HOME/.nix-channels ]; then
+ echo "${config.system.defaultChannel} nixos" > $HOME/.nix-channels
+ fi
- # Create the per-user garbage collector roots directory.
- NIX_USER_GCROOTS_DIR=/nix/var/nix/gcroots/per-user/$USER
- mkdir -m 0755 -p $NIX_USER_GCROOTS_DIR
- if test "$(stat --printf '%u' $NIX_USER_GCROOTS_DIR)" != "$(id -u)"; then
- echo "WARNING: bad ownership on $NIX_USER_GCROOTS_DIR" >&2
- fi
+ # Create the per-user garbage collector roots directory.
+ NIX_USER_GCROOTS_DIR=/nix/var/nix/gcroots/per-user/$USER
+ mkdir -m 0755 -p $NIX_USER_GCROOTS_DIR
+ if test "$(stat --printf '%u' $NIX_USER_GCROOTS_DIR)" != "$(id -u)"; then
+ echo "WARNING: bad ownership on $NIX_USER_GCROOTS_DIR" >&2
+ fi
- # Set up a default Nix expression from which to install stuff.
- if [ ! -e $HOME/.nix-defexpr -o -L $HOME/.nix-defexpr ]; then
- rm -f $HOME/.nix-defexpr
- mkdir $HOME/.nix-defexpr
- if [ "$USER" != root ]; then
- ln -s /nix/var/nix/profiles/per-user/root/channels $HOME/.nix-defexpr/channels_root
- fi
+ # Set up a default Nix expression from which to install stuff.
+ if [ ! -e $HOME/.nix-defexpr -o -L $HOME/.nix-defexpr ]; then
+ rm -f $HOME/.nix-defexpr
+ mkdir $HOME/.nix-defexpr
+ if [ "$USER" != root ]; then
+ ln -s /nix/var/nix/profiles/per-user/root/channels $HOME/.nix-defexpr/channels_root
+ fi
+ fi
fi
'';
diff --git a/nixos/modules/programs/ssh.nix b/nixos/modules/programs/ssh.nix
index a66679dff90dff86acd1897e0a2b05a5a6e4f636..fdb9dfd4b8c2b856c2f388e4b10889e7650eaaaa 100644
--- a/nixos/modules/programs/ssh.nix
+++ b/nixos/modules/programs/ssh.nix
@@ -1,8 +1,8 @@
# Global configuration for the SSH client.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.programs.ssh;
cfgd = config.services.openssh;
@@ -31,7 +31,7 @@ in
setXAuthLocation = mkOption {
type = types.bool;
- default = true;
+ default = config.services.xserver.enable;
description = ''
Whether to set the path to xauth for X11-forwarded connections.
This causes a dependency on X11 packages.
@@ -47,7 +47,20 @@ in
for help.
'';
};
+
+ startAgent = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to start the OpenSSH agent when you log in. The OpenSSH agent
+ remembers private keys for you so that you don't have to type in
+ passphrases every time you make an SSH connection. Use
+ ssh-add to add a key to the agent.
+ '';
+ };
+
};
+
};
config = {
@@ -71,5 +84,28 @@ in
target = "ssh/ssh_config";
}
];
+
+ # FIXME: this should really be socket-activated for über-awesomeness.
+ systemd.user.services.ssh-agent =
+ { enable = cfg.startAgent;
+ description = "SSH Agent";
+ wantedBy = [ "default.target" ];
+ serviceConfig =
+ { ExecStartPre = "${pkgs.coreutils}/bin/rm -f %t/ssh-agent";
+ ExecStart = "${pkgs.openssh}/bin/ssh-agent -a %t/ssh-agent";
+ StandardOutput = "null";
+ Type = "forking";
+ Restart = "on-failure";
+ SuccessExitStatus = "0 2";
+ };
+ };
+
+ environment.extraInit = optionalString cfg.startAgent
+ ''
+ if [ -z "$SSH_AUTH_SOCK" -a -n "$XDG_RUNTIME_DIR" ]; then
+ export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent"
+ fi
+ '';
+
};
}
diff --git a/nixos/modules/programs/ssmtp.nix b/nixos/modules/programs/ssmtp.nix
index 904989d57a095f101a6bcd88f786c088d43ee541..34eafd4fa846f6c3b3a57625a7d4d474e1674c44 100644
--- a/nixos/modules/programs/ssmtp.nix
+++ b/nixos/modules/programs/ssmtp.nix
@@ -3,9 +3,9 @@
# directly to an SMTP server defined in its configuration file, wihout
# queueing mail locally.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/programs/venus.nix b/nixos/modules/programs/venus.nix
index 7ab653dd19fd7930f6d8a64847d2146565befd48..2b70a795f4fd37f4c0d8d728d94c20935224d6df 100644
--- a/nixos/modules/programs/venus.nix
+++ b/nixos/modules/programs/venus.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.venus;
diff --git a/nixos/modules/programs/virtualbox.nix b/nixos/modules/programs/virtualbox.nix
index 340fec0496aec743f33c99eaa5af8d613808a7f5..10e657abd3c5a45759cb69a98395ee4d6dfdc07f 100644
--- a/nixos/modules/programs/virtualbox.nix
+++ b/nixos/modules/programs/virtualbox.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let virtualbox = config.boot.kernelPackages.virtualbox; in
diff --git a/nixos/modules/programs/wvdial.nix b/nixos/modules/programs/wvdial.nix
index da3f7dce98a1fe5e11cf0632a85cfffafb7494a7..8e7d0e51a4e09815d90994bec8d7ef99140b8ec6 100644
--- a/nixos/modules/programs/wvdial.nix
+++ b/nixos/modules/programs/wvdial.nix
@@ -1,8 +1,8 @@
# Global configuration for wvdial.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/programs/zsh/zsh.nix b/nixos/modules/programs/zsh/zsh.nix
index cff751934d7dffc9092659e83754a3b3a4fad3ca..7bcf8da2c6595da5cc1dfa7e796bb5ebbce96159 100644
--- a/nixos/modules/programs/zsh/zsh.nix
+++ b/nixos/modules/programs/zsh/zsh.nix
@@ -1,8 +1,8 @@
# This module defines global configuration for the zshell.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -116,8 +116,9 @@ in
# This file is read for all shells.
# Only execute this file once per shell.
+ # But don't clobber the environment of interactive non-login children!
if [ -n "$__ETC_ZSHENV_SOURCED" ]; then return; fi
- __ETC_ZSHENV_SOURCED=1
+ export __ETC_ZSHENV_SOURCED=1
${cfg.shellInit}
diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index 6ff5277cf9caac6602323d466c03ff7458511171..0a67aeb81e566c2c7a9e23ee3962c73b1bfb92fe 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, options, ... }:
+{ config, lib, options, ... }:
-with pkgs.lib;
+with lib;
let
@@ -12,18 +12,20 @@ let
visible = true;
};
+ # warn option was renamed
obsolete = from: to: rename {
inherit from to;
name = "Obsolete name";
- use = x: builtins.trace "Obsolete option `${showOption from}' is used instead of `${showOption to}'." x;
- define = x: builtins.trace "Obsolete option `${showOption from}' is defined instead of `${showOption to}'." x;
+ use = x: builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'." x;
+ define = x: builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'." x;
};
+ # abort if deprecated option is used
deprecated = from: to: rename {
inherit from to;
name = "Deprecated name";
- use = x: abort "Deprecated option `${showOption from}' is used instead of `${showOption to}'.";
- define = x: abort "Deprecated option `${showOption from}' is defined instead of `${showOption to}'.";
+ use = x: abort "Deprecated option `${showOption from}' is used. It was renamed to `${showOption to}'.";
+ define = x: abort "Deprecated option `${showOption from}' is used. It was renamed to `${showOption to}'.";
};
showOption = concatStringsSep ".";
@@ -54,7 +56,7 @@ let
inherit visible;
});
}
- { config = setTo (mkIf (fromOf options).isDefined (define (mkMerge (fromOf options).definitions)));
+ { config = setTo (mkMerge (if (fromOf options).isDefined then [ (define (mkMerge (fromOf options).definitions)) ] else []));
}
];
@@ -101,6 +103,8 @@ in zipModules ([]
++ obsolete [ "services" "sshd" "gatewayPorts" ] [ "services" "openssh" "gatewayPorts" ]
++ obsolete [ "services" "sshd" "permitRootLogin" ] [ "services" "openssh" "permitRootLogin" ]
++ obsolete [ "services" "xserver" "startSSHAgent" ] [ "services" "xserver" "startOpenSSHAgent" ]
+++ obsolete [ "services" "xserver" "startOpenSSHAgent" ] [ "programs" "ssh" "startAgent" ]
+++ obsolete [ "services" "xserver" "windowManager" "xbmc" ] [ "services" "xserver" "desktopManager" "xbmc" ]
# KDE
++ deprecated [ "kde" "extraPackages" ] [ "environment" "kdePackages" ]
@@ -113,10 +117,12 @@ in zipModules ([]
# !!! this hardcodes bash, could we detect from config which shell is actually used?
++ obsolete [ "environment" "promptInit" ] [ "programs" "bash" "promptInit" ]
-++ obsolete [ "services" "xserver" "driSupport" ] [ "services" "mesa" "driSupport" ]
-++ obsolete [ "services" "xserver" "driSupport32Bit" ] [ "services" "mesa" "driSupport32Bit" ]
-++ obsolete [ "services" "xserver" "s3tcSupport" ] [ "services" "mesa" "s3tcSupport" ]
-++ obsolete [ "services" "xserver" "videoDrivers" ] [ "services" "mesa" "videoDrivers" ]
+++ obsolete [ "services" "xserver" "driSupport" ] [ "hardware" "opengl" "driSupport" ]
+++ obsolete [ "services" "xserver" "driSupport32Bit" ] [ "hardware" "opengl" "driSupport32Bit" ]
+++ obsolete [ "services" "xserver" "s3tcSupport" ] [ "hardware" "opengl" "s3tcSupport" ]
+++ obsolete [ "services" "xserver" "videoDrivers" ] [ "hardware" "opengl" "videoDrivers" ]
+
+++ obsolete [ "services" "mysql55" ] [ "services" "mysql" ]
# Options that are obsolete and have no replacement.
++ obsolete' [ "boot" "loader" "grub" "bootDevice" ]
diff --git a/nixos/modules/security/apparmor-suid.nix b/nixos/modules/security/apparmor-suid.nix
index bc661164fdc2930cc18779e243fd41278702d04a..b89b379ae66680eb9ac3ba04ed11003e29d4049c 100644
--- a/nixos/modules/security/apparmor-suid.nix
+++ b/nixos/modules/security/apparmor-suid.nix
@@ -1,8 +1,8 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
let
cfg = config.security.apparmor;
in
-with pkgs.lib;
+with lib;
{
options.security.apparmor.confineSUIDApplications = mkOption {
diff --git a/nixos/modules/security/apparmor.nix b/nixos/modules/security/apparmor.nix
index b9f1515900282a1274dd5e1314e067bfa240d93f..da7c93beee987f6da4585f17598b007735aba521 100644
--- a/nixos/modules/security/apparmor.nix
+++ b/nixos/modules/security/apparmor.nix
@@ -1,55 +1,39 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
+
+with lib;
let
cfg = config.security.apparmor;
in
-
-with pkgs.lib;
-
{
-
- ###### interface
-
options = {
-
security.apparmor = {
-
enable = mkOption {
type = types.bool;
default = false;
- description = ''
- Enable AppArmor application security system. Enable only if
- you want to further improve AppArmor.
- '';
+ description = "Enable the AppArmor Mandatory Access Control system.";
};
profiles = mkOption {
type = types.listOf types.path;
default = [];
- description = ''
- List of file names of AppArmor profiles.
- '';
+ description = "List of files containing AppArmor profiles.";
};
-
};
};
-
- ###### implementation
-
- config = mkIf (cfg.enable) {
-
- assertions = [ { assertion = config.boot.kernelPackages.kernel.features ? apparmor
- && config.boot.kernelPackages.kernel.features.apparmor;
- message = "AppArmor is enabled, but the kernel doesn't have AppArmor support"; }
- ];
+ config = mkIf cfg.enable {
+ assertions =
+ [ { assertion = config.boot.kernelPackages.kernel.features ? apparmor
+ && config.boot.kernelPackages.kernel.features.apparmor;
+ message = "Your selected kernel does not have AppArmor support";
+ }
+ ];
environment.systemPackages = [ pkgs.apparmor ];
-
systemd.services.apparmor = {
- #wantedBy = [ "basic.target" ];
wantedBy = [ "local-fs.target" ];
- path = [ pkgs.apparmor ];
+ path = [ pkgs.apparmor ];
serviceConfig = {
Type = "oneshot";
@@ -61,9 +45,6 @@ with pkgs.lib;
''${pkgs.apparmor}/sbin/apparmor_parser -Rv -I ${pkgs.apparmor}/etc/apparmor.d/ "${profile}" ; ''
) cfg.profiles;
};
-
};
-
};
-
}
diff --git a/nixos/modules/security/ca.nix b/nixos/modules/security/ca.nix
index 2e93fb36b45059a831c494b2a3aadc94fb9ca8d1..f159e359f968ff00b12ee4b6b3fde8199cf4a7da 100644
--- a/nixos/modules/security/ca.nix
+++ b/nixos/modules/security/ca.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
@@ -10,11 +10,6 @@ with pkgs.lib;
[ { source = "${pkgs.cacert}/etc/ca-bundle.crt";
target = "ssl/certs/ca-bundle.crt";
}
-
- # Backward compatibility; may remove at some point.
- { source = "${pkgs.cacert}/etc/ca-bundle.crt";
- target = "ca-bundle.crt";
- }
];
environment.variables.OPENSSL_X509_CERT_FILE = "/etc/ssl/certs/ca-bundle.crt";
diff --git a/nixos/modules/security/duosec.nix b/nixos/modules/security/duosec.nix
new file mode 100644
index 0000000000000000000000000000000000000000..bd9611384828b40d9e164020c6dd5fee80938a1a
--- /dev/null
+++ b/nixos/modules/security/duosec.nix
@@ -0,0 +1,198 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.security.duosec;
+
+ boolToStr = b: if b then "yes" else "no";
+
+ configFile = ''
+ [duo]
+ ikey=${cfg.ikey}
+ skey=${cfg.skey}
+ host=${cfg.host}
+ ${optionalString (cfg.group != "") ("group="+cfg.group)}
+ failmode=${cfg.failmode}
+ pushinfo=${boolToStr cfg.pushinfo}
+ autopush=${boolToStr cfg.autopush}
+ motd=${boolToStr cfg.motd}
+ prompts=${toString cfg.prompts}
+ accept_env_factor=${boolToStr cfg.acceptEnvFactor}
+ fallback_local_ip=${boolToStr cfg.fallbackLocalIP}
+ '';
+
+ loginCfgFile = optional cfg.ssh.enable
+ { source = pkgs.writeText "login_duo.conf" configFile;
+ mode = "0600";
+ uid = config.ids.uids.sshd;
+ target = "duo/login_duo.conf";
+ };
+
+ pamCfgFile = optional cfg.pam.enable
+ { source = pkgs.writeText "pam_duo.conf" configFile;
+ mode = "0600";
+ uid = config.ids.uids.sshd;
+ target = "duo/pam_duo.conf";
+ };
+in
+{
+ options = {
+ security.duosec = {
+ ssh.enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = "If enabled, protect SSH logins with Duo Security.";
+ };
+
+ pam.enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = "If enabled, protect logins with Duo Security using PAM support.";
+ };
+
+ ikey = mkOption {
+ type = types.str;
+ description = "Integration key.";
+ };
+
+ skey = mkOption {
+ type = types.str;
+ description = "Secret key.";
+ };
+
+ host = mkOption {
+ type = types.str;
+ description = "Duo API hostname.";
+ };
+
+ group = mkOption {
+ type = types.str;
+ default = "";
+ description = "Use Duo authentication for users only in this group.";
+ };
+
+ failmode = mkOption {
+ type = types.str;
+ default = "safe";
+ description = ''
+ On service or configuration errors that prevent Duo
+ authentication, fail "safe" (allow access) or "secure" (deny
+ access). The default is "safe".
+ '';
+ };
+
+ pushinfo = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Include information such as the command to be executed in
+ the Duo Push message.
+ '';
+ };
+
+ autopush = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true, Duo Unix will automatically send
+ a push login request to the user’s phone, falling back on a
+ phone call if push is unavailable. If
+ false, the user will be prompted to
+ choose an authentication method. When configured with
+ autopush = yes, we recommend setting
+ prompts = 1.
+ '';
+ };
+
+ motd = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Print the contents of /etc/motd to screen
+ after a succesful login.
+ '';
+ };
+
+ prompts = mkOption {
+ type = types.int;
+ default = 3;
+ description = ''
+ If a user fails to authenticate with a second factor, Duo
+ Unix will prompt the user to authenticate again. This option
+ sets the maximum number of prompts that Duo Unix will
+ display before denying access. Must be 1, 2, or 3. Default
+ is 3.
+
+ For example, when prompts = 1, the user
+ will have to successfully authenticate on the first prompt,
+ whereas if prompts = 2, if the user
+ enters incorrect information at the initial prompt, he/she
+ will be prompted to authenticate again.
+
+ When configured with autopush = true, we
+ recommend setting prompts = 1.
+ '';
+ };
+
+ acceptEnvFactor = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Look for factor selection or passcode in the
+ $DUO_PASSCODE environment variable before
+ prompting the user for input.
+
+ When $DUO_PASSCODE is non-empty, it will override
+ autopush. The SSH client will need SendEnv DUO_PASSCODE in
+ its configuration, and the SSH server will similarily need
+ AcceptEnv DUO_PASSCODE.
+ '';
+ };
+
+ fallbackLocalIP = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Duo Unix reports the IP address of the authorizing user, for
+ the purposes of authorization and whitelisting. If Duo Unix
+ cannot detect the IP address of the client, setting
+ fallbackLocalIP = yes will cause Duo Unix
+ to send the IP address of the server it is running on.
+
+ If you are using IP whitelisting, enabling this option could
+ cause unauthorized logins if the local IP is listed in the
+ whitelist.
+ '';
+ };
+ };
+ };
+
+ config = mkIf (cfg.ssh.enable || cfg.pam.enable) {
+ assertions =
+ [ { assertion = cfg.failmode == "safe" || cfg.failmode == "secure";
+ message = "Invalid value for failmode (must be safe or secure).";
+ }
+ { assertion = cfg.prompts == 1 || cfg.prompts == 2 || cfg.prompts == 3;
+ message = "Invalid value for prompts (must be 1, 2, or 3).";
+ }
+ { assertion = !cfg.pam.enable;
+ message = "PAM support is currently not implemented.";
+ }
+ ];
+
+ environment.systemPackages = [ pkgs.duo-unix ];
+ security.setuidPrograms = [ "login_duo" ];
+ environment.etc = loginCfgFile ++ pamCfgFile;
+
+ /* If PAM *and* SSH are enabled, then don't do anything special.
+ If PAM isn't used, set the default SSH-only options. */
+ services.openssh.extraConfig = mkIf (cfg.ssh.enable || cfg.pam.enable) (
+ if cfg.pam.enable then "UseDNS no" else ''
+ # Duo Security configuration
+ ForceCommand ${config.security.wrapperDir}/login_duo
+ PermitTunnel no
+ AllowTcpForwarding no
+ '');
+ };
+}
diff --git a/nixos/modules/security/grsecurity.nix b/nixos/modules/security/grsecurity.nix
new file mode 100644
index 0000000000000000000000000000000000000000..90462a2d6d0dc72845ccde1bf7f7685ae0ef294f
--- /dev/null
+++ b/nixos/modules/security/grsecurity.nix
@@ -0,0 +1,443 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.security.grsecurity;
+
+ mkKernel = kernel: patch:
+ assert patch.kversion == kernel.version;
+ { inherit kernel patch;
+ inherit (patch) grversion revision;
+ };
+
+ stable-patch = with pkgs.kernelPatches;
+ if cfg.vserver then grsecurity_vserver else grsecurity_stable;
+ stableKernel = mkKernel pkgs.linux_3_2 stable-patch;
+ testKernel = mkKernel pkgs.linux_3_13 pkgs.kernelPatches.grsecurity_unstable;
+
+ ## -- grsecurity configuration -----------------------------------------------
+
+ grsecPrioCfg =
+ if cfg.config.priority == "security" then
+ "GRKERNSEC_CONFIG_PRIORITY_SECURITY y"
+ else
+ "GRKERNSEC_CONFIG_PRIORITY_PERF y";
+
+ grsecSystemCfg =
+ if cfg.config.system == "desktop" then
+ "GRKERNSEC_CONFIG_DESKTOP y"
+ else
+ "GRKERNSEC_CONFIG_SERVER y";
+
+ grsecVirtCfg =
+ if cfg.config.virtualisationConfig == "none" then
+ "GRKERNSEC_CONFIG_VIRT_NONE y"
+ else if cfg.config.virtualisationConfig == "host" then
+ "GRKERNSEC_CONFIG_VIRT_HOST y"
+ else
+ "GRKERNSEC_CONFIG_VIRT_GUEST y";
+
+ grsecHwvirtCfg = if cfg.config.virtualisationConfig == "none" then "" else
+ if cfg.config.hardwareVirtualisation == true then
+ "GRKERNSEC_CONFIG_VIRT_EPT y"
+ else
+ "GRKERNSEC_CONFIG_VIRT_SOFT y";
+
+ grsecVirtswCfg =
+ let virtCfg = opt: "GRKERNSEC_CONFIG_VIRT_"+opt+" y";
+ in
+ if cfg.config.virtualisationConfig == "none" then ""
+ else if cfg.config.virtualisationSoftware == "xen" then virtCfg "XEN"
+ else if cfg.config.virtualisationSoftware == "kvm" then virtCfg "KVM"
+ else if cfg.config.virtualisationSoftware == "vmware" then virtCfg "VMWARE"
+ else virtCfg "VIRTUALBOX";
+
+ grsecMainConfig = if cfg.config.mode == "custom" then "" else ''
+ GRKERNSEC_CONFIG_AUTO y
+ ${grsecPrioCfg}
+ ${grsecSystemCfg}
+ ${grsecVirtCfg}
+ ${grsecHwvirtCfg}
+ ${grsecVirtswCfg}
+ '';
+
+ grsecConfig =
+ let boolToKernOpt = b: if b then "y" else "n";
+ # Disable RANDSTRUCT under virtualbox, as it has some kind of
+ # breakage with the vbox guest drivers
+ randstruct = optionalString config.services.virtualbox.enable
+ "GRKERNSEC_RANDSTRUCT n";
+ # Disable restricting links under the testing kernel, as something
+ # has changed causing it to fail miserably during boot.
+ restrictLinks = optionalString cfg.testing
+ "GRKERNSEC_LINK n";
+ in ''
+ SECURITY_APPARMOR y
+ DEFAULT_SECURITY_APPARMOR y
+ GRKERNSEC y
+ ${grsecMainConfig}
+
+ ${if cfg.config.restrictProc then
+ "GRKERNSEC_PROC_USER y"
+ else
+ optionalString cfg.config.restrictProcWithGroup ''
+ GRKERNSEC_PROC_USERGROUP y
+ GRKERNSEC_PROC_GID ${toString cfg.config.unrestrictProcGid}
+ ''
+ }
+
+ GRKERNSEC_SYSCTL ${boolToKernOpt cfg.config.sysctl}
+ GRKERNSEC_CHROOT_CHMOD ${boolToKernOpt cfg.config.denyChrootChmod}
+ GRKERNSEC_NO_RBAC ${boolToKernOpt cfg.config.disableRBAC}
+ ${randstruct}
+ ${restrictLinks}
+
+ ${cfg.config.kernelExtraConfig}
+ '';
+
+ ## -- grsecurity kernel packages ---------------------------------------------
+
+ localver = grkern:
+ "-grsec" + optionalString cfg.config.verboseVersion
+ "-${grkern.grversion}-${grkern.revision}";
+
+ grsecurityOverrider = args: grkern: {
+ # Apparently as of gcc 4.6, gcc-plugin headers (which are needed by PaX plugins)
+ # include libgmp headers, so we need these extra tweaks
+ buildInputs = args.buildInputs ++ [ pkgs.gmp ];
+ preConfigure = ''
+ ${args.preConfigure or ""}
+ sed -i 's|-I|-I${pkgs.gmp}/include -I|' scripts/gcc-plugin.sh
+ sed -i 's|HOST_EXTRACFLAGS +=|HOST_EXTRACFLAGS += -I${pkgs.gmp}/include|' tools/gcc/Makefile
+ sed -i 's|HOST_EXTRACXXFLAGS +=|HOST_EXTRACXXFLAGS += -I${pkgs.gmp}/include|' tools/gcc/Makefile
+ rm localversion-grsec
+ echo ${localver grkern} > localversion-grsec
+ '';
+ };
+
+ mkGrsecPkg = grkern:
+ let kernelPkg = lowPrio (overrideDerivation (grkern.kernel.override (args: {
+ kernelPatches = args.kernelPatches ++ [ grkern.patch pkgs.kernelPatches.grsec_fix_path ];
+ argsOverride = {
+ modDirVersion = "${grkern.kernel.modDirVersion}${localver grkern}";
+ };
+ extraConfig = grsecConfig;
+ })) (args: grsecurityOverrider args grkern));
+ in pkgs.linuxPackagesFor kernelPkg (mkGrsecPkg grkern);
+
+ grsecPackage = mkGrsecPkg (if cfg.stable then stableKernel else testKernel);
+in
+{
+ options = {
+ security.grsecurity = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable grsecurity support. This enables advanced exploit
+ hardening for the Linux kernel, and adds support for
+ administrative Role-Based Acess Control (RBAC) via
+ gradm. It also includes traditional
+ utilities for PaX.
+ '';
+ };
+
+ stable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable the stable grsecurity patch, based on Linux 3.2.
+ '';
+ };
+
+ vserver = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable the stable grsecurity/vserver patches, based on Linux 3.2.
+ '';
+ };
+
+ testing = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable the testing grsecurity patch, based on Linux 3.13.
+ '';
+ };
+
+ config = {
+ mode = mkOption {
+ type = types.str;
+ default = "auto";
+ example = "custom";
+ description = ''
+ grsecurity configuration mode. This specifies whether
+ grsecurity is auto-configured or otherwise completely
+ manually configured. Can either by
+ custom or auto.
+
+ auto is recommended.
+ '';
+ };
+
+ priority = mkOption {
+ type = types.str;
+ default = "security";
+ example = "performance";
+ description = ''
+ grsecurity configuration priority. This specifies whether
+ the kernel configuration should emphasize speed or
+ security. Can either by security or
+ performance.
+ '';
+ };
+
+ system = mkOption {
+ type = types.str;
+ default = "";
+ example = "desktop";
+ description = ''
+ grsecurity system configuration. This specifies whether
+ the kernel configuration should be suitable for a Desktop
+ or a Server. Can either by server or
+ desktop.
+ '';
+ };
+
+ virtualisationConfig = mkOption {
+ type = types.str;
+ default = "none";
+ example = "host";
+ description = ''
+ grsecurity virtualisation configuration. This specifies
+ the virtualisation role of the machine - that is, whether
+ it will be a virtual machine guest, a virtual machine
+ host, or neither. Can be one of none,
+ host, or guest.
+ '';
+ };
+
+ hardwareVirtualisation = mkOption {
+ type = types.nullOr types.bool;
+ default = null;
+ example = true;
+ description = ''
+ grsecurity hardware virtualisation configuration. Set to
+ true if your machine supports hardware
+ accelerated virtualisation.
+ '';
+ };
+
+ virtualisationSoftware = mkOption {
+ type = types.str;
+ default = "";
+ example = "kvm";
+ description = ''
+ grsecurity virtualisation software. Set this to the
+ specified virtual machine technology if the machine is
+ running as a guest, or a host.
+
+ Can be one of kvm,
+ xen, vmware or
+ virtualbox.
+ '';
+ };
+
+ sysctl = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true, then set GRKERN_SYSCTL y. If
+ enabled then grsecurity can be controlled using sysctl
+ (and turned off). You are advised to *never* enable this,
+ but if you do, make sure to always set the sysctl
+ kernel.grsecurity.grsec_lock to
+ non-zero as soon as all sysctl options are set. *THIS IS
+ EXTREMELY IMPORTANT*!
+
+ If disabled, this also turns off the
+ systemd-sysctl service.
+ '';
+ };
+
+ denyChrootChmod = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true, then set GRKERN_CHROOT_CHMOD
+ y. If enabled, this denies processes inside a
+ chroot from setting the suid or sgid bits using
+ chmod or fchmod.
+
+ By default this protection is disabled - it makes it
+ impossible to use Nix to build software on your system,
+ which is what most users want.
+
+ If you are using NixOps to deploy your software to a
+ remote machine, you're encouraged to enable this as you
+ won't need to compile code.
+ '';
+ };
+
+ restrictProc = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true, then set GRKERN_PROC_USER
+ y. This restricts non-root users to only viewing
+ their own processes and restricts network-related
+ information, kernel symbols, and module information.
+ '';
+ };
+
+ restrictProcWithGroup = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ If true, then set GRKERN_PROC_USERGROUP
+ y. This is similar to
+ restrictProc except it allows a special
+ group (specified by unrestrictProcGid)
+ to still access otherwise classified information in
+ /proc.
+ '';
+ };
+
+ unrestrictProcGid = mkOption {
+ type = types.int;
+ default = config.ids.gids.grsecurity;
+ description = ''
+ If set, specifies a GID which is exempt from
+ /proc restrictions (set by
+ GRKERN_PROC_USERGROUP). By default,
+ this is set to the GID for grsecurity,
+ a predefined NixOS group, which the
+ root account is a member of. You may
+ conveniently add other users to this group if you need
+ access to /proc
+ '';
+ };
+
+ disableRBAC = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true, then set GRKERN_NO_RBAC
+ y. This disables the
+ /dev/grsec device, which in turn
+ disables the RBAC system (and gradm).
+ '';
+ };
+
+ verboseVersion = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Use verbose version in kernel localversion.";
+ };
+
+ kernelExtraConfig = mkOption {
+ type = types.str;
+ default = "";
+ description = "Extra kernel configuration parameters.";
+ };
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions =
+ [ { assertion = cfg.stable || cfg.testing;
+ message = ''
+ If grsecurity is enabled, you must select either the
+ stable patch (with kernel 3.2), or the testing patch (with
+ kernel 3.13) to continue.
+ '';
+ }
+ { assertion = (cfg.stable -> !cfg.testing) || (cfg.testing -> !cfg.stable);
+ message = ''
+ You must select either the stable or testing patch, not
+ both.
+ '';
+ }
+ { assertion = (cfg.testing -> !cfg.vserver);
+ message = "The vserver patches are only supported in the stable kernel.";
+ }
+ { assertion = (cfg.config.restrictProc -> !cfg.config.restrictProcWithGroup) ||
+ (cfg.config.restrictProcWithGroup -> !cfg.config.restrictProc);
+ message = "You cannot enable both restrictProc and restrictProcWithGroup";
+ }
+ { assertion = config.boot.kernelPackages.kernel.features ? grsecurity
+ && config.boot.kernelPackages.kernel.features.grsecurity;
+ message = "grsecurity enabled, but kernel doesn't have grsec support";
+ }
+ { assertion = elem cfg.config.mode [ "auto" "custom" ];
+ message = "grsecurity mode must either be 'auto' or 'custom'.";
+ }
+ { assertion = cfg.config.mode == "auto" -> elem cfg.config.system [ "desktop" "server" ];
+ message = "when using auto grsec mode, system must be either 'desktop' or 'server'";
+ }
+ { assertion = cfg.config.mode == "auto" -> elem cfg.config.priority [ "performance" "security" ];
+ message = "when using auto grsec mode, priority must be 'performance' or 'security'.";
+ }
+ { assertion = cfg.config.mode == "auto" -> elem cfg.config.virtualisationConfig [ "host" "guest" "none" ];
+ message = "when using auto grsec mode, 'virt' must be 'host', 'guest' or 'none'.";
+ }
+ { assertion = (cfg.config.mode == "auto" && (elem cfg.config.virtualisationConfig [ "host" "guest" ])) ->
+ cfg.config.hardwareVirtualisation != null;
+ message = "when using auto grsec mode with virtualisation, you must specify if your hardware has virtualisation extensions";
+ }
+ { assertion = (cfg.config.mode == "auto" && (elem cfg.config.virtualisationConfig [ "host" "guest" ])) ->
+ elem cfg.config.virtualisationSoftware [ "kvm" "xen" "virtualbox" "vmware" ];
+ message = "virtualisation software must be 'kvm', 'xen', 'vmware' or 'virtualbox'";
+ }
+ ];
+
+ systemd.services.grsec-lock = mkIf cfg.config.sysctl {
+ description = "grsecurity sysctl-lock Service";
+ requires = [ "sysctl.service" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig.Type = "oneshot";
+ serviceConfig.RemainAfterExit = "yes";
+ script = ''
+ locked=`cat /proc/sys/kernel/grsecurity/grsec_lock`
+ if [ "$locked" == "0" ]; then
+ echo 1 > /proc/sys/kernel/grsecurity/grsec_lock
+ echo grsecurity sysctl lock - enabled
+ else
+ echo grsecurity sysctl lock already enabled - doing nothing
+ fi
+ '';
+ };
+
+# systemd.services.grsec-learn = {
+# description = "grsecurity learning Service";
+# wantedBy = [ "local-fs.target" ];
+# serviceConfig = {
+# Type = "oneshot";
+# RemainAfterExit = "yes";
+# ExecStart = "${pkgs.gradm}/sbin/gradm -VFL /etc/grsec/learning.logs";
+# ExecStop = "${pkgs.gradm}/sbin/gradm -D";
+# };
+# };
+
+ system.activationScripts.grsec =
+ ''
+ mkdir -p /etc/grsec
+ if [ ! -f /etc/grsec/learn_config ]; then
+ cp ${pkgs.gradm}/etc/grsec/learn_config /etc/grsec
+ fi
+ if [ ! -f /etc/grsec/policy ]; then
+ cp ${pkgs.gradm}/etc/grsec/policy /etc/grsec
+ fi
+ chmod -R 0600 /etc/grsec
+ '';
+
+ # Enable apparmor support, gradm udev rules, and utilities
+ security.apparmor.enable = true;
+ boot.kernelPackages = grsecPackage;
+ services.udev.packages = [ pkgs.gradm ];
+ environment.systemPackages = [ pkgs.gradm pkgs.paxctl pkgs.pax-utils ];
+ };
+}
diff --git a/nixos/modules/security/pam.nix b/nixos/modules/security/pam.nix
index 93d12d292e4d54c1bf973b08657068f5086ba6b3..6a5eb4c720f8674c3f92f55ea067963df08e9c2f 100644
--- a/nixos/modules/security/pam.nix
+++ b/nixos/modules/security/pam.nix
@@ -1,9 +1,9 @@
# This module provides configuration for the PAM (Pluggable
# Authentication Modules) system.
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -187,6 +187,8 @@ let
# Session management.
session required pam_unix.so
+ ${optionalString cfg.setLoginUid
+ "session required pam_loginuid.so"}
${optionalString cfg.updateWtmp
"session required ${pkgs.pam}/lib/security/pam_lastlog.so silent"}
${optionalString config.users.ldap.enable
@@ -197,8 +199,6 @@ let
"session optional ${pkgs.otpw}/lib/security/pam_otpw.so"}
${optionalString cfg.startSession
"session optional ${pkgs.systemd}/lib/security/pam_systemd.so"}
- ${optionalString cfg.setLoginUid
- "session required pam_loginuid.so"}
${optionalString cfg.forwardXAuth
"session optional pam_xauth.so xauthpath=${pkgs.xorg.xauth}/bin/xauth systemuser=99"}
${optionalString (cfg.limits != [])
diff --git a/nixos/modules/security/pam_usb.nix b/nixos/modules/security/pam_usb.nix
index 4cc99995fbcaa1bf11886000d2257e12ca0f15d2..11708a1f016797f7e273a0e4999d78987f1ef37b 100644
--- a/nixos/modules/security/pam_usb.nix
+++ b/nixos/modules/security/pam_usb.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/security/polkit.nix b/nixos/modules/security/polkit.nix
index dbec4ad98d160b48f7538512a7d411e67b1d6cd3..5933cdc0cec32f9b7632bd2b3148c1f09c37886c 100644
--- a/nixos/modules/security/polkit.nix
+++ b/nixos/modules/security/polkit.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -63,6 +63,9 @@ in
systemd.packages = [ pkgs.polkit ];
+ systemd.services.polkit.restartTriggers = [ config.system.path ];
+ systemd.services.polkit.unitConfig.X-StopIfChanged = false;
+
# The polkit daemon reads action/rule files
environment.pathsToLink = [ "/share/polkit-1" ];
diff --git a/nixos/modules/security/prey.nix b/nixos/modules/security/prey.nix
index 75b95d5fbb04fd9629a1749e09d51bf26125ac38..e29fa5395a1abd572ab7abf86497931643698a38 100644
--- a/nixos/modules/security/prey.nix
+++ b/nixos/modules/security/prey.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.prey;
diff --git a/nixos/modules/security/rngd.nix b/nixos/modules/security/rngd.nix
index 720ac02f2e8114327e80f2884c272fe08a40ebbf..c31e57e6f6f8f954c94327893f6e950297a6cf5a 100644
--- a/nixos/modules/security/rngd.nix
+++ b/nixos/modules/security/rngd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
options = {
diff --git a/nixos/modules/security/rtkit.nix b/nixos/modules/security/rtkit.nix
index 164ad9b3aa7db6250e6749606713e0cfcc2c264e..ba07591bb77005aaf63e6587f7f8f89f192d3c62 100644
--- a/nixos/modules/security/rtkit.nix
+++ b/nixos/modules/security/rtkit.nix
@@ -1,9 +1,9 @@
# A module for ‘rtkit’, a DBus system service that hands out realtime
# scheduling priority to processes that ask for it.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/security/setuid-wrapper.c b/nixos/modules/security/setuid-wrapper.c
index 007ffbc34fe9d6c0c5e4d52a783935edd4f3c05b..ffd0b65b76292824e43aa37c4fd6cc5b373c523c 100644
--- a/nixos/modules/security/setuid-wrapper.c
+++ b/nixos/modules/security/setuid-wrapper.c
@@ -30,8 +30,8 @@ int main(int argc, char * * argv)
creating hard link `X' from some other location, along with a
false `X.real' file, to allow arbitrary programs from being
executed setuid. */
- assert ((strncmp(self, wrapperDir, sizeof(wrapperDir)) == 0) &&
- (self[strlen(wrapperDir)] == '/'));
+ assert ((strncmp(self, wrapperDir, strlen(wrapperDir)) == 0) &&
+ (self[strlen(wrapperDir)] == '/'));
/* Make *really* *really* sure that we were executed as `self',
and not, say, as some other setuid program. That is, our
@@ -42,12 +42,12 @@ int main(int argc, char * * argv)
assert (lstat(self, &st) != -1);
//printf("%d %d\n", st.st_uid, st.st_gid);
-
+
assert ((st.st_mode & S_ISUID) == 0 ||
- (st.st_uid == geteuid()));
+ (st.st_uid == geteuid()));
assert ((st.st_mode & S_ISGID) == 0 ||
- st.st_gid == getegid());
+ st.st_gid == getegid());
/* And, of course, we shouldn't be writable. */
assert (!(st.st_mode & (S_IWGRP | S_IWOTH)));
@@ -69,13 +69,13 @@ int main(int argc, char * * argv)
real[len] = 0;
close(fdSelf);
-
+
//printf("real = %s, len = %d\n", real, len);
execve(real, argv, environ);
fprintf(stderr, "%s: cannot run `%s': %s\n",
argv[0], real, strerror(errno));
-
+
exit(1);
}
diff --git a/nixos/modules/security/setuid-wrappers.nix b/nixos/modules/security/setuid-wrappers.nix
index 62df85816e50a3850fc1eaa6c6e569cc81c92f7d..4cdc1023baabba0890b29f67c26e02e81cbd45c1 100644
--- a/nixos/modules/security/setuid-wrappers.nix
+++ b/nixos/modules/security/setuid-wrappers.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -9,10 +9,11 @@ let
setuidWrapper = pkgs.stdenv.mkDerivation {
name = "setuid-wrapper";
buildCommand = ''
- ensureDir $out/bin
+ mkdir -p $out/bin
+ cp ${./setuid-wrapper.c} setuid-wrapper.c
gcc -Wall -O2 -DWRAPPER_DIR=\"${wrapperDir}\" \
- ${./setuid-wrapper.c} -o $out/bin/setuid-wrapper
- strip -s $out/bin/setuid-wrapper
+ setuid-wrapper.c -o $out/bin/setuid-wrapper
+ strip -S $out/bin/setuid-wrapper
'';
};
@@ -46,6 +47,7 @@ in
group = "postdrop";
setuid = false;
setgid = true;
+ permissions = "u+rx,g+x,o+x";
}
];
description = ''
@@ -115,8 +117,7 @@ in
# programs to be wrapped.
SETUID_PATH=${config.system.path}/bin:${config.system.path}/sbin
- if test -d ${wrapperDir}; then rm -f ${wrapperDir}/*; fi # */
- mkdir -p ${wrapperDir}
+ rm -f ${wrapperDir}/* # */
${concatMapStrings makeSetuidWrapper setuidPrograms}
'';
diff --git a/nixos/modules/security/sudo.nix b/nixos/modules/security/sudo.nix
index 215a8ecd60187d26f3ee604db625e3d02a91044e..956856c64995ed8fcf474601929b1025157afcdf 100644
--- a/nixos/modules/security/sudo.nix
+++ b/nixos/modules/security/sudo.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/amqp/activemq/default.nix b/nixos/modules/services/amqp/activemq/default.nix
index 915d179e699938d32b3039b04d0273a5a2ba45e4..f1f3d005f30f8b497f180920163ecf82add2f194 100644
--- a/nixos/modules/services/amqp/activemq/default.nix
+++ b/nixos/modules/services/amqp/activemq/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
with pkgs;
let
diff --git a/nixos/modules/services/amqp/rabbitmq.nix b/nixos/modules/services/amqp/rabbitmq.nix
index 696b5ad43797ec4aafa7b83c9c17cea1266d4a4f..bef15fb64b7f234b223a064365555c6638aa3d81 100644
--- a/nixos/modules/services/amqp/rabbitmq.nix
+++ b/nixos/modules/services/amqp/rabbitmq.nix
@@ -1,22 +1,13 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
-
cfg = config.services.rabbitmq;
- run = cmd: "${pkgs.sudo}/bin/sudo -E -u rabbitmq ${cmd}";
-
-in
-
-{
-
-
+in {
###### interface
-
options = {
-
services.rabbitmq = {
enable = mkOption {
@@ -40,55 +31,59 @@ in
'';
};
- };
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/lib/rabbitmq";
+ description = ''
+ Data directory for rabbitmq.
+ '';
+ };
+
+ };
};
###### implementation
-
config = mkIf cfg.enable {
environment.systemPackages = [ pkgs.rabbitmq_server ];
users.extraUsers.rabbitmq = {
description = "RabbitMQ server user";
- home = "/var/empty";
+ home = "${cfg.dataDir}";
group = "rabbitmq";
uid = config.ids.uids.rabbitmq;
};
users.extraGroups.rabbitmq.gid = config.ids.gids.rabbitmq;
- jobs.rabbitmq = {
- description = "RabbitMQ server";
-
- startOn = "started network-interfaces";
+ systemd.services.rabbitmq = {
+ description = "RabbitMQ Server";
- preStart =
- ''
- mkdir -m 0700 -p /var/lib/rabbitmq
- chown rabbitmq /var/lib/rabbitmq
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network-interfaces.target" ];
- mkdir -m 0700 -p /var/log/rabbitmq
- chown rabbitmq /var/log/rabbitmq
- '';
-
- environment.HOME = "/var/lib/rabbitmq";
- environment.RABBITMQ_NODE_IP_ADDRESS = cfg.listenAddress;
- environment.SYS_PREFIX = "";
-
- exec =
- ''
- ${run "${pkgs.rabbitmq_server}/sbin/rabbitmq-server"}
- '';
+ environment = {
+ RABBITMQ_MNESIA_BASE = "${cfg.dataDir}/mnesia";
+ RABBITMQ_NODE_IP_ADDRESS = cfg.listenAddress;
+ RABBITMQ_SERVER_START_ARGS = "-rabbit error_logger tty -rabbit sasl_error_logger false";
+ SYS_PREFIX = "";
+ };
- preStop =
- ''
- ${run "${pkgs.rabbitmq_server}/sbin/rabbitmqctl stop"}
- '';
+ serviceConfig = {
+ ExecStart = "${pkgs.rabbitmq_server}/sbin/rabbitmq-server";
+ User = "rabbitmq";
+ Group = "rabbitmq";
+ PermissionsStartOnly = true;
};
+ preStart = ''
+ mkdir -p ${cfg.dataDir} && chmod 0700 ${cfg.dataDir}
+ if [ "$(id -u)" = 0 ]; then chown rabbitmq:rabbitmq ${cfg.dataDir}; fi
+ '';
+ };
+
};
}
diff --git a/nixos/modules/services/audio/alsa.nix b/nixos/modules/services/audio/alsa.nix
index c9a2ef4589bdba76b93e057e822320ca5ad59a81..9a70d9edfa72c9a5ceeb060588b5d3c1877c7ebb 100644
--- a/nixos/modules/services/audio/alsa.nix
+++ b/nixos/modules/services/audio/alsa.nix
@@ -1,7 +1,7 @@
# ALSA sound support.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/audio/fuppes.nix b/nixos/modules/services/audio/fuppes.nix
index 3eb0732bae2e2316e6bb574432bfdd66bef79dbc..4a975ed5f53895fc8740a1faeb72ada5204d3bca 100644
--- a/nixos/modules/services/audio/fuppes.nix
+++ b/nixos/modules/services/audio/fuppes.nix
@@ -1,10 +1,10 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
let
cfg = config.services.fuppesd;
in
-with pkgs.lib;
+with lib;
{
options = {
diff --git a/nixos/modules/services/audio/mpd.nix b/nixos/modules/services/audio/mpd.nix
index a9880dee20c40826c1a454d2dcd948d8a406f68f..1b50f06bf30d3ca22bd908528aa1f4ae4b0a5e34 100644
--- a/nixos/modules/services/audio/mpd.nix
+++ b/nixos/modules/services/audio/mpd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/backup/almir.nix b/nixos/modules/services/backup/almir.nix
index d5bc932c6b964e14dc1a2282e4207514e8523f09..5ce215c5c4b538e60dc2d183ffa0f2fb29c8abfd 100644
--- a/nixos/modules/services/backup/almir.nix
+++ b/nixos/modules/services/backup/almir.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.almir;
@@ -154,7 +154,8 @@ in {
description = "Almir web app";
wantedBy = [ "multi-user.target" ];
path = [ pkgs.pythonPackages.almir ];
- serviceConfig.ExecStart = "${pkgs.pythonPackages.almir}/bin/pserve ${productionini}";
+ environment.PYTHONPATH = "${pkgs.pythonPackages.almir}/lib/${pkgs.pythonPackages.python.libPrefix}/site-packages";
+ serviceConfig.ExecStart = "${pkgs.pythonPackages.pyramid}/bin/pserve ${productionini}";
};
environment.systemPackages = [ pkgs.pythonPackages.almir ];
diff --git a/nixos/modules/services/backup/bacula.nix b/nixos/modules/services/backup/bacula.nix
index 272903c99e33f99394a5aa178bcb5f1d0e028043..c2255f6881810b339e3b3e6dbc0e301679ec5806 100644
--- a/nixos/modules/services/backup/bacula.nix
+++ b/nixos/modules/services/backup/bacula.nix
@@ -1,9 +1,9 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
# TODO: test configuration when building nixexpr (use -t parameter)
# TODO: support sqlite3 (it's deprecate?) and mysql
-with pkgs.lib;
+with lib;
let
libDir = "/var/lib/bacula";
diff --git a/nixos/modules/services/backup/mysql-backup.nix b/nixos/modules/services/backup/mysql-backup.nix
index 3ff9978fbb960da65bfd83a4bb80d04883bea2c7..28f607861f7763480ff3d7dc418d640f08a36f72 100644
--- a/nixos/modules/services/backup/mysql-backup.nix
+++ b/nixos/modules/services/backup/mysql-backup.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/backup/postgresql-backup.nix b/nixos/modules/services/backup/postgresql-backup.nix
index e68ad794a96b47924618b52f5845e2fa9a15116d..1f7b123eca3737713d93ba5057281f28939cbc36 100644
--- a/nixos/modules/services/backup/postgresql-backup.nix
+++ b/nixos/modules/services/backup/postgresql-backup.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
inherit (pkgs) postgresql gzip;
diff --git a/nixos/modules/services/backup/rsnapshot.nix b/nixos/modules/services/backup/rsnapshot.nix
index 178ba3ec7207671b8699e33bbe3d135faa7ba129..48ad7582b7e631ffceed2bbbbc7d2e415462e134 100644
--- a/nixos/modules/services/backup/rsnapshot.nix
+++ b/nixos/modules/services/backup/rsnapshot.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.services.rsnapshot;
in
diff --git a/nixos/modules/services/backup/sitecopy-backup.nix b/nixos/modules/services/backup/sitecopy-backup.nix
index 5c7f7ffae5b3274c9d6d85b6f821cc9c213bb590..5d3675fa3e9d2b493ce6e30dd3a0d57921574caf 100644
--- a/nixos/modules/services/backup/sitecopy-backup.nix
+++ b/nixos/modules/services/backup/sitecopy-backup.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
inherit (pkgs) sitecopy;
diff --git a/nixos/modules/services/backup/tarsnap.nix b/nixos/modules/services/backup/tarsnap.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1966242e3dcbc21f8d02a9c36d7a56bfc00da581
--- /dev/null
+++ b/nixos/modules/services/backup/tarsnap.nix
@@ -0,0 +1,204 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.tarsnap;
+
+ optionalNullStr = e: v: if e == null then "" else v;
+
+ configFile = pkgs.writeText "tarsnap.conf" ''
+ cachedir ${cfg.cachedir}
+ keyfile ${cfg.keyfile}
+ ${optionalString cfg.nodump "nodump"}
+ ${optionalString cfg.printStats "print-stats"}
+ ${optionalNullStr cfg.checkpointBytes "checkpoint-bytes "+cfg.checkpointBytes}
+ ${optionalString cfg.aggressiveNetworking "aggressive-networking"}
+ ${concatStringsSep "\n" (map (v: "exclude "+v) cfg.excludes)}
+ ${concatStringsSep "\n" (map (v: "include "+v) cfg.includes)}
+ ${optionalString cfg.lowmem "lowmem"}
+ ${optionalString cfg.verylowmem "verylowmem"}
+ '';
+in
+{
+ options = {
+ services.tarsnap = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If enabled, NixOS will periodically create backups of the
+ specified directories using the tarsnap
+ backup service. This installs a systemd
+ service called tarsnap-backup which is
+ periodically run by cron, or you may run it on-demand.
+
+ See the Tarsnap Getting
+ Started page.
+ '';
+ };
+
+ label = mkOption {
+ type = types.str;
+ default = "nixos";
+ description = ''
+ Specifies the label for archives created by Tarsnap. The
+ full name will be
+ label-$(date+"%Y%m%d%H%M%S"). For
+ example, by default your backups will look similar to
+ nixos-20140301011501.
+ '';
+ };
+
+ cachedir = mkOption {
+ type = types.path;
+ default = "/var/cache/tarsnap";
+ description = ''
+ Tarsnap operations use a "cache directory" which allows
+ Tarsnap to identify which blocks of data have been
+ previously stored; this directory is specified via the
+ cachedir option. If the cache directory
+ is lost or out of date, tarsnap creation/deletion operations
+ will exit with an error message instructing you to run
+ tarsnap --fsck to regenerate the cache
+ directory.
+ '';
+ };
+
+ keyfile = mkOption {
+ type = types.path;
+ default = "/root/tarsnap.key";
+ description = ''
+ Path to the keyfile which identifies the machine associated
+ with your Tarsnap account. This file can be created using
+ the tarsnap-keygen utility, and providing
+ your Tarsnap login credentials.
+ '';
+ };
+
+ nodump = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ If set to true, then don't archive files
+ which have the nodump flag set.
+ '';
+ };
+
+ printStats = mkOption {
+ type = types.bool;
+ default = true;
+ description = "Print statistics when creating archives.";
+ };
+
+ checkpointBytes = mkOption {
+ type = types.nullOr types.str;
+ default = "1G";
+ description = ''
+ Create a checkpoint per a particular amount of uploaded
+ data. By default, Tarsnap will create checkpoints once per
+ GB of data uploaded. At minimum,
+ checkpointBytes must be 1GB.
+
+ Can also be set to null to disable
+ checkpointing.
+ '';
+ };
+
+ period = mkOption {
+ type = types.str;
+ default = "15 01 * * *";
+ description = ''
+ This option defines (in the format used by cron) when
+ tarsnap is run for backups. The default is to backup the
+ specified paths at 01:15 at night every day.
+ '';
+ };
+
+ aggressiveNetworking = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Aggressive network behaviour: Use multiple TCP connections
+ when writing archives. Use of this option is recommended
+ only in cases where TCP congestion control is known to be
+ the limiting factor in upload performance.
+ '';
+ };
+
+ directories = mkOption {
+ type = types.listOf types.path;
+ default = [];
+ description = "List of filesystem paths to archive.";
+ };
+
+ excludes = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Exclude files and directories matching the specified patterns.
+ '';
+ };
+
+ includes = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Include only files and directories matching the specified patterns.
+
+ Note that exclusions specified via
+ excludes take precedence over inclusions.
+ '';
+ };
+
+ lowmem = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Attempt to reduce tarsnap memory consumption. This option
+ will slow down the process of creating archives, but may
+ help on systems where the average size of files being backed
+ up is less than 1 MB.
+ '';
+ };
+
+ verylowmem = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Try even harder to reduce tarsnap memory consumption. This
+ can significantly slow down tarsnap, but reduces its memory
+ usage by an additional factor of 2 beyond what the
+ lowmem option does.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions =
+ [ { assertion = cfg.directories != [];
+ message = "Must specify directories for Tarsnap to back up";
+ }
+ { assertion = cfg.lowmem -> !cfg.verylowmem && (cfg.verylowmem -> !cfg.lowmem);
+ message = "You cannot set both lowmem and verylowmem";
+ }
+ ];
+
+ systemd.services.tarsnap-backup = {
+ description = "Tarsnap Backup process";
+ path = [ pkgs.tarsnap pkgs.coreutils ];
+ script = ''
+ mkdir -p -m 0755 $(dirname ${cfg.cachedir})
+ mkdir -p -m 0600 ${cfg.cachedir}
+ exec tarsnap --configfile ${configFile} -c -f ${cfg.label}-$(date +"%Y%m%d%H%M%S") ${concatStringsSep " " cfg.directories}
+ '';
+ };
+
+ services.cron.systemCronJobs = optional cfg.enable
+ "${cfg.period} root ${config.systemd.package}/bin/systemctl start tarsnap-backup.service";
+
+ environment.systemPackages = [ pkgs.tarsnap ];
+ };
+}
diff --git a/nixos/modules/services/continuous-integration/jenkins/default.nix b/nixos/modules/services/continuous-integration/jenkins/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b01b5c3245a4a8adf486c87baec38b9f1d12f47b
--- /dev/null
+++ b/nixos/modules/services/continuous-integration/jenkins/default.nix
@@ -0,0 +1,119 @@
+{ config, lib, pkgs, ... }:
+with lib;
+let
+ cfg = config.services.jenkins;
+in {
+ options = {
+ services.jenkins = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable the jenkins continuous integration server.
+ '';
+ };
+
+ user = mkOption {
+ default = "jenkins";
+ type = with types; string;
+ description = ''
+ User the jenkins server should execute under.
+ '';
+ };
+
+ group = mkOption {
+ default = "jenkins";
+ type = with types; string;
+ description = ''
+ If the default user "jenkins" is configured then this is the primary
+ group of that user.
+ '';
+ };
+
+ home = mkOption {
+ default = "/var/lib/jenkins";
+ type = with types; string;
+ description = ''
+ The path to use as JENKINS_HOME. If the default user "jenkins" is configured then
+ this is the home of the "jenkins" user.
+ '';
+ };
+
+ port = mkOption {
+ default = 8080;
+ type = types.uniq types.int;
+ description = ''
+ Specifies port number on which the jenkins HTTP interface listens. The default is 8080.
+ '';
+ };
+
+ packages = mkOption {
+ default = [ pkgs.stdenv pkgs.git pkgs.jdk pkgs.openssh pkgs.nix ];
+ type = types.listOf types.package;
+ description = ''
+ Packages to add to PATH for the jenkins process.
+ '';
+ };
+
+ environment = mkOption {
+ default = { NIX_REMOTE = "daemon"; };
+ type = with types; attrsOf string;
+ description = ''
+ Additional environment variables to be passed to the jenkins process.
+ The environment will always include JENKINS_HOME.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.extraGroups = optional (cfg.group == "jenkins") {
+ name = "jenkins";
+ gid = config.ids.gids.jenkins;
+ };
+
+ users.extraUsers = optional (cfg.user == "jenkins") {
+ name = "jenkins";
+ description = "jenkins user";
+ createHome = true;
+ home = cfg.home;
+ group = cfg.group;
+ useDefaultShell = true;
+ uid = config.ids.uids.jenkins;
+ };
+
+ systemd.services.jenkins = {
+ description = "Jenkins Continuous Integration Server";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+
+ environment = {
+ JENKINS_HOME = cfg.home;
+ } // cfg.environment;
+
+ path = cfg.packages;
+
+ script = ''
+ ${pkgs.jdk}/bin/java -jar ${pkgs.jenkins} --httpPort=${toString cfg.port}
+ '';
+
+ postStart = ''
+ until ${pkgs.curl}/bin/curl -s -L localhost:${toString cfg.port} ; do
+ sleep 10
+ done
+ while true ; do
+ index=`${pkgs.curl}/bin/curl -s -L localhost:${toString cfg.port}`
+ if [[ !("$index" =~ 'Please wait while Jenkins is restarting' ||
+ "$index" =~ 'Please wait while Jenkins is getting ready to work') ]]; then
+ exit 0
+ fi
+ sleep 30
+ done
+ '';
+
+ serviceConfig = {
+ User = cfg.user;
+ };
+ };
+ };
+}
diff --git a/nixos/modules/services/continuous-integration/jenkins/slave.nix b/nixos/modules/services/continuous-integration/jenkins/slave.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5836d92a4fc0943e286ced08fbd3c64daf218a12
--- /dev/null
+++ b/nixos/modules/services/continuous-integration/jenkins/slave.nix
@@ -0,0 +1,68 @@
+{ config, lib, pkgs, ... }:
+with lib;
+let
+ cfg = config.services.jenkinsSlave;
+ masterCfg = config.services.jenkins;
+in {
+ options = {
+ services.jenkinsSlave = {
+ # todo:
+ # * assure the profile of the jenkins user has a JRE and any specified packages. This would
+ # enable ssh slaves.
+ # * Optionally configure the node as a jenkins ad-hoc slave. This would imply configuration
+ # properties for the master node.
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If true the system will be configured to work as a jenkins slave.
+ If the system is also configured to work as a jenkins master then this has no effect.
+ In progress: Currently only assures the jenkins user is configured.
+ '';
+ };
+
+ user = mkOption {
+ default = "jenkins";
+ type = with types; string;
+ description = ''
+ User the jenkins slave agent should execute under.
+ '';
+ };
+
+ group = mkOption {
+ default = "jenkins";
+ type = with types; string;
+ description = ''
+ If the default slave agent user "jenkins" is configured then this is
+ the primary group of that user.
+ '';
+ };
+
+ home = mkOption {
+ default = "/var/lib/jenkins";
+ type = with types; string;
+ description = ''
+ The path to use as JENKINS_HOME. If the default user "jenkins" is configured then
+ this is the home of the "jenkins" user.
+ '';
+ };
+ };
+ };
+
+ config = mkIf (cfg.enable && !masterCfg.enable) {
+ users.extraGroups = optional (cfg.group == "jenkins") {
+ name = "jenkins";
+ gid = config.ids.gids.jenkins;
+ };
+
+ users.extraUsers = optional (cfg.user == "jenkins") {
+ name = "jenkins";
+ description = "jenkins user";
+ createHome = true;
+ home = cfg.home;
+ group = cfg.group;
+ useDefaultShell = true;
+ uid = config.ids.uids.jenkins;
+ };
+ };
+}
diff --git a/nixos/modules/services/databases/4store-endpoint.nix b/nixos/modules/services/databases/4store-endpoint.nix
index 7872ea2dc6a3d1907f2621c558c9140b651c0d51..68913f15f953a3130748acfa51f630d578e75862 100644
--- a/nixos/modules/services/databases/4store-endpoint.nix
+++ b/nixos/modules/services/databases/4store-endpoint.nix
@@ -1,10 +1,10 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
let
cfg = config.services.fourStoreEndpoint;
endpointUser = "fourstorehttp";
run = "${pkgs.su}/bin/su -s ${pkgs.stdenv.shell} ${endpointUser} -c";
in
-with pkgs.lib;
+with lib;
{
###### interface
diff --git a/nixos/modules/services/databases/4store.nix b/nixos/modules/services/databases/4store.nix
index 412d14b050cbe5884bd071a34d79d8fb1f0dd462..1725672a659496663a3d06f6b29c455819b04c91 100644
--- a/nixos/modules/services/databases/4store.nix
+++ b/nixos/modules/services/databases/4store.nix
@@ -1,11 +1,11 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
let
cfg = config.services.fourStore;
stateDir = "/var/lib/4store";
fourStoreUser = "fourstore";
run = "${pkgs.su}/bin/su -s ${pkgs.stdenv.shell} ${fourStoreUser}";
in
-with pkgs.lib;
+with lib;
{
###### interface
diff --git a/nixos/modules/services/databases/couchdb.nix b/nixos/modules/services/databases/couchdb.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5088c741681074b6ac310f0e146b9a575052d058
--- /dev/null
+++ b/nixos/modules/services/databases/couchdb.nix
@@ -0,0 +1,174 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.couchdb;
+ configFile = pkgs.writeText "couchdb.ini"
+ ''
+ [couchdb]
+ database_dir = ${cfg.databaseDir}
+ uri_file = ${cfg.uriFile}
+ view_index_dir = ${cfg.viewIndexDir}
+
+ [httpd]
+ port = ${toString cfg.port}
+ bind_address = ${cfg.bindAddress}
+
+ [log]
+ file = ${cfg.logFile}
+ '';
+
+in {
+
+ ###### interface
+
+ options = {
+
+ services.couchdb = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to run CouchDB Server.
+ '';
+ };
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.couchdb;
+ example = literalExample "pkgs.couchdb";
+ description = ''
+ CouchDB package to use.
+ '';
+ };
+
+
+ user = mkOption {
+ type = types.string;
+ default = "couchdb";
+ description = ''
+ User account under which couchdb runs.
+ '';
+ };
+
+ group = mkOption {
+ type = types.string;
+ default = "couchdb";
+ description = ''
+ Group account under which couchdb runs.
+ '';
+ };
+
+ # couchdb options: http://docs.couchdb.org/en/latest/config/index.html
+
+ databaseDir = mkOption {
+ type = types.path;
+ default = "/var/lib/couchdb";
+ description = ''
+ Specifies location of CouchDB database files (*.couch named). This
+ location should be writable and readable for the user the CouchDB
+ service runs as (couchdb by default).
+ '';
+ };
+
+ uriFile = mkOption {
+ type = types.path;
+ default = "/var/run/couchdb/couchdb.uri";
+ description = ''
+ This file contains the full URI that can be used to access this
+ instance of CouchDB. It is used to help discover the port CouchDB is
+ running on (if it was set to 0 (e.g. automatically assigned any free
+ one). This file should be writable and readable for the user that
+ runs the CouchDB service (couchdb by default).
+ '';
+ };
+
+ viewIndexDir = mkOption {
+ type = types.path;
+ default = "/var/lib/couchdb";
+ description = ''
+ Specifies location of CouchDB view index files. This location should
+ be writable and readable for the user that runs the CouchDB service
+ (couchdb by default).
+ '';
+ };
+
+ bindAddress = mkOption {
+ type = types.string;
+ default = "127.0.0.1";
+ description = ''
+ Defines the IP address by which CouchDB will be accessible.
+ '';
+ };
+
+ port = mkOption {
+ type = types.int;
+ default = 5984;
+ description = ''
+ Defined the port number to listen.
+ '';
+ };
+
+ logFile = mkOption {
+ type = types.path;
+ default = "/var/log/couchdb.log";
+ description = ''
+ Specifies the location of file for logging output.
+ '';
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra configuration. Overrides any other cofiguration.
+ '';
+ };
+ };
+
+ };
+
+ ###### implementation
+
+ config = mkIf config.services.couchdb.enable {
+
+ environment.systemPackages = [ cfg.package ];
+
+ systemd.services.couchdb = {
+ description = "CouchDB Server";
+ wantedBy = [ "multi-user.target" ];
+
+ preStart =
+ ''
+ mkdir -p `dirname ${cfg.uriFile}`;
+ mkdir -p `dirname ${cfg.logFile}`;
+ mkdir -p ${cfg.databaseDir};
+ mkdir -p ${cfg.viewIndexDir};
+
+ if [ "$(id -u)" = 0 ]; then
+ chown ${cfg.user}:${cfg.group} `dirname ${cfg.uriFile}`
+ chown ${cfg.user}:${cfg.group} ${cfg.databaseDir}
+ chown ${cfg.user}:${cfg.group} ${cfg.viewIndexDir}
+ fi
+ '';
+
+ serviceConfig = {
+ PermissionsStartOnly = true;
+ User = cfg.user;
+ Group = cfg.group;
+ ExecStart = "${cfg.package}/bin/couchdb -a ${configFile} -a ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig}";
+ };
+ };
+
+ users.extraUsers.couchdb = {
+ description = "CouchDB Server user";
+ group = "couchdb";
+ uid = config.ids.uids.couchdb;
+ };
+
+ users.extraGroups.couchdb.gid = config.ids.gids.couchdb;
+
+ };
+}
diff --git a/nixos/modules/services/databases/firebird.nix b/nixos/modules/services/databases/firebird.nix
index 75c225bdb67b6324c7afe718542d1fc276713a96..83dd4951170a04aa91d621c15beca58195581632 100644
--- a/nixos/modules/services/databases/firebird.nix
+++ b/nixos/modules/services/databases/firebird.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
# TODO: This may file may need additional review, eg which configuartions to
# expose to the user.
@@ -19,7 +19,7 @@
# Eg superserver is said to be most efficiently using resources according to
# http://www.firebirdsql.org/manual/qsg25-classic-or-super.html
-with pkgs.lib;
+with lib;
let
@@ -49,6 +49,7 @@ in
package = mkOption {
default = pkgs.firebirdSuper;
+ type = types.package;
/*
Example: package = pkgs.firebirdSuper.override { icu =
pkgs.icu; };
which is not recommended for compatibility
diff --git a/nixos/modules/services/databases/memcached.nix b/nixos/modules/services/databases/memcached.nix
index 505253229c9c12dd3a2729850d19f8c41788a1a8..c6875af506d35f9c7fd343d82fa857f399de6d83 100644
--- a/nixos/modules/services/databases/memcached.nix
+++ b/nixos/modules/services/databases/memcached.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/databases/monetdb.nix b/nixos/modules/services/databases/monetdb.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9f09c71e005ad2fe1540d5195b370a6621d497d4
--- /dev/null
+++ b/nixos/modules/services/databases/monetdb.nix
@@ -0,0 +1,88 @@
+{ config, lib, pkgs, ... }:
+let
+ cfg = config.services.monetdb;
+ monetdbUser = "monetdb";
+in
+with lib;
+{
+
+ ###### interface
+
+ options = {
+
+ services.monetdb = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to enable MonetDB database server.";
+ };
+
+ package = mkOption {
+ type = types.path;
+ description = "MonetDB package to use.";
+ };
+
+ dbfarmDir = mkOption {
+ type = types.path;
+ default = "/var/lib/monetdb";
+ description = ''
+ Specifies location of Monetdb dbfarm (keeps database and auxiliary files).
+ '';
+ };
+
+ port = mkOption {
+ default = "50000";
+ example = "50000";
+ description = "Port to listen on.";
+ };
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ users.extraUsers.monetdb =
+ { name = monetdbUser;
+ uid = config.ids.uids.monetdb;
+ description = "monetdb user";
+ home = cfg.dbfarmDir;
+ };
+
+ users.extraGroups.monetdb.gid = config.ids.gids.monetdb;
+
+ environment.systemPackages = [ cfg.package ];
+
+ systemd.services.monetdb =
+ { description = "MonetDB Server";
+
+ wantedBy = [ "multi-user.target" ];
+
+ after = [ "network.target" ];
+
+ path = [ cfg.package ];
+
+ preStart =
+ ''
+ # Initialise the database.
+ if ! test -e ${cfg.dbfarmDir}/.merovingian_properties; then
+ mkdir -m 0700 -p ${cfg.dbfarmDir}
+ chown -R ${monetdbUser} ${cfg.dbfarmDir}
+ ${cfg.package}/bin/monetdbd create ${cfg.dbfarmDir}
+ ${cfg.package}/bin/monetdbd set port=${cfg.port} ${cfg.dbfarmDir}
+ fi
+ '';
+
+ serviceConfig.ExecStart = "${cfg.package}/bin/monetdbd start -n ${cfg.dbfarmDir}";
+
+ serviceConfig.ExecStop = "${cfg.package}/bin/monetdbd stop ${cfg.dbfarmDir}";
+
+ unitConfig.RequiresMountsFor = "${cfg.dbfarmDir}";
+ };
+
+ };
+
+}
diff --git a/nixos/modules/services/databases/mongodb.nix b/nixos/modules/services/databases/mongodb.nix
index 213a60687b23372ff7d63002a8b7d3174d1a9c39..fe82ca430e13828962f20c1d36c09583d0c40c8a 100644
--- a/nixos/modules/services/databases/mongodb.nix
+++ b/nixos/modules/services/databases/mongodb.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -39,6 +39,7 @@ in
package = mkOption {
default = pkgs.mongodb;
+ type = types.package;
description = "
Which MongoDB derivation to use.
";
diff --git a/nixos/modules/services/databases/mysql.nix b/nixos/modules/services/databases/mysql.nix
index 8be05a27cdcb38bfec2df99e65af15184e892016..1ca45d90f891909a71cd5582e3c0813a850994a4 100644
--- a/nixos/modules/services/databases/mysql.nix
+++ b/nixos/modules/services/databases/mysql.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -8,10 +8,14 @@ let
mysql = cfg.package;
+ is55 = mysql.mysqlVersion == "5.5";
+
+ mysqldDir = if is55 then "${mysql}/bin" else "${mysql}/libexec";
+
pidFile = "${cfg.pidDir}/mysqld.pid";
mysqldOptions =
- "--user=${cfg.user} --datadir=${cfg.dataDir} " +
+ "--user=${cfg.user} --datadir=${cfg.dataDir} --basedir=${mysql} " +
"--pid-file=${pidFile}";
myCnf = pkgs.writeText "my.cnf"
@@ -19,7 +23,7 @@ let
[mysqld]
${optionalString (cfg.replication.role == "master" || cfg.replication.role == "slave") "log-bin=mysql-bin"}
${optionalString (cfg.replication.role == "master" || cfg.replication.role == "slave") "server-id = ${toString cfg.replication.serverId}"}
- ${optionalString (cfg.replication.role == "slave")
+ ${optionalString (cfg.replication.role == "slave" && !is55)
''
master-host = ${cfg.replication.masterHost}
master-user = ${cfg.replication.masterUser}
@@ -47,7 +51,8 @@ in
};
package = mkOption {
- default = pkgs.mysql;
+ type = types.package;
+ example = literalExample "pkgs.mysql";
description = "
Which MySQL derivation to use.
";
@@ -176,7 +181,7 @@ in
chown -R ${cfg.user} ${cfg.pidDir}
'';
- serviceConfig.ExecStart = "${mysql}/libexec/mysqld --defaults-extra-file=${myCnf} ${mysqldOptions}";
+ serviceConfig.ExecStart = "${mysqldDir}/mysqld --defaults-extra-file=${myCnf} ${mysqldOptions}";
postStart =
''
@@ -216,6 +221,16 @@ in
fi
'') cfg.initialDatabases}
+ ${optionalString (cfg.replication.role == "slave" && is55)
+ ''
+ # Set up the replication master
+
+ ( echo "stop slave;"
+ echo "change master to master_host='${cfg.replication.masterHost}', master_user='${cfg.replication.masterUser}', master_password='${cfg.replication.masterPassword}';"
+ echo "start slave;"
+ ) | ${mysql}/bin/mysql -u root -N
+ ''}
+
${optionalString (cfg.initialScript != null)
''
# Execute initial script
@@ -235,9 +250,6 @@ in
rm /tmp/mysql_init
fi
''; # */
-
- serviceConfig.ExecStop =
- "${mysql}/bin/mysqladmin ${optionalString (cfg.rootPassword != null) "--user=root --password=\"$(cat ${cfg.rootPassword})\""} shutdown";
};
};
diff --git a/nixos/modules/services/databases/mysql55.nix b/nixos/modules/services/databases/mysql55.nix
deleted file mode 100644
index fe8b29e3c6b78c35c4121b19fdffc255f2a051af..0000000000000000000000000000000000000000
--- a/nixos/modules/services/databases/mysql55.nix
+++ /dev/null
@@ -1,248 +0,0 @@
-{ config, pkgs, ... }:
-
-with pkgs.lib;
-
-let
-
- cfg = config.services.mysql55;
-
- mysql = cfg.package;
-
- pidFile = "${cfg.pidDir}/mysqld.pid";
-
- mysqldOptions =
- "--user=${cfg.user} --datadir=${cfg.dataDir} " +
- "--pid-file=${pidFile}";
-
- myCnf = pkgs.writeText "my.cnf"
- ''
- [mysqld]
- ${optionalString (cfg.replication.role == "master" || cfg.replication.role == "slave") "log-bin=mysql-bin"}
- ${optionalString (cfg.replication.role == "master" || cfg.replication.role == "slave") "server-id = ${toString cfg.replication.serverId}"}
- ${cfg.extraOptions}
- '';
-
-in
-
-{
-
- ###### interface
-
- options = {
-
- services.mysql55 = {
-
- enable = mkOption {
- default = false;
- description = "
- Whether to enable the MySQL server.
- ";
- };
-
- package = mkOption {
- default = pkgs.mysql55;
- description = "
- Which MySQL derivation to use.
- ";
- };
-
- port = mkOption {
- default = "3306";
- description = "Port of MySQL";
- };
-
- user = mkOption {
- default = "mysql";
- description = "User account under which MySQL runs";
- };
-
- dataDir = mkOption {
- default = "/var/mysql"; # !!! should be /var/db/mysql
- description = "Location where MySQL stores its table files";
- };
-
- pidDir = mkOption {
- default = "/var/run/mysql";
- description = "Location of the file which stores the PID of the MySQL server";
- };
-
- extraOptions = mkOption {
- default = "";
- example = ''
- key_buffer_size = 6G
- table_cache = 1600
- log-error = /var/log/mysql_err.log
- '';
- description = ''
- Provide extra options to the MySQL configuration file.
-
- Please note, that these options are added to the
- [mysqld] section so you don't need to explicitly
- state it again.
- '';
- };
-
- initialDatabases = mkOption {
- default = [];
- description = "List of database names and their initial schemas that should be used to create databases on the first startup of MySQL";
- example = [
- { name = "foodatabase"; schema = literalExample "./foodatabase.sql"; }
- { name = "bardatabase"; schema = literalExample "./bardatabase.sql"; }
- ];
- };
-
- initialScript = mkOption {
- default = null;
- description = "A file containing SQL statements to be executed on the first startup. Can be used for granting certain permissions on the database";
- };
-
- # FIXME: remove this option; it's a really bad idea.
- rootPassword = mkOption {
- default = null;
- description = "Path to a file containing the root password, modified on the first startup. Not specifying a root password will leave the root password empty.";
- };
-
- replication = {
- role = mkOption {
- default = "none";
- description = "Role of the MySQL server instance. Can be either: master, slave or none";
- };
-
- serverId = mkOption {
- default = 1;
- description = "Id of the MySQL server instance. This number must be unique for each instance";
- };
-
- masterHost = mkOption {
- description = "Hostname of the MySQL master server";
- };
-
- masterUser = mkOption {
- description = "Username of the MySQL replication user";
- };
-
- masterPassword = mkOption {
- description = "Password of the MySQL replication user";
- };
-
- masterPort = mkOption {
- default = 3306;
- description = "Port number on which the MySQL master server runs";
- };
- };
- };
-
- };
-
-
- ###### implementation
-
- config = mkIf config.services.mysql55.enable {
-
- users.extraUsers.mysql = {
- description = "MySQL server user";
- group = "mysql";
- uid = config.ids.uids.mysql;
- };
-
- users.extraGroups.mysql.gid = config.ids.gids.mysql;
-
- environment.systemPackages = [mysql];
-
- systemd.services.mysql =
- { description = "MySQL Server";
-
- wantedBy = [ "multi-user.target" ];
-
- unitConfig.RequiresMountsFor = "${cfg.dataDir}";
-
- preStart =
- ''
- if ! test -e ${cfg.dataDir}/mysql; then
- mkdir -m 0700 -p ${cfg.dataDir}
- chown -R ${cfg.user} ${cfg.dataDir}
- ${mysql}/bin/mysql_install_db ${mysqldOptions}
- touch /tmp/mysql_init
- fi
-
- mkdir -m 0700 -p ${cfg.pidDir}
- chown -R ${cfg.user} ${cfg.pidDir}
- '';
-
- serviceConfig.ExecStart = "${mysql}/bin/mysqld --defaults-extra-file=${myCnf} ${mysqldOptions}";
-
- postStart =
- ''
- # Wait until the MySQL server is available for use
- count=0
- while [ ! -e /tmp/mysql.sock ]
- do
- if [ $count -eq 30 ]
- then
- echo "Tried 30 times, giving up..."
- exit 1
- fi
-
- echo "MySQL daemon not yet started. Waiting for 1 second..."
- count=$((count++))
- sleep 1
- done
-
- if [ -f /tmp/mysql_init ]
- then
- ${concatMapStrings (database:
- ''
- # Create initial databases
- if ! test -e "${cfg.dataDir}/${database.name}"; then
- echo "Creating initial database: ${database.name}"
- ( echo "create database ${database.name};"
- echo "use ${database.name};"
-
- if [ -f "${database.schema}" ]
- then
- cat ${database.schema}
- elif [ -d "${database.schema}" ]
- then
- cat ${database.schema}/mysql-databases/*.sql
- fi
- ) | ${mysql}/bin/mysql -u root -N
- fi
- '') cfg.initialDatabases}
-
- ${optionalString (cfg.replication.role == "slave")
- ''
- # Set up the replication master
-
- ( echo "stop slave;"
- echo "change master to master_host='${cfg.replication.masterHost}', master_user='${cfg.replication.masterUser}', master_password='${cfg.replication.masterPassword}';"
- echo "start slave;"
- ) | ${mysql}/bin/mysql -u root -N
- ''}
-
- ${optionalString (cfg.initialScript != null)
- ''
- # Execute initial script
- cat ${cfg.initialScript} | ${mysql}/bin/mysql -u root -N
- ''}
-
- ${optionalString (cfg.rootPassword != null)
- ''
- # Change root password
-
- ( echo "use mysql;"
- echo "update user set Password=password('$(cat ${cfg.rootPassword})') where User='root';"
- echo "flush privileges;"
- ) | ${mysql}/bin/mysql -u root -N
- ''}
-
- rm /tmp/mysql_init
- fi
- ''; # */
-
- serviceConfig.ExecStop =
- "${mysql}/bin/mysqladmin ${optionalString (cfg.rootPassword != null) "--user=root --password=\"$(cat ${cfg.rootPassword})\""} shutdown";
- };
-
- };
-
-}
diff --git a/nixos/modules/services/databases/openldap.nix b/nixos/modules/services/databases/openldap.nix
index 0fc8b88c6526a84c2fe5e56354711529ce9d0398..c95238b34515027d969f5f2e612f967cc7bb4305 100644
--- a/nixos/modules/services/databases/openldap.nix
+++ b/nixos/modules/services/databases/openldap.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/databases/postgresql.nix b/nixos/modules/services/databases/postgresql.nix
index 265d26e8ce98930e6c7531895ba9a5f5f880da5c..ad83cb553e1d506b69ed3ea7789620493b10b4e7 100644
--- a/nixos/modules/services/databases/postgresql.nix
+++ b/nixos/modules/services/databases/postgresql.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -55,7 +55,7 @@ in
};
package = mkOption {
- type = types.path;
+ type = types.package;
example = literalExample "pkgs.postgresql92";
description = ''
PostgreSQL package to use.
@@ -215,7 +215,7 @@ in
# Shut down Postgres using SIGINT ("Fast Shutdown mode"). See
# http://www.postgresql.org/docs/current/static/server-shutdown.html
KillSignal = "SIGINT";
- KillMode = "process"; # FIXME: this may cause processes to be left behind in the cgroup even after the final SIGKILL
+ KillMode = "mixed";
# Give Postgres a decent amount of time to clean up after
# receiving systemd's SIGINT.
diff --git a/nixos/modules/services/databases/redis.nix b/nixos/modules/services/databases/redis.nix
index ea6399ba4f44f8eaca6d8e83b58796953957e439..4ef48df9831c4a7a288b743b0d086fa464e7683b 100644
--- a/nixos/modules/services/databases/redis.nix
+++ b/nixos/modules/services/databases/redis.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.redis;
@@ -45,6 +45,7 @@ in
package = mkOption {
default = pkgs.redis;
description = "Which Redis derivation to use.";
+ type = types.package;
};
user = mkOption {
diff --git a/nixos/modules/services/databases/virtuoso.nix b/nixos/modules/services/databases/virtuoso.nix
index 6a29fc13211423125bfad92c0ab3622996c7a992..f955cb74b6ba829e692d0a81dc80f8c43e284ff3 100644
--- a/nixos/modules/services/databases/virtuoso.nix
+++ b/nixos/modules/services/databases/virtuoso.nix
@@ -1,10 +1,10 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
let
cfg = config.services.virtuoso;
virtuosoUser = "virtuoso";
stateDir = "/var/lib/virtuoso";
in
-with pkgs.lib;
+with lib;
{
###### interface
diff --git a/nixos/modules/services/desktops/accountservice.nix b/nixos/modules/services/desktops/accountservice.nix
new file mode 100644
index 0000000000000000000000000000000000000000..386dfe98bd23f1ff3dc581bd0b87be9b9849a06e
--- /dev/null
+++ b/nixos/modules/services/desktops/accountservice.nix
@@ -0,0 +1,40 @@
+# AccountsService daemon.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.accounts-daemon = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable AccountsService, a DBus service for accessing
+ the list of user accounts and information attached to those accounts.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.accounts-daemon.enable {
+
+ environment.systemPackages = [ pkgs.accountservice ];
+
+ services.dbus.packages = [ pkgs.accountservice ];
+
+ systemd.packages = [ pkgs.accountservice ];
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/at-spi2-core.nix b/nixos/modules/services/desktops/gnome3/at-spi2-core.nix
new file mode 100644
index 0000000000000000000000000000000000000000..22a54f511d1c16be7ccb743b5918036b6942c7d6
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/at-spi2-core.nix
@@ -0,0 +1,39 @@
+# at-spi2-core daemon.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.at-spi2-core = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable at-spi2-core, a service for the Assistive Technologies
+ available on the GNOME platform.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.at-spi2-core.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.at_spi2_core ];
+
+ services.dbus.packages = [ pkgs.gnome3.at_spi2_core ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/evolution-data-server.nix b/nixos/modules/services/desktops/gnome3/evolution-data-server.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a49b5b477689da9f59abefdc769d526467639a65
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/evolution-data-server.nix
@@ -0,0 +1,39 @@
+# Evolution Data Server daemon.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.evolution-data-server = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable Evolution Data Server, a collection of services for
+ storing addressbooks and calendars.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.evolution-data-server.enable {
+
+ environment.systemPackages = [ pkgs.evolution_data_server ];
+
+ services.dbus.packages = [ pkgs.evolution_data_server ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/gnome-keyring.nix b/nixos/modules/services/desktops/gnome3/gnome-keyring.nix
new file mode 100644
index 0000000000000000000000000000000000000000..447fd783f1482c7f87c4ef9537b6ca061d427b68
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/gnome-keyring.nix
@@ -0,0 +1,40 @@
+# GNOME Keyring daemon.
+
+{ config, pkgs, ... }:
+
+with pkgs.lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.gnome-keyring = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable GNOME Keyring daemon, a service designed to
+ take care of the user's security credentials,
+ such as user names and passwordsa search engine.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.gnome-keyring.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.gnome_keyring ];
+
+ services.dbus.packages = [ pkgs.gnome3.gnome_keyring ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/gnome-online-accounts.nix b/nixos/modules/services/desktops/gnome3/gnome-online-accounts.nix
new file mode 100644
index 0000000000000000000000000000000000000000..365e19c15bb131037a2be01069d610278868d1ae
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/gnome-online-accounts.nix
@@ -0,0 +1,39 @@
+# GNOME Online Accounts daemon.
+
+{ config, pkgs, ... }:
+
+with pkgs.lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.gnome-online-accounts = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable GNOME Online Accounts daemon, a service that provides
+ a single sign-on framework for the GNOME desktop.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.gnome-online-accounts.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.gnome_online_accounts ];
+
+ services.dbus.packages = [ pkgs.gnome3.gnome_online_accounts ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/gnome-user-share.nix b/nixos/modules/services/desktops/gnome3/gnome-user-share.nix
new file mode 100644
index 0000000000000000000000000000000000000000..df796ed77ff4903d8650ce10c5df4e902ecacc37
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/gnome-user-share.nix
@@ -0,0 +1,42 @@
+# GNOME User Share daemon.
+
+{ config, pkgs, ... }:
+
+with pkgs.lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.gnome-user-share = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable GNOME User Share, a service that exports the
+ contents of the Public folder in your home directory on the local network.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.gnome-user-share.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.gnome-user-share ];
+
+ services.xserver.displayManager.sessionCommands = with pkgs.gnome3; ''
+ # Don't let gnome-control-center depend upon gnome-user-share
+ export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${gnome-user-share}/share/gsettings-schemas/${gnome-user-share.name}
+ '';
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/sushi.nix b/nixos/modules/services/desktops/gnome3/sushi.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7a4389038b220870e5abffd41b4b30800ed8f980
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/sushi.nix
@@ -0,0 +1,38 @@
+# GNOME Sushi daemon.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.sushi = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable Sushi, a quick previewer for nautilus.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.sushi.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.sushi ];
+
+ services.dbus.packages = [ pkgs.gnome3.sushi ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/gnome3/tracker.nix b/nixos/modules/services/desktops/gnome3/tracker.nix
new file mode 100644
index 0000000000000000000000000000000000000000..94a22d0c88195fe4b77eee778229d58f82b1e64d
--- /dev/null
+++ b/nixos/modules/services/desktops/gnome3/tracker.nix
@@ -0,0 +1,39 @@
+# Tracker daemon.
+
+{ config, pkgs, ... }:
+
+with pkgs.lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.gnome3.tracker = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable Tracker services, a search engine,
+ search tool and metadata storage system.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.gnome3.tracker.enable {
+
+ environment.systemPackages = [ pkgs.gnome3.tracker ];
+
+ services.dbus.packages = [ pkgs.gnome3.tracker ];
+
+ };
+
+}
diff --git a/nixos/modules/services/desktops/telepathy.nix b/nixos/modules/services/desktops/telepathy.nix
new file mode 100644
index 0000000000000000000000000000000000000000..2554f3a1666fc9dd20cb8ce364b7cb3beb503eb2
--- /dev/null
+++ b/nixos/modules/services/desktops/telepathy.nix
@@ -0,0 +1,39 @@
+# Telepathy daemon.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.telepathy = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable Telepathy service, a communications framework
+ that enables real-time communication via pluggable protocol backends.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.telepathy.enable {
+
+ environment.systemPackages = [ pkgs.telepathy_mission_control ];
+
+ services.dbus.packages = [ pkgs.telepathy_mission_control ];
+
+ };
+
+}
diff --git a/nixos/modules/services/games/ghost-one.nix b/nixos/modules/services/games/ghost-one.nix
index 92c9112eeb6c3623bb4e5066a08ffbee0b88e5af..7a3ecebec39cad3850cc43280a795ca278e56031 100644
--- a/nixos/modules/services/games/ghost-one.nix
+++ b/nixos/modules/services/games/ghost-one.nix
@@ -1,5 +1,5 @@
-{pkgs, config, ...}:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.ghostOne;
diff --git a/nixos/modules/services/games/minecraft-server.nix b/nixos/modules/services/games/minecraft-server.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4c734aefa469832388962c769795f66fae66f483
--- /dev/null
+++ b/nixos/modules/services/games/minecraft-server.nix
@@ -0,0 +1,51 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.minecraft-server;
+in
+{
+ options = {
+ services.minecraft-server = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If enabled, start a Minecraft Server. The listening port for
+ the server is always 25565. The server
+ data will be loaded from and saved to
+ /var/lib/minecraft.
+ '';
+ };
+
+ jvmOpts = mkOption {
+ type = types.str;
+ default = "-Xmx2048M -Xms2048M";
+ description = "JVM options for the Minecraft Service.";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.extraUsers.minecraft = {
+ description = "Minecraft Server Service user";
+ home = "/var/lib/minecraft";
+ createHome = true;
+ uid = config.ids.uids.minecraft;
+ };
+
+ systemd.services.minecraft-server = {
+ description = "Minecraft Server Service";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+
+ serviceConfig.Restart = "always";
+ serviceConfig.User = "minecraft";
+ script = ''
+ cd /var/lib/minecraft
+ exec ${pkgs.minecraft-server}/bin/minecraft-server ${cfg.jvmOpts}
+ '';
+ };
+ };
+}
diff --git a/nixos/modules/services/hardware/80-net-name-slot.rules b/nixos/modules/services/hardware/80-net-name-slot.rules
new file mode 100644
index 0000000000000000000000000000000000000000..18547f170a3f9c0de47eea29c550d0244e432330
--- /dev/null
+++ b/nixos/modules/services/hardware/80-net-name-slot.rules
@@ -0,0 +1,13 @@
+# Copied from systemd 203.
+ACTION=="remove", GOTO="net_name_slot_end"
+SUBSYSTEM!="net", GOTO="net_name_slot_end"
+NAME!="", GOTO="net_name_slot_end"
+
+IMPORT{cmdline}="net.ifnames"
+ENV{net.ifnames}=="0", GOTO="net_name_slot_end"
+
+NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="$env{ID_NET_NAME_ONBOARD}"
+NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="$env{ID_NET_NAME_SLOT}"
+NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}"
+
+LABEL="net_name_slot_end"
diff --git a/nixos/modules/services/hardware/acpid.nix b/nixos/modules/services/hardware/acpid.nix
index 2329f38dfc25bfa1f668a3e84848aba719541c84..a710636c1400491a77f18ac460915f30e3972826 100644
--- a/nixos/modules/services/hardware/acpid.nix
+++ b/nixos/modules/services/hardware/acpid.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/hardware/bluetooth.nix b/nixos/modules/services/hardware/bluetooth.nix
index a70a66c2ba0bb6553df56b3b73a477733ef03251..68d0406e63bd5d062f2b2c8486d9e8de28fe0cd0 100644
--- a/nixos/modules/services/hardware/bluetooth.nix
+++ b/nixos/modules/services/hardware/bluetooth.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/hardware/pcscd.nix b/nixos/modules/services/hardware/pcscd.nix
index 9f389efc06d4990df1f3381235204ea73f474682..6e30dfb752d2a464973c038ab6adfe65e6105ab8 100644
--- a/nixos/modules/services/hardware/pcscd.nix
+++ b/nixos/modules/services/hardware/pcscd.nix
@@ -1,6 +1,10 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+let
+ cfgFile = pkgs.writeText "reader.conf" "";
+in
+
+with lib;
{
@@ -24,22 +28,26 @@ with pkgs.lib;
config = mkIf config.services.pcscd.enable {
- jobs.pcscd =
- { description = "PCSC-Lite daemon";
-
- startOn = "started udev";
-
- daemonType = "fork";
-
- # Add to the drivers directory the only drivers we have by now: ccid
- preStart = ''
- mkdir -p /var/lib/pcsc
- rm -Rf /var/lib/pcsc/drivers
- ln -s ${pkgs.ccid}/pcsc/drivers /var/lib/pcsc/
- '';
+ systemd.sockets.pcscd = {
+ description = "PCSC-Lite Socket";
+ wantedBy = [ "sockets.target" ];
+ before = [ "multi-user.target" ];
+ socketConfig.ListenStream = "/run/pcscd/pcscd.comm";
+ };
- exec = "${pkgs.pcsclite}/sbin/pcscd";
+ systemd.services.pcscd = {
+ description = "PCSC-Lite daemon";
+ preStart = ''
+ mkdir -p /var/lib/pcsc
+ rm -Rf /var/lib/pcsc/drivers
+ ln -s ${pkgs.ccid}/pcsc/drivers /var/lib/pcsc/
+ '';
+ serviceConfig = {
+ Type = "forking";
+ ExecStart = "${pkgs.pcsclite}/sbin/pcscd --auto-exit -c ${cfgFile}";
+ ExecReload = "${pkgs.pcsclite}/sbin/pcscd --hotplug";
};
+ };
};
diff --git a/nixos/modules/services/hardware/pommed.nix b/nixos/modules/services/hardware/pommed.nix
index 32599554fc12c6c16b58b9cb36827f9cfa280275..04db46999b0ad99e70ef016d6f156640279384f8 100644
--- a/nixos/modules/services/hardware/pommed.nix
+++ b/nixos/modules/services/hardware/pommed.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/hardware/sane.nix b/nixos/modules/services/hardware/sane.nix
index 5979feb824094c7955fffbafd99459daa9a294a7..01d910575bb5d75f5df5688355ec1cd0f3ee826a 100644
--- a/nixos/modules/services/hardware/sane.nix
+++ b/nixos/modules/services/hardware/sane.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/hardware/thinkfan.nix b/nixos/modules/services/hardware/thinkfan.nix
index b39c9cb1d9bb0c412e0558ecc92029009b659a03..16c31aab2d50224488f8069f3bdd9ceecc67f5db 100644
--- a/nixos/modules/services/hardware/thinkfan.nix
+++ b/nixos/modules/services/hardware/thinkfan.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/hardware/udev.nix b/nixos/modules/services/hardware/udev.nix
index 52b3ad435797a64ca6c4a33791c5b59ef49edbf6..507752dabcf7206e413dc4dcceff6294331389b8 100644
--- a/nixos/modules/services/hardware/udev.nix
+++ b/nixos/modules/services/hardware/udev.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -83,8 +83,8 @@ let
grep -l '\(RUN+\|IMPORT{program}\)="\(/usr\)\?/s\?bin' $i/*/udev/rules.d/* || true
done
- ${optionalString (!config.networking.usePredictableInterfaceNames) ''
- ln -s /dev/null $out/80-net-name-slot.rules
+ ${optionalString config.networking.usePredictableInterfaceNames ''
+ cp ${./80-net-name-slot.rules} $out/80-net-name-slot.rules
''}
# If auto-configuration is disabled, then remove
@@ -243,5 +243,9 @@ in
fi
'';
+ systemd.services.systemd-udevd =
+ { environment.MODULE_DIR = "/run/booted-system/kernel-modules/lib/modules";
+ };
+
};
}
diff --git a/nixos/modules/services/hardware/udisks.nix b/nixos/modules/services/hardware/udisks.nix
index 531ee192573ab329a199461b92d4ea4270b59b27..c9d11bcfc6879f827e31ab516bfd84a1b83adfc5 100644
--- a/nixos/modules/services/hardware/udisks.nix
+++ b/nixos/modules/services/hardware/udisks.nix
@@ -1,8 +1,8 @@
# Udisks daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/hardware/udisks2.nix b/nixos/modules/services/hardware/udisks2.nix
index 178ec379ff1bbcbb6e61287c4718cb3a20c99865..f5b641c7378b6faa4a1832cbec52db659acee666 100644
--- a/nixos/modules/services/hardware/udisks2.nix
+++ b/nixos/modules/services/hardware/udisks2.nix
@@ -1,8 +1,8 @@
# Udisks daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
@@ -14,7 +14,7 @@ with pkgs.lib;
enable = mkOption {
type = types.bool;
- default = false;
+ default = true;
description = ''
Whether to enable Udisks, a DBus service that allows
applications to query and manipulate storage devices.
diff --git a/nixos/modules/services/hardware/upower.nix b/nixos/modules/services/hardware/upower.nix
index 4a9b13d4aa09a6978f1de966c0623623133d16cc..a202d82f646aa6bf5fe603aa42a6633c7fecdaed 100644
--- a/nixos/modules/services/hardware/upower.nix
+++ b/nixos/modules/services/hardware/upower.nix
@@ -1,8 +1,8 @@
# Upower daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/logging/klogd.nix b/nixos/modules/services/logging/klogd.nix
index 36b530d0077e05ffa344cc5227e342781b949d61..f69e08152b5563bfa66b16544045bb97bcaa0a90 100644
--- a/nixos/modules/services/logging/klogd.nix
+++ b/nixos/modules/services/logging/klogd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
###### interface
diff --git a/nixos/modules/services/logging/logcheck.nix b/nixos/modules/services/logging/logcheck.nix
index 2a6a6516f48848d6d34e8921ba1e942d8be5d3e5..1cd032ffa76b61898629548b307d56d50e12db41 100644
--- a/nixos/modules/services/logging/logcheck.nix
+++ b/nixos/modules/services/logging/logcheck.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.logcheck;
@@ -208,12 +208,13 @@ in
mapAttrsToList writeIgnoreRule cfg.ignore
++ mapAttrsToList writeIgnoreCronRule cfg.ignoreCron;
- users.extraUsers = singleton
- { name = cfg.user;
+ users.extraUsers = optionalAttrs (cfg.user == "logcheck") (singleton
+ { name = "logcheck";
+ uid = config.ids.uids.logcheck;
shell = "/bin/sh";
description = "Logcheck user account";
extraGroups = cfg.extraGroups;
- };
+ });
system.activationScripts.logcheck = ''
mkdir -m 700 -p /var/{lib,lock}/logcheck
diff --git a/nixos/modules/services/logging/logrotate.nix b/nixos/modules/services/logging/logrotate.nix
index c6c0d2ea2382448ce9e735dbb6838f9bbda10fc7..804f9a0847ffe5bd1bd8beee57b0039f03b375e8 100644
--- a/nixos/modules/services/logging/logrotate.nix
+++ b/nixos/modules/services/logging/logrotate.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.logrotate;
diff --git a/nixos/modules/services/logging/logstash.nix b/nixos/modules/services/logging/logstash.nix
index 21128779e8f6afe4e3724415db0f9eae2598b47c..480e35a1156d8465df94da34a9720024bbddd701 100644
--- a/nixos/modules/services/logging/logstash.nix
+++ b/nixos/modules/services/logging/logstash.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.logstash;
diff --git a/nixos/modules/services/logging/rsyslogd.nix b/nixos/modules/services/logging/rsyslogd.nix
index 680c7a912c1f39414dc01602d5242c911fada7c0..d4b7aa809f00a35ea7673813be32f1a12b57b1e9 100644
--- a/nixos/modules/services/logging/rsyslogd.nix
+++ b/nixos/modules/services/logging/rsyslogd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/logging/syslogd.nix b/nixos/modules/services/logging/syslogd.nix
index 36a0ace927aed89c66eb0dda9e01bf85072e7e55..325868079e226805f04f89e33ecc1fba084af55a 100644
--- a/nixos/modules/services/logging/syslogd.nix
+++ b/nixos/modules/services/logging/syslogd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix
index 92682d644f41bc94661180f5a321f3254df1dcb7..1fb7102e7f3ee35deac7e067bae86b467635697e 100644
--- a/nixos/modules/services/mail/dovecot.nix
+++ b/nixos/modules/services/mail/dovecot.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/mail/freepops.nix b/nixos/modules/services/mail/freepops.nix
index 79f211ad86e3dc2767462928ebdd6eb7a4a71be4..2dd27a2033a74c24d70a2500b1f0f82b58c45da9 100644
--- a/nixos/modules/services/mail/freepops.nix
+++ b/nixos/modules/services/mail/freepops.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.mail.freepopsd;
diff --git a/nixos/modules/services/mail/mail.nix b/nixos/modules/services/mail/mail.nix
index bad0b22625dcd62116bf9d1c59e18a33c5580c57..b7e1d295f2c59188d4d786097932bfbed69a1d25 100644
--- a/nixos/modules/services/mail/mail.nix
+++ b/nixos/modules/services/mail/mail.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/mail/opensmtpd.nix b/nixos/modules/services/mail/opensmtpd.nix
index 2732fd60200489705f2c9ed46d4105c5516562d9..fbc4b1d7d8a8682da6abf09944ecbf6da2fc2971 100644
--- a/nixos/modules/services/mail/opensmtpd.nix
+++ b/nixos/modules/services/mail/opensmtpd.nix
@@ -1,7 +1,7 @@
-{ pkgs, config, ... }:
+{ config, lib, pkgs, ... }:
with pkgs;
-with pkgs.lib;
+with lib;
let
@@ -79,5 +79,10 @@ in {
preStart = "mkdir -p /var/spool";
serviceConfig.ExecStart = "${opensmtpd}/sbin/smtpd -d -f ${conf} ${args}";
};
+
+ environment.systemPackages = [ (pkgs.runCommand "opensmtpd-sendmail" {} ''
+ mkdir -p $out/bin
+ ln -s ${opensmtpd}/sbin/smtpctl $out/bin/sendmail
+ '') ];
};
}
diff --git a/nixos/modules/services/mail/postfix.nix b/nixos/modules/services/mail/postfix.nix
index 2633289b46d5ab20173f61d6efac3411086bfaa6..8f75bd8ab5d06bda8824dcc98a55aea641c5ef6b 100644
--- a/nixos/modules/services/mail/postfix.nix
+++ b/nixos/modules/services/mail/postfix.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/mail/spamassassin.nix b/nixos/modules/services/mail/spamassassin.nix
index aaf1dfcc210cbbf2d6abf384ac065f526126ab81..a3ac9e372422c3e54e2c889bd770f29f6130cf19 100644
--- a/nixos/modules/services/mail/spamassassin.nix
+++ b/nixos/modules/services/mail/spamassassin.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/autofs.nix b/nixos/modules/services/misc/autofs.nix
index 50491c556e8ad01c8aaf2c405699a8f2c084b0bb..e645bd25a66d0d9e123adf4f71ae06d5007ee52a 100644
--- a/nixos/modules/services/misc/autofs.nix
+++ b/nixos/modules/services/misc/autofs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/cgminer.nix b/nixos/modules/services/misc/cgminer.nix
index f715013b51f3ef33f776fee4d3634edbcf9da195..8f25df809cd6c618c64979c9958915d77d4cec54 100644
--- a/nixos/modules/services/misc/cgminer.nix
+++ b/nixos/modules/services/misc/cgminer.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.cgminer;
@@ -42,6 +42,7 @@ in
package = mkOption {
default = pkgs.cgminer;
description = "Which cgminer derivation to use.";
+ type = types.package;
};
user = mkOption {
diff --git a/nixos/modules/services/misc/dictd.nix b/nixos/modules/services/misc/dictd.nix
new file mode 100644
index 0000000000000000000000000000000000000000..552e0a435efe5325cf9ea3838c5dd6d373cd0f68
--- /dev/null
+++ b/nixos/modules/services/misc/dictd.nix
@@ -0,0 +1,63 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.dictd = {
+
+ enable = mkOption {
+ default = false;
+ description = ''
+ Whether to enable the DICT.org dictionary server.
+ '';
+ };
+
+ DBs = mkOption {
+ default = [];
+ # example = [ pkgs.dictDBs.nld2eng ];
+ description = ''List of databases to make available.'';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = let dictdb = pkgs.dictDBCollector { dictlist = map (x: {
+ name = x.name;
+ filename = x; } ) config.services.dictd.DBs; };
+ in mkIf config.services.dictd.enable {
+
+ # get the command line client on system path to make some use of the service
+ environment.systemPackages = [ pkgs.dict ];
+
+ users.extraUsers = singleton
+ { name = "dictd";
+ group = "dictd";
+ description = "DICT.org dictd server";
+ home = "${dictdb}/share/dictd";
+ uid = config.ids.uids.dictd;
+ };
+
+ users.extraGroups = singleton
+ { name = "dictd";
+ gid = config.ids.gids.dictd;
+ };
+
+ jobs.dictd =
+ { description = "DICT.org Dictionary Server";
+ startOn = "startup";
+ environment = { LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive"; };
+ daemonType = "fork";
+ exec = "${pkgs.dict}/sbin/dictd -s -c ${dictdb}/share/dictd/dictd.conf --locale en_US.UTF-8";
+ };
+ };
+
+}
diff --git a/nixos/modules/services/misc/disnix.nix b/nixos/modules/services/misc/disnix.nix
index 82526b154e7a4518ea8f14c98534b27eaf604569..94d0caaa76b7f118e5ccbfb0521fed6413dc225b 100644
--- a/nixos/modules/services/misc/disnix.nix
+++ b/nixos/modules/services/misc/disnix.nix
@@ -1,7 +1,7 @@
# Disnix server
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/felix.nix b/nixos/modules/services/misc/felix.nix
index 2da50fc85957f95ead0ab9dbedcf3984013ec598..a01c7f08b914a92b526fa2762c13265aa5a6d1a1 100644
--- a/nixos/modules/services/misc/felix.nix
+++ b/nixos/modules/services/misc/felix.nix
@@ -1,7 +1,7 @@
# Felix server
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/folding-at-home.nix b/nixos/modules/services/misc/folding-at-home.nix
index 9f4c4645279f0a434b5e666bf58c4868eed2d934..0093e3c0c33a1b234709ed1d205e0f8a73092565 100644
--- a/nixos/modules/services/misc/folding-at-home.nix
+++ b/nixos/modules/services/misc/folding-at-home.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
stateDir = "/var/lib/foldingathome";
cfg = config.services.foldingAtHome;
diff --git a/nixos/modules/services/misc/gpsd.nix b/nixos/modules/services/misc/gpsd.nix
index bc1d1f4575a8d31c4ffb58f93ae48a25ef78e650..4a677f33fa0ceaaee6caeed78cd6409e9128440b 100644
--- a/nixos/modules/services/misc/gpsd.nix
+++ b/nixos/modules/services/misc/gpsd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -19,6 +19,7 @@ in
services.gpsd = {
enable = mkOption {
+ type = types.bool;
default = false;
description = ''
Whether to enable `gpsd', a GPS service daemon.
@@ -26,6 +27,7 @@ in
};
device = mkOption {
+ type = types.str;
default = "/dev/ttyUSB0";
description = ''
A device may be a local serial device for GPS input, or a URL of the form:
@@ -35,6 +37,7 @@ in
};
readonly = mkOption {
+ type = types.bool;
default = true;
description = ''
Whether to enable the broken-device-safety, otherwise
@@ -51,6 +54,7 @@ in
};
port = mkOption {
+ type = types.uniq types.int;
default = 2947;
description = ''
The port where to listen for TCP connections.
@@ -58,6 +62,7 @@ in
};
debugLevel = mkOption {
+ type = types.uniq types.int;
default = 0;
description = ''
The debugging level.
@@ -85,19 +90,20 @@ in
inherit gid;
};
- jobs.gpsd =
- { description = "GPSD daemon";
-
- startOn = "ip-up";
-
- exec =
- ''
- ${pkgs.gpsd}/sbin/gpsd -D "${toString cfg.debugLevel}" \
- -S "${toString cfg.port}" \
- ${if cfg.readonly then "-b" else ""} \
- "${cfg.device}"
- '';
+ systemd.services.gpsd = {
+ description = "GPSD daemon";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+ serviceConfig = {
+ Type = "forking";
+ ExecStart = ''
+ ${pkgs.gpsd}/sbin/gpsd -D "${toString cfg.debugLevel}" \
+ -S "${toString cfg.port}" \
+ ${if cfg.readonly then "-b" else ""} \
+ "${cfg.device}"
+ '';
};
+ };
};
diff --git a/nixos/modules/services/misc/nix-daemon.nix b/nixos/modules/services/misc/nix-daemon.nix
index cca42aa11009396dee049633f0b80378946e5ce6..4bfd6268234de0fdb2f4bb5e8b4489c810b6b74a 100644
--- a/nixos/modules/services/misc/nix-daemon.nix
+++ b/nixos/modules/services/misc/nix-daemon.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -58,7 +58,7 @@ in
nix = {
package = mkOption {
- type = types.path;
+ type = types.package;
default = pkgs.nix;
description = ''
This option specifies the Nix package instance to use throughout the system.
@@ -253,7 +253,7 @@ in
config = {
- nix.chrootDirs = [ "/dev" "/dev/pts" "/proc" "/bin" ];
+ nix.chrootDirs = [ "/bin" ];
environment.etc."nix/nix.conf".source = nixConf;
@@ -275,28 +275,18 @@ in
) cfg.buildMachines;
};
- systemd.sockets."nix-daemon" =
- { description = "Nix Daemon Socket";
- wantedBy = [ "sockets.target" ];
- before = [ "multi-user.target" ];
- unitConfig.ConditionPathIsReadWrite = "/nix/var/nix/daemon-socket/";
- socketConfig.ListenStream = "/nix/var/nix/daemon-socket/socket";
- };
+ systemd.packages = [ nix ];
- systemd.services."nix-daemon" =
- { description = "Nix Daemon";
+ systemd.sockets.nix-daemon.wantedBy = [ "sockets.target" ];
- path = [ nix pkgs.openssl pkgs.utillinux ]
- ++ optionals cfg.distributedBuilds [ pkgs.openssh pkgs.gzip ];
+ systemd.services.nix-daemon =
+ { path = [ nix pkgs.openssl pkgs.utillinux pkgs.openssh ]
+ ++ optionals cfg.distributedBuilds [ pkgs.gzip ];
environment = cfg.envVars // { CURL_CA_BUNDLE = "/etc/ssl/certs/ca-bundle.crt"; };
- unitConfig.ConditionPathIsReadWrite = "/nix/var/nix/daemon-socket/";
-
serviceConfig =
- { ExecStart = "@${nix}/bin/nix-daemon nix-daemon --daemon";
- KillMode = "process";
- Nice = cfg.daemonNiceLevel;
+ { Nice = cfg.daemonNiceLevel;
IOSchedulingPriority = cfg.daemonIONiceLevel;
LimitNOFILE = 4096;
};
@@ -352,8 +342,7 @@ in
/nix/var/nix/profiles \
/nix/var/nix/db \
/nix/var/log/nix/drvs \
- /nix/var/nix/channel-cache \
- /nix/var/nix/chroots
+ /nix/var/nix/channel-cache
mkdir -m 1777 -p \
/nix/var/nix/gcroots/per-user \
/nix/var/nix/profiles/per-user \
diff --git a/nixos/modules/services/misc/nix-gc.nix b/nixos/modules/services/misc/nix-gc.nix
index fa20e0956f59664cdf5d2f773c53c851f2fc9155..6a7a7f4cee72640fb6f88095b39a4934dd58e023 100644
--- a/nixos/modules/services/misc/nix-gc.nix
+++ b/nixos/modules/services/misc/nix-gc.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.nix.gc;
diff --git a/nixos/modules/services/misc/nix-ssh-serve.nix b/nixos/modules/services/misc/nix-ssh-serve.nix
new file mode 100644
index 0000000000000000000000000000000000000000..80e7961b1f82ed770ccadc7a118c3817d6770f5d
--- /dev/null
+++ b/nixos/modules/services/misc/nix-ssh-serve.nix
@@ -0,0 +1,45 @@
+{ config, lib, pkgs, ... }:
+
+let
+ serveOnly = pkgs.writeScript "nix-store-serve" ''
+ #!${pkgs.stdenv.shell}
+ if [ "$SSH_ORIGINAL_COMMAND" != "nix-store --serve" ]; then
+ echo 'Error: You are only allowed to run `nix-store --serve'\'''!' >&2
+ exit 1
+ fi
+ exec /run/current-system/sw/bin/nix-store --serve
+ '';
+
+ inherit (lib) mkIf mkOption types;
+in {
+ options = {
+ nix.sshServe = {
+ enable = mkOption {
+ description = "Whether to enable serving the nix store over ssh.";
+ default = false;
+ type = types.bool;
+ };
+ };
+ };
+
+ config = mkIf config.nix.sshServe.enable {
+ users.extraUsers.nix-ssh = {
+ description = "User for running nix-store --serve.";
+ uid = config.ids.uids.nix-ssh;
+ shell = pkgs.stdenv.shell;
+ };
+
+ services.openssh.enable = true;
+
+ services.openssh.extraConfig = ''
+ Match User nix-ssh
+ AllowAgentForwarding no
+ AllowTcpForwarding no
+ PermitTTY no
+ PermitTunnel no
+ X11Forwarding no
+ ForceCommand ${serveOnly}
+ Match All
+ '';
+ };
+}
diff --git a/nixos/modules/services/misc/nixos-manual.nix b/nixos/modules/services/misc/nixos-manual.nix
index 1a8b85db32905a1cf63b2da7971168d0eafdd8f1..808c5dcbdc6f32a122eddc41fb287f0b2c43cda0 100644
--- a/nixos/modules/services/misc/nixos-manual.nix
+++ b/nixos/modules/services/misc/nixos-manual.nix
@@ -3,9 +3,9 @@
# of the virtual consoles. The latter is useful for the installation
# CD.
-{ config, pkgs, baseModules, ... } @ extraArgs:
+{ config, lib, pkgs, baseModules, ... } @ extraArgs:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/rippled.nix b/nixos/modules/services/misc/rippled.nix
new file mode 100644
index 0000000000000000000000000000000000000000..2c1fec9f6d7cc839cc79f51ae0c9f662235ddc83
--- /dev/null
+++ b/nixos/modules/services/misc/rippled.nix
@@ -0,0 +1,314 @@
+# configuration building is commented out until better tested.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.rippled;
+
+ rippledStateCfgFile = "/var/lib/rippled/rippled.cfg";
+
+ rippledCfg = ''
+ [node_db]
+ type=HyperLevelDB
+ path=/var/lib/rippled/db/hyperldb
+
+ [debug_logfile]
+ /var/log/rippled/debug.log
+
+ ''
+ + optionalString (cfg.peerIp != null) ''
+ [peer_ip]
+ ${cfg.peerIp}
+
+ [peer_port]
+ ${toString cfg.peerPort}
+
+ ''
+ + cfg.extraConfig;
+
+ rippledCfgFile = pkgs.writeText "rippled.cfg" rippledCfg;
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.rippled = {
+
+ enable = mkOption {
+ default = false;
+ description = "Whether to enable rippled";
+ };
+
+ #
+ # Rippled has a simple configuration file layout that is easy to
+ # build with nix. Many of the options are defined here but are
+ # commented out until the code to append them to the config above
+ # is written and they are tested.
+ #
+ # If you find a yourself implementing more options, please submit a
+ # pull request.
+ #
+
+ /*
+ ips = mkOption {
+ default = [ "r.ripple.com 51235" ];
+ example = [ "192.168.0.1" "192.168.0.1 3939" "r.ripple.com 51235" ];
+ description = ''
+ List of hostnames or ips where the Ripple protocol is served.
+ For a starter list, you can either copy entries from:
+ https://ripple.com/ripple.txt or if you prefer you can let it
+ default to r.ripple.com 51235
+
+ A port may optionally be specified after adding a space to the
+ address. By convention, if known, IPs are listed in from most
+ to least trusted.
+ '';
+ };
+
+ ipsFixed = mkOption {
+ default = null;
+ example = [ "192.168.0.1" "192.168.0.1 3939" "r.ripple.com 51235" ];
+ description = ''
+ List of IP addresses or hostnames to which rippled should always
+ attempt to maintain peer connections with. This is useful for
+ manually forming private networks, for example to configure a
+ validation server that connects to the Ripple network through a
+ public-facing server, or for building a set of cluster peers.
+
+ A port may optionally be specified after adding a space to the address
+ '';
+ };
+ */
+
+ peerIp = mkOption {
+ default = null;
+ example = "0.0.0.0";
+ description = ''
+ IP address or domain to bind to allow external connections from peers.
+ Defaults to not binding, which disallows external connections from peers.
+ '';
+ };
+
+ peerPort = mkOption {
+ default = 51235;
+ description = ''
+ If peerIp is supplied, corresponding port to bind to for peer connections.
+ '';
+ };
+
+ /*
+ peerPortProxy = mkOption {
+ type = types.int;
+ example = 51236;
+ description = ''
+ An optional, additional listening port number for peers. Incoming
+ connections on this port will be required to provide a PROXY Protocol
+ handshake, described in this document (external link):
+
+ http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
+
+ The PROXY Protocol is a popular method used by elastic load balancing
+ service providers such as Amazon, to identify the true IP address and
+ port number of external incoming connections.
+
+ In addition to enabling this setting, it will also be required to
+ use your provider-specific control panel or administrative web page
+ to configure your server instance to receive PROXY Protocol handshakes,
+ and also to restrict access to your instance to the Elastic Load Balancer.
+ '';
+ };
+
+ peerPrivate = mkOption {
+ default = null;
+ example = 0;
+ description = ''
+ 0: Request peers to broadcast your address. Normal outbound peer connections [default]
+ 1: Request peers not broadcast your address. Only connect to configured peers.
+ '';
+ };
+
+ peerSslCipherList = mkOption {
+ default = null;
+ example = "ALL:!LOW:!EXP:!MD5:@STRENGTH";
+ description = ''
+ A colon delimited string with the allowed SSL cipher modes for peer. The
+ choices for for ciphers are defined by the OpenSSL API function
+ SSL_CTX_set_cipher_list, documented here (external link):
+
+ http://pic.dhe.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_ssl_ctx_set_cipher_list.html
+
+ The default setting of "ALL:!LOW:!EXP:!MD5:@STRENGTH", which allows
+ non-authenticated peer connections (they are, however, secure).
+ '';
+ };
+
+ nodeSeed = mkOption {
+ default = null;
+ example = "RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE";
+ description = ''
+ This is used for clustering. To force a particular node seed or key, the
+ key can be set here. The format is the same as the validation_seed field.
+ To obtain a validation seed, use the rippled validation_create command.
+ '';
+ };
+
+ clusterNodes = mkOption {
+ default = null;
+ example = [ "n9KorY8QtTdRx7TVDpwnG9NvyxsDwHUKUEeDLY3AkiGncVaSXZi5" ];
+ description = ''
+ To extend full trust to other nodes, place their node public keys here.
+ Generally, you should only do this for nodes under common administration.
+ Node public keys start with an 'n'. To give a node a name for identification
+ place a space after the public key and then the name.
+ '';
+ };
+
+ sntpServers = mkOption {
+ default = null;
+ example = [ "time.nist.gov" "pool.ntp.org" ];
+ description = ''
+ IP address or domain of NTP servers to use for time synchronization.
+ '';
+ };
+
+ # TODO: websocket options
+
+ rpcAllowRemote = mkOption {
+ default = false;
+ description = ''
+ false: Allow RPC connections only from 127.0.0.1. [default]
+ true: Allow RPC connections from any IP.
+ '';
+ };
+
+ rpcAdminAllow = mkOption {
+ example = [ "10.0.0.4" ];
+ description = ''
+ List of IP addresses allowed to have admin access.
+ '';
+ };
+
+ rpcAdminUser = mkOption {
+ type = types.str;
+ description = ''
+ As a server, require this as the admin user to be specified. Also, require
+ rpc_admin_user and rpc_admin_password to be checked for RPC admin functions.
+ The request must specify these as the admin_user and admin_password in the
+ request object.
+ '';
+ };
+
+ rpcAdminPassword = mkOption {
+ type = types.str;
+ description = ''
+ As a server, require this as the admin pasword to be specified. Also,
+ require rpc_admin_user and rpc_admin_password to be checked for RPC admin
+ functions. The request must specify these as the admin_user and
+ admin_password in the request object.
+ '';
+ };
+
+ rpcIp = mkOption {
+ type = types.str;
+ description = ''
+ IP address or domain to bind to allow insecure RPC connections.
+ Defaults to not binding, which disallows RPC connections.
+ '';
+ };
+
+ rpcPort = mkOption {
+ type = types.int;
+ description = ''
+ If rpcIp is supplied, corresponding port to bind to for peer connections.
+ '';
+ };
+
+ rpcUser = mkOption {
+ type = types.str;
+ description = ''
+ Require a this user to specified and require rpcPassword to
+ be checked for RPC access via the rpcIp and rpcPort. The user and password
+ must be specified via HTTP's basic authentication method.
+ As a client, supply this to the server via HTTP's basic authentication
+ method.
+ '';
+ };
+
+ rpcPassword = mkOption {
+ type = types.str;
+ description = ''
+ Require a this password to specified and require rpc_user to
+ be checked for RPC access via the rpcIp and rpcPort. The user and password
+ must be specified via HTTP's basic authentication method.
+ As a client, supply this to the server via HTTP's basic authentication
+ method.
+ '';
+ };
+
+ rpcStartup = mkOption {
+ example = [ ''"command" : "log_level"'' ''"partition" : "ripplecalc"'' ''"severity" : "trace"'' ];
+ description = "List of RPC commands to run at startup.";
+ };
+
+ rpcSecure = mkOption {
+ default = false;
+ description = ''
+ false: Server certificates are not provided for RPC clients using SSL [default]
+ true: Client RPC connections wil be provided with SSL certificates.
+
+ Note that if rpc_secure is enabled, it will also be necessasry to configure the
+ certificate file settings located in rpcSslCert, rpcSslChain, and rpcSslKey
+ '';
+ };
+ */
+
+ extraConfig = mkOption {
+ default = "";
+ description = ''
+ Extra lines to be added verbatim to the rippled.cfg configuration file.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ users.extraUsers = singleton
+ { name = "rippled";
+ description = "Ripple server user";
+ uid = config.ids.uids.rippled;
+ home = "/var/lib/rippled";
+ };
+
+ systemd.services.rippled = {
+ path = [ pkgs.rippled ];
+
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+
+ serviceConfig = {
+ ExecStart = "${pkgs.rippled}/bin/rippled --fg -q --conf ${rippledStateCfgFile}";
+ WorkingDirectory = "/var/lib/rippled";
+ };
+ };
+
+ networking.firewall.allowedTCPPorts = mkIf (cfg.peerIp != null) [ cfg.peerPort ];
+
+ system.activationScripts.rippled = ''
+ mkdir -p /var/{lib,log}/rippled
+ chown -R rippled /var/{lib,log}/rippled
+ ln -sf ${rippledCfgFile} ${rippledStateCfgFile}
+ '';
+ };
+}
diff --git a/nixos/modules/services/misc/rogue.nix b/nixos/modules/services/misc/rogue.nix
index de25cc0fb982b5069804858a611eb22a9431842d..ed8da8a518ff32abcd08c01a159d9c70b563c758 100644
--- a/nixos/modules/services/misc/rogue.nix
+++ b/nixos/modules/services/misc/rogue.nix
@@ -1,9 +1,9 @@
# Execute the game `rogue' on tty 9. Mostly used by the NixOS
# installation CD.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/svnserve.nix b/nixos/modules/services/misc/svnserve.nix
index b0806d14738b0b6ab9eb13b0bda838f59b85037b..848905ca457f7ca049172b0260274ba07ac56966 100644
--- a/nixos/modules/services/misc/svnserve.nix
+++ b/nixos/modules/services/misc/svnserve.nix
@@ -1,7 +1,7 @@
# SVN server
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/misc/synergy.nix b/nixos/modules/services/misc/synergy.nix
index 63e7c7667e57b666dedf1eb061baca8bae507079..ec8ff426f0a68931ab1032ae88634ce284ea11dd 100644
--- a/nixos/modules/services/misc/synergy.nix
+++ b/nixos/modules/services/misc/synergy.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/monitoring/apcupsd.nix b/nixos/modules/services/monitoring/apcupsd.nix
index 58ec8a49694b8c52518b4da6d063585c73350566..6cc0c122ec628eb1e780efff8aadc9fe480eff92 100644
--- a/nixos/modules/services/monitoring/apcupsd.nix
+++ b/nixos/modules/services/monitoring/apcupsd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.apcupsd;
@@ -168,11 +168,11 @@ in
# shuts off power.) Copied from here:
# http://forums.opensuse.org/english/get-technical-help-here/applications/479499-apcupsd-systemd-killpower-issues.html
systemd.services.apcupsd-killpower = {
+ description = "APC UPS Kill Power";
after = [ "shutdown.target" ]; # append umount.target?
before = [ "final.target" ];
wantedBy = [ "shutdown.target" ];
unitConfig = {
- Description = "APC UPS Kill Power";
ConditionPathExists = "/run/apcupsd/powerfail";
DefaultDependencies = "no";
};
diff --git a/nixos/modules/services/monitoring/dd-agent.nix b/nixos/modules/services/monitoring/dd-agent.nix
index 37ce1c099df9f9d373ee4679f62ebb1bde4da447..bddf102ee5176a8a790947fb9e49814761161761 100644
--- a/nixos/modules/services/monitoring/dd-agent.nix
+++ b/nixos/modules/services/monitoring/dd-agent.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.dd-agent;
diff --git a/nixos/modules/services/monitoring/graphite.nix b/nixos/modules/services/monitoring/graphite.nix
index be57b8c5c03f4f1a01f2da59f0b478778f737511..cb67b9d4fcbbcb8e08c760f48f6e637e7bf1da8c 100644
--- a/nixos/modules/services/monitoring/graphite.nix
+++ b/nixos/modules/services/monitoring/graphite.nix
@@ -1,20 +1,34 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.graphite;
- writeTextOrNull = f: t: if t == null then null else pkgs.writeText f t;
+ writeTextOrNull = f: t: if t == null then null else pkgs.writeTextDir f t;
+
+ dataDir = cfg.dataDir;
+
+ configDir = pkgs.buildEnv {
+ name = "graphite-config";
+ paths = lists.filter (el: el != null) [
+ (writeTextOrNull "carbon.conf" cfg.carbon.config)
+ (writeTextOrNull "storage-agregation.conf" cfg.carbon.storageAggregation)
+ (writeTextOrNull "storage-schemas.conf" cfg.carbon.storageSchemas)
+ (writeTextOrNull "blacklist.conf" cfg.carbon.blacklist)
+ (writeTextOrNull "whitelist.conf" cfg.carbon.whitelist)
+ (writeTextOrNull "rewrite-rules.conf" cfg.carbon.rewriteRules)
+ (writeTextOrNull "relay-rules.conf" cfg.carbon.relayRules)
+ (writeTextOrNull "aggregation-rules.conf" cfg.carbon.aggregationRules)
+ ];
+ };
- dataDir = "/var/db/graphite";
carbonOpts = name: with config.ids; ''
- --nodaemon --syslog --prefix=${name} --pidfile /var/run/${name}.pid \
- --uid ${toString uids.graphite} --gid ${toString uids.graphite} ${name}
+ --nodaemon --syslog --prefix=${name} --pidfile ${dataDir}/${name}.pid ${name}
'';
carbonEnv = {
PYTHONPATH = "${pkgs.python27Packages.carbon}/lib/python2.7/site-packages";
GRAPHITE_ROOT = dataDir;
- GRAPHITE_CONF_DIR = "/etc/graphite/";
+ GRAPHITE_CONF_DIR = configDir;
GRAPHITE_STORAGE_DIR = dataDir;
};
@@ -23,6 +37,14 @@ in {
###### interface
options.services.graphite = {
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/db/graphite";
+ description = ''
+ Data directory for graphite.
+ '';
+ };
+
web = {
enable = mkOption {
description = "Whether to enable graphite web frontend";
@@ -38,8 +60,8 @@ in {
port = mkOption {
description = "Graphite web frontend port";
- default = "8080";
- type = types.str;
+ default = 8080;
+ type = types.int;
};
};
@@ -152,31 +174,17 @@ in {
###### implementation
config = mkIf (cfg.carbon.enableAggregator || cfg.carbon.enableCache || cfg.carbon.enableRelay || cfg.web.enable) {
- environment.etc = lists.filter (el: el.source != null) [
- { source = writeTextOrNull "carbon.conf" cfg.carbon.config;
- target = "graphite/carbon.conf"; }
- { source = writeTextOrNull "storage-agregation.conf" cfg.carbon.storageAggregation;
- target = "graphite/storage-agregation.conf"; }
- { source = writeTextOrNull "storage-schemas.conf" cfg.carbon.storageSchemas;
- target = "graphite/storage-schemas.conf"; }
- { source = writeTextOrNull "blacklist.conf" cfg.carbon.blacklist;
- target = "graphite/blacklist.conf"; }
- { source = writeTextOrNull "whitelist.conf" cfg.carbon.whitelist;
- target = "graphite/whitelist.conf"; }
- { source = writeTextOrNull "rewrite-rules.conf" cfg.carbon.rewriteRules;
- target = "graphite/rewrite-rules.conf"; }
- { source = writeTextOrNull "relay-rules.conf" cfg.carbon.relayRules;
- target = "graphite/relay-rules.conf"; }
- { source = writeTextOrNull "aggregation-rules.conf" cfg.carbon.aggregationRules;
- target = "graphite/aggregation-rules.conf"; }
- ];
-
- systemd.services.carbonCache = mkIf cfg.carbon.enableCache {
+ systemd.services.carbonCache = {
+ enable = cfg.carbon.enableCache;
description = "Graphite Data Storage Backend";
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
environment = carbonEnv;
- serviceConfig.ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-cache"}";
+ serviceConfig = {
+ ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-cache"}";
+ User = "graphite";
+ Group = "graphite";
+ };
restartTriggers = [
pkgs.pythonPackages.carbon
cfg.carbon.config
@@ -185,33 +193,45 @@ in {
cfg.carbon.rewriteRules
];
preStart = ''
- mkdir -p ${dataDir}/whisper
+ mkdir -m 0700 -p ${cfg.dataDir}/whisper
+ if [ "$(id -u)" = 0 ]; then chown -R graphite:graphite ${cfg.dataDir}; fi
'';
};
- systemd.services.carbonAggregator = mkIf cfg.carbon.enableAggregator {
+ systemd.services.carbonAggregator = {
+ enable = cfg.carbon.enableAggregator;
description = "Carbon Data Aggregator";
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
environment = carbonEnv;
- serviceConfig.ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-aggregator"}";
+ serviceConfig = {
+ ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-aggregator"}";
+ User = "graphite";
+ Group = "graphite";
+ };
restartTriggers = [
pkgs.pythonPackages.carbon cfg.carbon.config cfg.carbon.aggregationRules
];
};
- systemd.services.carbonRelay = mkIf cfg.carbon.enableRelay {
+ systemd.services.carbonRelay = {
+ enable = cfg.carbon.enableRelay;
description = "Carbon Data Relay";
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
environment = carbonEnv;
- serviceConfig.ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-relay"}";
+ serviceConfig = {
+ ExecStart = "${pkgs.twisted}/bin/twistd ${carbonOpts "carbon-relay"}";
+ User = "graphite";
+ Group = "graphite";
+ };
restartTriggers = [
pkgs.pythonPackages.carbon cfg.carbon.config cfg.carbon.relayRules
];
};
- systemd.services.graphiteWeb = mkIf cfg.web.enable {
+ systemd.services.graphiteWeb = {
+ enable = cfg.web.enable;
description = "Graphite Web Interface";
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
@@ -224,14 +244,15 @@ in {
serviceConfig = {
ExecStart = ''
${pkgs.python27Packages.waitress}/bin/waitress-serve \
- --host=${cfg.web.host} --port=${cfg.web.port} \
+ --host=${cfg.web.host} --port=${toString cfg.web.port} \
--call django.core.handlers.wsgi:WSGIHandler'';
User = "graphite";
Group = "graphite";
};
preStart = ''
if ! test -e ${dataDir}/db-created; then
- mkdir -p ${dataDir}/{whisper/,log/webapp/}
+ mkdir -m 0700 -p ${dataDir}/{whisper/,log/webapp/}
+ if [ "$(id -u)" = 0 ]; then chown -R graphite:graphite ${cfg.dataDir}; fi
# populate database
${pkgs.python27Packages.graphite_web}/bin/manage-graphite.py syncdb --noinput
@@ -259,7 +280,6 @@ in {
uid = config.ids.uids.graphite;
description = "Graphite daemon user";
home = dataDir;
- createHome = true;
};
users.extraGroups.graphite.gid = config.ids.gids.graphite;
};
diff --git a/nixos/modules/services/monitoring/munin.nix b/nixos/modules/services/monitoring/munin.nix
index 153f49429029bcee60e394d6d06e140d93789e0d..966c2eca282a5f4debb53ecc870a62d75e7b2b3f 100644
--- a/nixos/modules/services/monitoring/munin.nix
+++ b/nixos/modules/services/monitoring/munin.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
# TODO: support munin-async
# TODO: LWP/Pg perl libs aren't recognized
@@ -11,7 +11,7 @@
# nginx http://munin.readthedocs.org/en/latest/example/webserver/nginx.html
-with pkgs.lib;
+with lib;
let
nodeCfg = config.services.munin-node;
@@ -173,10 +173,12 @@ in
name = "munin";
description = "Munin monitoring user";
group = "munin";
+ uid = config.ids.uids.munin;
}];
users.extraGroups = [{
name = "munin";
+ gid = config.ids.gids.munin;
}];
}) (mkIf nodeCfg.enable {
diff --git a/nixos/modules/services/monitoring/nagios/default.nix b/nixos/modules/services/monitoring/nagios/default.nix
index c809a3b84573fbe3ca7b37be8c15e9e67cfbbaa7..2eeddf782501dc445d14d9acef9a00c58abb97f8 100644
--- a/nixos/modules/services/monitoring/nagios/default.nix
+++ b/nixos/modules/services/monitoring/nagios/default.nix
@@ -1,7 +1,7 @@
# Nagios system/network monitoring daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/monitoring/smartd.nix b/nixos/modules/services/monitoring/smartd.nix
index 512e639721e4d993da3e14232dcc12d7777f3d94..250035fe447f47b684f29689b84d41eb301dabc7 100644
--- a/nixos/modules/services/monitoring/smartd.nix
+++ b/nixos/modules/services/monitoring/smartd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/monitoring/statsd.nix b/nixos/modules/services/monitoring/statsd.nix
index 979debefdd9fef4ae54c70a9936e70153b71a191..05950639c1e0936f1f3569b08ce64df92fbd0eab 100644
--- a/nixos/modules/services/monitoring/statsd.nix
+++ b/nixos/modules/services/monitoring/statsd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -64,13 +64,13 @@ in
graphiteHost = mkOption {
description = "Hostname or IP of Graphite server";
- default = "127.0.0.1";
+ default = config.services.graphite.web.host;
type = types.str;
};
graphitePort = mkOption {
description = "Port of Graphite server";
- default = 2003;
+ default = config.services.graphite.web.port;
type = types.uniq types.int;
};
diff --git a/nixos/modules/services/monitoring/systemhealth.nix b/nixos/modules/services/monitoring/systemhealth.nix
index 0a3e666ad4e7a7eb348335f21ac9346cba351321..b0e59595e1337256aedb6f74f9b180b9cf6284a6 100644
--- a/nixos/modules/services/monitoring/systemhealth.nix
+++ b/nixos/modules/services/monitoring/systemhealth.nix
@@ -1,6 +1,6 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.systemhealth;
diff --git a/nixos/modules/services/monitoring/ups.nix b/nixos/modules/services/monitoring/ups.nix
index c00f4bad93513d61723ca3b8f71c44d12b4d424b..cc9026f768a8ef2ac18e16cd4fed9a3df2107244 100644
--- a/nixos/modules/services/monitoring/ups.nix
+++ b/nixos/modules/services/monitoring/ups.nix
@@ -1,8 +1,8 @@
-{config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
# TODO: This is not secure, have a look at the file docs/security.txt inside
# the project sources.
-with pkgs.lib;
+with lib;
let
cfg = config.power.ups;
diff --git a/nixos/modules/services/monitoring/zabbix-agent.nix b/nixos/modules/services/monitoring/zabbix-agent.nix
index 229236c1bbd44bb17ba65bca875e8f60b656447c..481298f763a49a72112af6e31bf5487429733596 100644
--- a/nixos/modules/services/monitoring/zabbix-agent.nix
+++ b/nixos/modules/services/monitoring/zabbix-agent.nix
@@ -1,7 +1,7 @@
# Zabbix agent daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/monitoring/zabbix-server.nix b/nixos/modules/services/monitoring/zabbix-server.nix
index 6735b4ca32794692a68abd10c51c3a9b093d45d4..ca283ea2a99f47931cbb1cf7b91b9b49da0092b6 100644
--- a/nixos/modules/services/monitoring/zabbix-server.nix
+++ b/nixos/modules/services/monitoring/zabbix-server.nix
@@ -1,7 +1,7 @@
# Zabbix server daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/network-filesystems/drbd.nix b/nixos/modules/services/network-filesystems/drbd.nix
index 1a00ccab0a616f7c22fdef3ad054ead914feb84a..b914724abfe24453852f604c90ef8d3297fd4656 100644
--- a/nixos/modules/services/network-filesystems/drbd.nix
+++ b/nixos/modules/services/network-filesystems/drbd.nix
@@ -1,8 +1,8 @@
# Support for DRBD, the Distributed Replicated Block Device.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.services.drbd; in
diff --git a/nixos/modules/services/network-filesystems/nfsd.nix b/nixos/modules/services/network-filesystems/nfsd.nix
index 4daa5e9d06391d473a814b125e1cd40dcc761e84..2217fec3b0f7def921b1e5b7dc5efb8746c0dc27 100644
--- a/nixos/modules/services/network-filesystems/nfsd.nix
+++ b/nixos/modules/services/network-filesystems/nfsd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/network-filesystems/openafs-client/default.nix b/nixos/modules/services/network-filesystems/openafs-client/default.nix
index 4a888b64bd34ed2f87ea0e4b0ed42d51445b26b7..b34ebc3663e34e787cac51b65d72e0e7ee4b5e3a 100644
--- a/nixos/modules/services/network-filesystems/openafs-client/default.nix
+++ b/nixos/modules/services/network-filesystems/openafs-client/default.nix
@@ -46,6 +46,16 @@ in
description = "Cache directory.";
};
+ crypt = mkOption {
+ default = false;
+ description = "Whether to enable (weak) protocol encryption.";
+ };
+
+ sparse = mkOption {
+ default = false;
+ description = "Minimal cell list in /afs.";
+ };
+
};
};
@@ -70,18 +80,23 @@ in
startOn = "started network-interfaces";
stopOn = "stopping network-interfaces";
- preStart = ''
- mkdir -m 0755 /afs || true
- mkdir -m 0755 -p ${cfg.cacheDirectory} || true
+ preStart = ''
+ mkdir -p -m 0755 /afs
+ mkdir -m 0700 -p ${cfg.cacheDirectory}
${pkgs.module_init_tools}/sbin/insmod ${openafsPkgs}/lib/openafs/libafs-*.ko || true
- ${openafsPkgs}/sbin/afsd -confdir ${afsConfig} -cachedir ${cfg.cacheDirectory} -dynroot -fakestat
- '';
-
- postStop = ''
- umount /afs
+ ${openafsPkgs}/sbin/afsd -confdir ${afsConfig} -cachedir ${cfg.cacheDirectory} ${if cfg.sparse then "-dynroot-sparse" else "-dynroot"} -fakestat -afsdb
+ ${openafsPkgs}/bin/fs setcrypt ${if cfg.crypt then "on" else "off"}
+ '';
+
+ # Doing this in preStop, because after these commands AFS is basically
+ # stopped, so systemd has nothing to do, just noticing it. If done in
+ # postStop, then we get a hang + kernel oops, because AFS can't be
+ # stopped simply by sending signals to processes.
+ preStop = ''
+ ${pkgs.utillinux}/bin/umount /afs
${openafsPkgs}/sbin/afsd -shutdown
- rmmod libafs
- '';
+ ${pkgs.module_init_tools}/sbin/rmmod libafs
+ '';
};
diff --git a/nixos/modules/services/network-filesystems/rsyncd.nix b/nixos/modules/services/network-filesystems/rsyncd.nix
new file mode 100644
index 0000000000000000000000000000000000000000..bc17add809b2d5ac48c1c4fdfea6553adea8d3df
--- /dev/null
+++ b/nixos/modules/services/network-filesystems/rsyncd.nix
@@ -0,0 +1,139 @@
+{ config, pkgs, ... }:
+
+with pkgs.lib;
+
+let
+
+ cfg = config.services.rsyncd;
+
+ motdFile = pkgs.writeText "rsyncd-motd" cfg.motd;
+
+ rsyncdCfg = ""
+ + optionalString (cfg.motd != "") "motd file = ${motdFile}\n"
+ + optionalString (cfg.address != "") "address = ${cfg.address}\n"
+ + optionalString (cfg.port != 873) "port = ${toString cfg.port}\n"
+ + cfg.extraConfig
+ + "\n"
+ + flip concatMapStrings cfg.modules (m: "[${m.name}]\n\tpath = ${m.path}\n"
+ + optionalString (m.comment != "") "\tcomment = ${m.comment}\n"
+ + m.extraConfig
+ + "\n"
+ );
+
+ rsyncdCfgFile = pkgs.writeText "rsyncd.conf" rsyncdCfg;
+
+in
+
+{
+ options = {
+
+ services.rsyncd = {
+
+ enable = mkOption {
+ default = false;
+ description = "Whether to enable the rsync daemon.";
+ };
+
+ motd = mkOption {
+ type = types.string;
+ default = "";
+ description = ''
+ Message of the day to display to clients on each connect.
+ This usually contains site information and any legal notices.
+ '';
+ };
+
+ port = mkOption {
+ default = 873;
+ type = types.int;
+ description = "TCP port the daemon will listen on.";
+ };
+
+ address = mkOption {
+ default = "";
+ example = "192.168.1.2";
+ description = ''
+ IP address the daemon will listen on; rsyncd will listen on
+ all addresses if this is not specified.
+ '';
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Lines of configuration to add to rsyncd globally.
+ See man rsyncd.conf for more options.
+ '';
+ };
+
+ modules = mkOption {
+ default = [ ];
+ example = [
+ { name = "ftp";
+ path = "/home/ftp";
+ comment = "ftp export area";
+ extraConfig = ''
+ secrets file = /etc/rsyncd.secrets
+ '';
+ }
+ ];
+ description = "The list of file paths to export.";
+ type = types.listOf types.optionSet;
+
+ options = {
+
+ name = mkOption {
+ example = "ftp";
+ type = types.string;
+ description = "Name of export module.";
+ };
+
+ comment = mkOption {
+ default = "";
+ description = ''
+ Description string that is displayed next to the module name
+ when clients obtain a list of available modules.
+ '';
+ };
+
+ path = mkOption {
+ example = "/home/ftp";
+ type = types.string;
+ description = "Directory to make available in this module.";
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Lines of configuration to add to this module.
+ See man rsyncd.conf for more options.
+ '';
+ };
+ };
+ };
+ };
+ };
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ environment.etc = singleton
+ { source = rsyncdCfgFile;
+ target = "rsyncd.conf";
+ };
+
+ systemd.services.rsyncd = {
+ description = "Rsync daemon";
+ wantedBy = [ "multi-user.target" ];
+
+ path = [ pkgs.rsync ];
+
+ serviceConfig.ExecStart = "${pkgs.rsync}/bin/rsync --daemon --no-detach";
+ };
+
+ networking.firewall.allowedTCPPorts = [ cfg.port ];
+ };
+}
\ No newline at end of file
diff --git a/nixos/modules/services/network-filesystems/samba.nix b/nixos/modules/services/network-filesystems/samba.nix
index 4f6fce6cd52e74378c3b3a97a2fb9ac0232e4f8e..51a4d193d50427dd5e13d84bd03be1b3596f4731 100644
--- a/nixos/modules/services/network-filesystems/samba.nix
+++ b/nixos/modules/services/network-filesystems/samba.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/amuled.nix b/nixos/modules/services/networking/amuled.nix
index 8652d0daf4c81a9e3301605708d8c2c4921b870a..516238fdddf63bd67f8bf9ada6f3061da5fab7b8 100644
--- a/nixos/modules/services/networking/amuled.nix
+++ b/nixos/modules/services/networking/amuled.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.amule;
diff --git a/nixos/modules/services/networking/avahi-daemon.nix b/nixos/modules/services/networking/avahi-daemon.nix
index 2256de89630d70859fb6179ee642d592770012ed..284b2b84e6c706845a3f3dca33daf4121a4c5575 100644
--- a/nixos/modules/services/networking/avahi-daemon.nix
+++ b/nixos/modules/services/networking/avahi-daemon.nix
@@ -1,7 +1,7 @@
# Avahi daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -142,6 +142,10 @@ in
services.dbus.enable = true;
services.dbus.packages = [avahi];
+ # Enabling Avahi without exposing it in the firewall doesn't make
+ # sense.
+ networking.firewall.allowedUDPPorts = [ 5353 ];
+
};
}
diff --git a/nixos/modules/services/networking/bind.nix b/nixos/modules/services/networking/bind.nix
index 765dc014dcb7776909a409b57829cf69b841d85c..57547da100678a6a440a0a73837bb3c4ae2aae2b 100644
--- a/nixos/modules/services/networking/bind.nix
+++ b/nixos/modules/services/networking/bind.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/bitlbee.nix b/nixos/modules/services/networking/bitlbee.nix
index fe37e8ea0120fad453cbfd4fe1f0c2e64309fe06..7276603da16fbd92813f954c7327616a1d15e4ef 100644
--- a/nixos/modules/services/networking/bitlbee.nix
+++ b/nixos/modules/services/networking/bitlbee.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/btsync.nix b/nixos/modules/services/networking/btsync.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8b288a713c60fdcfa0cc1a208b1f13f3d52124cb
--- /dev/null
+++ b/nixos/modules/services/networking/btsync.nix
@@ -0,0 +1,280 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.btsync;
+ listenAddr = cfg.httpListenAddr + ":" + (toString cfg.httpListenPort);
+
+ boolStr = x: if x then "true" else "false";
+ optionalEmptyStr = b: v: optionalString (b != "") v;
+
+ webUIConfig = optionalString cfg.enableWebUI
+ ''
+ "webui":
+ {
+ ${optionalEmptyStr cfg.httpLogin "\"login\": \"${cfg.httpLogin}\","}
+ ${optionalEmptyStr cfg.httpPass "\"password\": \"${cfg.httpPass}\","}
+ ${optionalEmptyStr cfg.apiKey "\"api_key\": \"${cfg.apiKey}\","}
+ "listen": "${listenAddr}"
+ }
+ '';
+
+ knownHosts = e:
+ optionalString (e ? "knownHosts")
+ (concatStringsSep "," (map (v: "\"${v}\"") e."knownHosts"));
+
+ sharedFoldersRecord =
+ concatStringsSep "," (map (entry:
+ let helper = attr: v:
+ if (entry ? attr) then boolStr entry.attr else boolStr v;
+ in
+ ''
+ {
+ "secret": "${entry.secret}",
+ "dir": "${entry.directory}",
+
+ "use_relay_server": ${helper "useRelayServer" true},
+ "use_tracker": ${helper "useTracker" true},
+ "use_dht": ${helper "useDHT" false},
+
+ "search_lan": ${helper "searchLAN" true},
+ "use_sync_trash": ${helper "useSyncTrash" true},
+
+ "known_hosts": [${knownHosts entry}]
+ }
+ '') cfg.sharedFolders);
+
+ sharedFoldersConfig = optionalString (cfg.sharedFolders != [])
+ ''
+ "shared_folders":
+ [
+ ${sharedFoldersRecord}
+ ]
+ '';
+
+ configFile = pkgs.writeText "btsync.config"
+ ''
+ {
+ "device_name": "${cfg.deviceName}",
+ "storage_path": "/var/lib/btsync",
+ "listening_port": ${toString cfg.listeningPort},
+ "use_gui": false,
+
+ "check_for_updates": ${boolStr cfg.checkForUpdates},
+ "use_upnp": ${boolStr cfg.useUpnp},
+ "download_limit": ${toString cfg.downloadLimit},
+ "upload_limit": ${toString cfg.uploadLimit},
+ "lan_encrypt_data": ${boolStr cfg.encryptLAN},
+
+ ${webUIConfig}
+ ${sharedFoldersConfig}
+ }
+ '';
+in
+{
+ options = {
+ services.btsync = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If enabled, start the Bittorrent Sync daemon. Once enabled,
+ you can interact with the service through the Web UI, or
+ configure it in your NixOS configuration. Enabling the
+ btsync service also installs a
+ multi-instance systemd unit which can be used to start
+ user-specific copies of the daemon. Once installed, you can
+ use systemctl start btsync@user to start
+ the daemon only for user user, using the
+ configuration file located at
+ $HOME/.config/btsync.conf
+ '';
+ };
+
+ deviceName = mkOption {
+ type = types.str;
+ example = "Voltron";
+ description = ''
+ Name of the Bittorrent Sync device.
+ '';
+ };
+
+ listeningPort = mkOption {
+ type = types.int;
+ default = 0;
+ example = 44444;
+ description = ''
+ Listening port. Defaults to 0 which randomizes the port.
+ '';
+ };
+
+ checkForUpdates = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Determines whether to check for updates and alert the user
+ about them in the UI.
+ '';
+ };
+
+ useUpnp = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Use Universal Plug-n-Play (UPnP)
+ '';
+ };
+
+ downloadLimit = mkOption {
+ type = types.int;
+ default = 0;
+ example = 1024;
+ description = ''
+ Download speed limit. 0 is unlimited (default).
+ '';
+ };
+
+ uploadLimit = mkOption {
+ type = types.int;
+ default = 0;
+ example = 1024;
+ description = ''
+ Upload speed limit. 0 is unlimited (default).
+ '';
+ };
+
+ httpListenAddr = mkOption {
+ type = types.str;
+ default = "0.0.0.0";
+ example = "1.2.3.4";
+ description = ''
+ HTTP address to bind to.
+ '';
+ };
+
+ httpListenPort = mkOption {
+ type = types.int;
+ default = 9000;
+ description = ''
+ HTTP port to bind on.
+ '';
+ };
+
+ httpLogin = mkOption {
+ type = types.str;
+ example = "allyourbase";
+ description = ''
+ HTTP web login username.
+ '';
+ };
+
+ httpPass = mkOption {
+ type = types.str;
+ example = "arebelongtous";
+ description = ''
+ HTTP web login password.
+ '';
+ };
+
+ encryptLAN = mkOption {
+ type = types.bool;
+ default = true;
+ description = "Encrypt LAN data.";
+ };
+
+ enableWebUI = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable Web UI for administration. Bound to the specified
+ httpListenAddress and
+ httpListenPort.
+ '';
+ };
+
+ apiKey = mkOption {
+ type = types.str;
+ default = "";
+ description = "API key, which enables the developer API.";
+ };
+
+ sharedFolders = mkOption {
+ default = [];
+ example =
+ [ { secret = "AHMYFPCQAHBM7LQPFXQ7WV6Y42IGUXJ5Y";
+ directory = "/home/user/sync_test";
+ useRelayServer = true;
+ useTracker = true;
+ useDHT = false;
+ searchLAN = true;
+ useSyncTrash = true;
+ knownHosts =
+ [ "192.168.1.2:4444"
+ "192.168.1.3:4444"
+ ];
+ }
+ ];
+ description = ''
+ Shared folder list. If enabled, web UI must be
+ disabled. Secrets can be generated using btsync
+ --generate-secret. Note that this secret will be
+ put inside the Nix store, so it is realistically not very
+ secret.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions =
+ [ { assertion = cfg.deviceName != "";
+ message = "Device name cannot be empty.";
+ }
+ { assertion = cfg.enableWebUI -> cfg.sharedFolders == [];
+ message = "If using shared folders, the web UI cannot be enabled.";
+ }
+ { assertion = cfg.apiKey != "" -> cfg.enableWebUI;
+ message = "If you're using an API key, you must enable the web server.";
+ }
+ # TODO FIXME: the README says not specifying the login/pass means it
+ # should disable authentication, but apparently it doesn't?
+ { assertion = cfg.enableWebUI -> cfg.httpLogin != "" && cfg.httpPass != "";
+ message = "If using the web UI, you must configure a login/password.";
+ }
+ # TODO FIXME: assert the existence of sharedFolder directories?
+ ];
+
+ users.extraUsers.btsync = {
+ description = "Bittorrent Sync Service user";
+ home = "/var/lib/btsync";
+ createHome = true;
+ uid = config.ids.uids.btsync;
+ };
+
+ systemd.services.btsync = with pkgs; {
+ description = "Bittorrent Sync Service";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+ serviceConfig = {
+ Restart = "on-abort";
+ User = "btsync";
+ ExecStart =
+ "${bittorrentSync}/bin/btsync --nodaemon --config ${configFile}";
+ };
+ };
+
+ systemd.services."btsync@" = with pkgs; {
+ description = "Bittorrent Sync Service for %i";
+ after = [ "network.target" ];
+ serviceConfig = {
+ Restart = "on-abort";
+ User = "%i";
+ ExecStart =
+ "${bittorrentSync}/bin/btsync --nodaemon --config %h/.config/btsync.conf";
+ };
+ };
+
+ environment.systemPackages = [ pkgs.bittorrentSync ];
+ };
+}
diff --git a/nixos/modules/services/networking/chrony.nix b/nixos/modules/services/networking/chrony.nix
index 5e9818858e0ca5811b24d9caf38d5d881c9a7025..d1684dd9f05db09ba8c43c25c5f3cfc1337536f1 100644
--- a/nixos/modules/services/networking/chrony.nix
+++ b/nixos/modules/services/networking/chrony.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/cjdns.nix b/nixos/modules/services/networking/cjdns.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9306ffd5a18a0028e9169d98c8269819fd209dc5
--- /dev/null
+++ b/nixos/modules/services/networking/cjdns.nix
@@ -0,0 +1,207 @@
+# You may notice the commented out sections in this file,
+# it would be great to configure cjdns from nix, but cjdns
+# reads its configuration from stdin, including the private
+# key and admin password, all nested in a JSON structure.
+#
+# Until a good method of storing the keys outside the nix
+# store and mixing them back into a string is devised
+# (without too much shell hackery), a skeleton of the
+# configuration building lies commented out.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.cjdns;
+
+ /*
+ # can't keep keys and passwords in the nix store,
+ # but don't want to deal with this stdin quagmire.
+
+ cjdrouteConf = '' {
+ "admin": {"bind": "${cfg.admin.bind}", "password": "\${CJDNS_ADMIN}" },
+ "privateKey": "\${CJDNS_KEY}",
+
+ "interfaces": {
+ ''
+
+ + optionalString (cfg.interfaces.udp.bind.address != null) ''
+ "UDPInterface": [ {
+ "bind": "${cfg.interfaces.udp.bind.address}:"''
+ ${if cfg.interfaces.upd.bind.port != null
+ then ${toString cfg.interfaces.udp.bind.port}
+ else ${RANDOM}
+ fi)
+ + '' } ]''
+
+ + (if cfg.interfaces.eth.bind != null then ''
+ "ETHInterface": [ {
+ "bind": "${cfg.interfaces.eth.bind}",
+ "beacon": ${toString cfg.interfaces.eth.beacon}
+ } ]
+ '' fi )
+ + ''
+ },
+ "router": { "interface": { "type": "TUNInterface" }, },
+ "security": [ { "setuser": "nobody" } ]
+ }
+ '';
+
+ cjdrouteConfFile = pkgs.writeText "cjdroute.conf" cjdrouteConf
+ */
+in
+
+{
+ options = {
+
+ services.cjdns = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable this option to start a instance of the
+ cjdns network encryption and and routing engine.
+ Configuration will be read from confFile.
+ '';
+ };
+
+ confFile = mkOption {
+ default = "/etc/cjdroute.conf";
+ description = ''
+ Configuration file to pipe to cjdroute.
+ '';
+ };
+
+ /*
+ admin = {
+ bind = mkOption {
+ default = "127.0.0.1:11234";
+ description = ''
+ Bind the administration port to this address and port.
+ '';
+ };
+
+ passwordFile = mkOption {
+ example = "/root/cjdns.adminPassword";
+ description = ''
+ File containing a password to the administration port.
+ '';
+ };
+ };
+
+ keyFile = mkOption {
+ type = types.str;
+ example = "/root/cjdns.key";
+ description = ''
+ Path to a file containing a cjdns private key on a single line.
+ '';
+ };
+
+ passwordsFile = mkOption {
+ type = types.str;
+ default = null;
+ example = "/root/cjdns.authorizedPasswords";
+ description = ''
+ A file containing a list of json dictionaries with passwords.
+ For example:
+ {"password": "s8xf5z7znl4jt05g922n3wpk75wkypk"},
+ { "name": "nice guy",
+ "password": "xhthk1mglz8tpjrbbvdlhyc092rhpx5"},
+ {"password": "3qfxyhmrht7uwzq29pmhbdm9w4bnc8w"}
+ '';
+ };
+
+ interfaces = {
+ udp = {
+ bind = {
+ address = mkOption {
+ default = "0.0.0.0";
+ description = ''
+ Address to bind UDP tunnels to; disable by setting to null;
+ '';
+ };
+ port = mkOption {
+ type = types.int;
+ default = null;
+ description = ''
+ Port to bind UDP tunnels to.
+ A port will be choosen at random if this is not set.
+ This option is required to act as the server end of
+ a tunnel.
+ '';
+ };
+ };
+ };
+
+ eth = {
+ bind = mkOption {
+ default = null;
+ example = "eth0";
+ description = ''
+ Bind to this device and operate with native wire format.
+ '';
+ };
+
+ beacon = mkOption {
+ default = 2;
+ description = ''
+ Auto-connect to other cjdns nodes on the same network.
+ Options:
+ 0 -- Disabled.
+
+ 1 -- Accept beacons, this will cause cjdns to accept incoming
+ beacon messages and try connecting to the sender.
+
+ 2 -- Accept and send beacons, this will cause cjdns to broadcast
+ messages on the local network which contain a randomly
+ generated per-session password, other nodes which have this
+ set to 1 or 2 will hear the beacon messages and connect
+ automatically.
+ '';
+ };
+
+ connectTo = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Credentials for connecting look similar to UDP credientials
+ except they begin with the mac address, for example:
+ "01:02:03:04:05:06":{"password":"a","publicKey":"b"}
+ '';
+ };
+ };
+ };
+ */
+ };
+ };
+
+ config = mkIf config.services.cjdns.enable {
+
+ boot.kernelModules = [ "tun" ];
+
+ /*
+ networking.firewall.allowedUDPPorts = mkIf (cfg.udp.bind.port != null) [
+ cfg.udp.bind.port
+ ];
+ */
+
+ systemd.services.cjdns = {
+ description = "encrypted networking for everybody";
+ wantedBy = [ "multi-user.target" ];
+ wants = [ "network.target" ];
+ before = [ "network.target" ];
+ path = [ pkgs.cjdns ];
+
+ serviceConfig = {
+ Type = "forking";
+ ExecStart = ''
+ ${pkgs.stdenv.shell} -c "${pkgs.cjdns}/sbin/cjdroute < ${cfg.confFile}"
+ '';
+ Restart = "on-failure";
+ };
+ };
+ };
+}
diff --git a/nixos/modules/services/networking/cntlm.nix b/nixos/modules/services/networking/cntlm.nix
index 96396878afc919874143b544158b2be01006fcb9..a50aa4d0636b170c5f670197772e951fda5a9f84 100644
--- a/nixos/modules/services/networking/cntlm.nix
+++ b/nixos/modules/services/networking/cntlm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -34,7 +34,7 @@ in
password = mkOption {
default = "/etc/cntlm.password";
- type = with pkgs.lib.types; string;
+ type = types.str;
description = ''Proxy account password. Note: use chmod 0600 on /etc/cntlm.password for security.'';
};
diff --git a/nixos/modules/services/networking/connman.nix b/nixos/modules/services/networking/connman.nix
index 2b26fe88129b2c7d18f0d13af10102f639fe4183..7ed1e4805d8f940d0c30f1f82aadd5173ff36597 100644
--- a/nixos/modules/services/networking/connman.nix
+++ b/nixos/modules/services/networking/connman.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
with pkgs;
let
diff --git a/nixos/modules/services/networking/dhcpcd.nix b/nixos/modules/services/networking/dhcpcd.nix
index 08a5d6de6a2bad8df048e4c0a8d803dbf197f86b..35a3cfff8406d7541b95398a927ba03e85ea7fcc 100644
--- a/nixos/modules/services/networking/dhcpcd.nix
+++ b/nixos/modules/services/networking/dhcpcd.nix
@@ -1,10 +1,10 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
- inherit (pkgs) dhcpcd;
+ dhcpcd = if !config.boot.isContainer then pkgs.dhcpcd else pkgs.dhcpcd.override { udev = null; };
# Don't start dhcpcd on explicitly configured interfaces or on
# interfaces that are part of a bridge.
@@ -34,8 +34,9 @@ let
# Ignore peth* devices; on Xen, they're renamed physical
# Ethernet cards used for bridging. Likewise for vif* and tap*
- # (Xen) and virbr* and vnet* (libvirt).
- denyinterfaces ${toString ignoredInterfaces} peth* vif* tap* tun* virbr* vnet* vboxnet*
+ # (Xen) and virbr* and vnet* (libvirt) and c-* and ctmp-* (NixOS
+ # containers).
+ denyinterfaces ${toString ignoredInterfaces} peth* vif* tap* tun* virbr* vnet* vboxnet* c-* ctmp-*
${config.networking.dhcpcd.extraConfig}
'';
@@ -79,6 +80,7 @@ in
options = {
networking.dhcpcd.denyInterfaces = mkOption {
+ type = types.listOf types.str;
default = [];
description = ''
Disable the DHCP client for any interface whose name matches
@@ -89,6 +91,7 @@ in
};
networking.dhcpcd.extraConfig = mkOption {
+ type = types.lines;
default = "";
description = ''
Literal string to append to the config file generated for dhcpcd.
@@ -106,7 +109,7 @@ in
{ description = "DHCP Client";
wantedBy = [ "network.target" ];
- after = [ "systemd-udev-settle.service" ];
+ after = [ "systemd-udev-settle.service" ]; # FIXME
# Stopping dhcpcd during a reconfiguration is undesirable
# because it brings down the network interfaces configured by
diff --git a/nixos/modules/services/networking/dhcpd.nix b/nixos/modules/services/networking/dhcpd.nix
index 5b2058e4e12967e8734614d79dba69b5a2858ec9..89f686c28703d37743fbc5e49f280e68923115a9 100644
--- a/nixos/modules/services/networking/dhcpd.nix
+++ b/nixos/modules/services/networking/dhcpd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/dnsmasq.nix b/nixos/modules/services/networking/dnsmasq.nix
index b726493d421fbe4218b14fc85192be35b03798ed..8e38b9d017a3ae5f9186f01b9c2df2a10c521a7f 100644
--- a/nixos/modules/services/networking/dnsmasq.nix
+++ b/nixos/modules/services/networking/dnsmasq.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.dnsmasq;
diff --git a/nixos/modules/services/networking/ejabberd.nix b/nixos/modules/services/networking/ejabberd.nix
index 8a01c217eb5cbfe7dda178c94546e99fefa78b92..28b8e234a5cf5695d885fdb5ad233c0291762a50 100644
--- a/nixos/modules/services/networking/ejabberd.nix
+++ b/nixos/modules/services/networking/ejabberd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/firewall.nix b/nixos/modules/services/networking/firewall.nix
index 3c0c51e6ec8a8bef30946552ecc384b15e39fd28..42914bfe5d62ad82aa02d3617d36c68812b7ac6f 100644
--- a/nixos/modules/services/networking/firewall.nix
+++ b/nixos/modules/services/networking/firewall.nix
@@ -18,11 +18,9 @@
*/
+{ config, lib, pkgs, ... }:
-
-{ config, pkgs, ... }:
-
-with pkgs.lib;
+with lib;
let
@@ -32,9 +30,9 @@ let
''
# Helper command to manipulate both the IPv4 and IPv6 tables.
ip46tables() {
- iptables "$@"
+ iptables -w "$@"
${optionalString config.networking.enableIPv6 ''
- ip6tables "$@"
+ ip6tables -w "$@"
''}
}
'';
@@ -54,7 +52,7 @@ in
networking.firewall.enable = mkOption {
type = types.bool;
- default = false;
+ default = true;
description =
''
Whether to enable the firewall. This is a simple stateful
@@ -128,6 +126,17 @@ in
'';
};
+ networking.firewall.allowedTCPPortRanges = mkOption {
+ default = [];
+ example = [ { from = 8999; to = 9003; } ];
+ type = types.listOf (types.attrsOf types.int);
+ description =
+ ''
+ A range of TCP ports on which incoming connections are
+ accepted.
+ '';
+ };
+
networking.firewall.allowedUDPPorts = mkOption {
default = [];
example = [ 53 ];
@@ -138,6 +147,16 @@ in
'';
};
+ networking.firewall.allowedUDPPortRanges = mkOption {
+ default = [];
+ example = [ { from = 60000; to = 61000; } ];
+ type = types.listOf (types.attrsOf types.int);
+ description =
+ ''
+ Range of open UDP ports.
+ '';
+ };
+
networking.firewall.allowPing = mkOption {
default = false;
type = types.bool;
@@ -150,6 +169,17 @@ in
'';
};
+ networking.firewall.pingLimit = mkOption {
+ default = null;
+ type = types.nullOr (types.separatedString " ");
+ description =
+ ''
+ If pings are allowed, this allows setting rate limits
+ on them. If non-null, this option should be in the form
+ of flags like "-limit 1/minute -limit-burst 5"
+ '';
+ };
+
networking.firewall.checkReversePath = mkOption {
default = kernelHasRPFilter;
type = types.bool;
@@ -234,14 +264,23 @@ in
message = "This kernel does not support disabling conntrack helpers"; }
];
- jobs.firewall =
+ systemd.services.firewall =
{ description = "Firewall";
- startOn = "started network-interfaces";
+ wantedBy = [ "network.target" ];
+ after = [ "network-interfaces.target" "systemd-modules-load.service" ];
path = [ pkgs.iptables ];
- preStart =
+ # FIXME: this module may also try to load kernel modules, but
+ # containers don't have CAP_SYS_MODULE. So the host system had
+ # better have all necessary modules already loaded.
+ unitConfig.ConditionCapability = "CAP_NET_ADMIN";
+
+ serviceConfig.Type = "oneshot";
+ serviceConfig.RemainAfterExit = true;
+
+ script =
''
${helpers}
@@ -322,6 +361,15 @@ in
) cfg.allowedTCPPorts
}
+ # Accept connections to the allowed TCP port ranges.
+ ${concatMapStrings (rangeAttr:
+ let range = toString rangeAttr.from + ":" + toString rangeAttr.to; in
+ ''
+ ip46tables -A nixos-fw -p tcp --dport ${range} -j nixos-fw-accept
+ ''
+ ) cfg.allowedTCPPortRanges
+ }
+
# Accept packets on the allowed UDP ports.
${concatMapStrings (port:
''
@@ -330,13 +378,24 @@ in
) cfg.allowedUDPPorts
}
+ # Accept packets on the allowed UDP port ranges.
+ ${concatMapStrings (rangeAttr:
+ let range = toString rangeAttr.from + ":" + toString rangeAttr.to; in
+ ''
+ ip46tables -A nixos-fw -p udp --dport ${range} -j nixos-fw-accept
+ ''
+ ) cfg.allowedUDPPortRanges
+ }
+
# Accept IPv4 multicast. Not a big security risk since
# probably nobody is listening anyway.
#iptables -A nixos-fw -d 224.0.0.0/4 -j nixos-fw-accept
# Optionally respond to ICMPv4 pings.
${optionalString cfg.allowPing ''
- iptables -A nixos-fw -p icmp --icmp-type echo-request -j nixos-fw-accept
+ iptables -w -A nixos-fw -p icmp --icmp-type echo-request ${optionalString (cfg.pingLimit != null)
+ "-m limit ${cfg.pingLimit} "
+ }-j nixos-fw-accept
''}
# Accept all ICMPv6 messages except redirects and node
diff --git a/nixos/modules/services/networking/flashpolicyd.nix b/nixos/modules/services/networking/flashpolicyd.nix
index f5bc550ab5f8f9ac98177eabe779a58bca538418..5ba85178179bfcf22a30fa7f4012724bcefdff08 100644
--- a/nixos/modules/services/networking/flashpolicyd.nix
+++ b/nixos/modules/services/networking/flashpolicyd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/freenet.nix b/nixos/modules/services/networking/freenet.nix
index a4bd2098986dd1353f82ea2ac302531f700ec01c..e9cacf4a16e8ba8ed04fd5d3f2c0cf44b55713eb 100644
--- a/nixos/modules/services/networking/freenet.nix
+++ b/nixos/modules/services/networking/freenet.nix
@@ -1,8 +1,8 @@
# NixOS module for Freenet daemon
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/git-daemon.nix b/nixos/modules/services/networking/git-daemon.nix
index a7c7c206198ff1762f8cd4197367cc335d3e8880..5864efaca51ff4387e1253b55bf31def78ceba80 100644
--- a/nixos/modules/services/networking/git-daemon.nix
+++ b/nixos/modules/services/networking/git-daemon.nix
@@ -1,5 +1,5 @@
-{pkgs, config, ...}:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.gitDaemon;
@@ -101,7 +101,7 @@ in
name = "git-daemon";
startOn = "ip-up";
exec = "${pkgs.git}/bin/git daemon --reuseaddr "
- + (optionalString (cfg.basePath != "") "--basepath=${cfg.basePath} ")
+ + (optionalString (cfg.basePath != "") "--base-path=${cfg.basePath} ")
+ (optionalString (cfg.listenAddress != "") "--listen=${cfg.listenAddress} ")
+ "--port=${toString cfg.port} --user=${gitUser} --group=${gitUser} ${cfg.options} "
+ "--verbose " + (optionalString cfg.exportAll "--export-all") + concatStringsSep " " cfg.repositories;
diff --git a/nixos/modules/services/networking/gnunet.nix b/nixos/modules/services/networking/gnunet.nix
index 421c0d9bb697517c723e43a0d21b8a14289427b8..03ee54af43342c95eddb9a14fde0a3e04c2cd1d8 100644
--- a/nixos/modules/services/networking/gnunet.nix
+++ b/nixos/modules/services/networking/gnunet.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/gogoclient.nix b/nixos/modules/services/networking/gogoclient.nix
index 3b92eb8b06bd8b3625151f9259b190d02d09bb34..4160079419766b9dafe465a2c14de3f1667970d1 100644
--- a/nixos/modules/services/networking/gogoclient.nix
+++ b/nixos/modules/services/networking/gogoclient.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.services.gogoclient;
in
diff --git a/nixos/modules/services/networking/haproxy.nix b/nixos/modules/services/networking/haproxy.nix
index c8345a528a72ed20a91e122795f4f1a1f2eae485..c2e2c2d7a4181e1ac3308394912fa54af86bd63a 100644
--- a/nixos/modules/services/networking/haproxy.nix
+++ b/nixos/modules/services/networking/haproxy.nix
@@ -1,9 +1,9 @@
-{ config, pkgs, ...}:
+{ config, lib, pkgs, ... }:
let
cfg = config.services.haproxy;
haproxyCfg = pkgs.writeText "haproxy.conf" cfg.config;
in
-with pkgs.lib;
+with lib;
{
options = {
services.haproxy = {
diff --git a/nixos/modules/services/networking/hostapd.nix b/nixos/modules/services/networking/hostapd.nix
index 4edea12b6be8441c07e8b1e09a89e18b77e88abd..2adbb0a5c4e384cb1a9952fdd4eca62008b9d732 100644
--- a/nixos/modules/services/networking/hostapd.nix
+++ b/nixos/modules/services/networking/hostapd.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
# TODO:
#
@@ -9,7 +9,7 @@
# wpa_supplicant and hostapd on the same wireless interface doesn't make any sense
# perhaps an assertion that there is a dhcp server and a dns server on the IP address serviced by the hostapd?
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/ifplugd.nix b/nixos/modules/services/networking/ifplugd.nix
index 4e939d603542350dbfbc13937ff08f8267461a01..20bfca8f8723a3bf81341764362c4c63dcb9f2cf 100644
--- a/nixos/modules/services/networking/ifplugd.nix
+++ b/nixos/modules/services/networking/ifplugd.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/iodined.nix b/nixos/modules/services/networking/iodined.nix
index cd150fe63fd39a208354a387dd202185488466c4..bc0fbb42c99deb926404b5b60cde222a5621ba23 100644
--- a/nixos/modules/services/networking/iodined.nix
+++ b/nixos/modules/services/networking/iodined.nix
@@ -1,8 +1,8 @@
# NixOS module for iodine, ip over dns daemon
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.iodined;
diff --git a/nixos/modules/services/networking/ircd-hybrid/default.nix b/nixos/modules/services/networking/ircd-hybrid/default.nix
index cd82a41ef7af9c64a023c62056e28569ff40b3c3..a3d5b71740f6c3ee152cdbb5940b804dd18db37b 100644
--- a/nixos/modules/services/networking/ircd-hybrid/default.nix
+++ b/nixos/modules/services/networking/ircd-hybrid/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/kippo.nix b/nixos/modules/services/networking/kippo.nix
index 76dd66013ba75d2532f4a9aeb8abcebb3b1008c0..d2045c9efc58f32911c917a37f04b99d985a25a9 100644
--- a/nixos/modules/services/networking/kippo.nix
+++ b/nixos/modules/services/networking/kippo.nix
@@ -6,8 +6,8 @@
# iptables -t nat -A PREROUTING -i IN_IFACE -p tcp --dport 22 -j REDIRECT --to-port 2222'';
#
# Lastly: use this service at your own risk. I am working on a way to run this inside a VM.
-{ pkgs, config, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.kippo;
in
@@ -76,8 +76,9 @@ rec {
users.extraUsers = singleton {
name = "kippo";
description = "kippo web server privilege separation user";
+ uid = 108; # why does config.ids.uids.kippo give an error?
};
- users.extraGroups = singleton { name = "kippo"; };
+ users.extraGroups = singleton { name = "kippo";gid=108; };
systemd.services.kippo = with pkgs; {
description = "Kippo Web Server";
diff --git a/nixos/modules/services/networking/minidlna.nix b/nixos/modules/services/networking/minidlna.nix
index 73fcb1eeea8e4a936fcc0aa5bc7547f56ef898ec..a519857d6a0b04c2bda32589b01070456465df1e 100644
--- a/nixos/modules/services/networking/minidlna.nix
+++ b/nixos/modules/services/networking/minidlna.nix
@@ -1,8 +1,8 @@
# Module for MiniDLNA, a simple DLNA server.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/murmur.nix b/nixos/modules/services/networking/murmur.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4f91a4947479c0541623f8387daa9bbe6c2007ac
--- /dev/null
+++ b/nixos/modules/services/networking/murmur.nix
@@ -0,0 +1,253 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.murmur;
+ configFile = pkgs.writeText "murmurd.ini" ''
+ database=/var/lib/murmur/murmur.sqlite
+ dbDriver=QSQLITE
+
+ autobanAttempts=${toString cfg.autobanAttempts}
+ autobanTimeframe=${toString cfg.autobanTimeframe}
+ autobanTime=${toString cfg.autobanTime}
+
+ logfile=/var/log/murmur/murmurd.log
+ pidfile=${cfg.pidfile}
+
+ welcome="${cfg.welcome}"
+ port=${toString cfg.port}
+
+ ${if cfg.hostName == "" then "" else "host="+cfg.hostName}
+ ${if cfg.password == "" then "" else "serverpassword="+cfg.password}
+
+ bandwidth=${toString cfg.bandwidth}
+ users=${toString cfg.users}
+
+ textmessagelength=${toString cfg.textMsgLength}
+ imagemessagelength=${toString cfg.imgMsgLength}
+ allowhtml=${if cfg.allowHtml then "true" else "false"}
+ logdays=${toString cfg.logDays}
+ bonjour=${if cfg.bonjour then "true" else "false"}
+ sendversion=${if cfg.sendVersion then "true" else "false"}
+
+ ${if cfg.registerName == "" then "" else "registerName="+cfg.registerName}
+ ${if cfg.registerPassword == "" then "" else "registerPassword="+cfg.registerPassword}
+ ${if cfg.registerUrl == "" then "" else "registerUrl="+cfg.registerUrl}
+ ${if cfg.registerHostname == "" then "" else "registerHostname="+cfg.registerHostname}
+
+ certrequired=${if cfg.clientCertRequired then "true" else "false"}
+ ${if cfg.sslCert == "" then "" else "sslCert="+cfg.sslCert}
+ ${if cfg.sslKey == "" then "" else "sslKey="+cfg.sslKey}
+ '';
+in
+{
+ options = {
+ services.murmur = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = "If enabled, start the Murmur Service.";
+ };
+
+ autobanAttempts = mkOption {
+ type = types.int;
+ default = 10;
+ description = ''
+ Number of attempts a client is allowed to make in
+ autobanTimeframe seconds, before being
+ banned for autobanTime.
+ '';
+ };
+
+ autobanTimeframe = mkOption {
+ type = types.int;
+ default = 120;
+ description = ''
+ Timeframe in which a client can connect without being banned
+ for repeated attempts (in seconds).
+ '';
+ };
+
+ autobanTime = mkOption {
+ type = types.int;
+ default = 300;
+ description = "The amount of time an IP ban lasts (in seconds).";
+ };
+
+ pidfile = mkOption {
+ type = types.path;
+ default = "/tmp/murmurd.pid";
+ description = "Path to PID file for Murmur daemon.";
+ };
+
+ welcome = mkOption {
+ type = types.str;
+ default = "";
+ description = "Welcome message for connected clients.";
+ };
+
+ port = mkOption {
+ type = types.int;
+ default = 64738;
+ description = "Ports to bind to (UDP and TCP).";
+ };
+
+ hostName = mkOption {
+ type = types.str;
+ default = "";
+ description = "Host to bind to. Defaults binding on all addresses.";
+ };
+
+ password = mkOption {
+ type = types.str;
+ default = "";
+ description = "Required password to join server, if specified.";
+ };
+
+ bandwidth = mkOption {
+ type = types.int;
+ default = 72000;
+ description = ''
+ Maximum bandwidth (in bits per second) that clients may send
+ speech at.
+ '';
+ };
+
+ users = mkOption {
+ type = types.int;
+ default = 100;
+ description = "Maximum number of concurrent clients allowed.";
+ };
+
+ textMsgLength = mkOption {
+ type = types.int;
+ default = 5000;
+ description = "Max length of text messages. Set 0 for no limit.";
+ };
+
+ imgMsgLength = mkOption {
+ type = types.int;
+ default = 131072;
+ description = "Max length of image messages. Set 0 for no limit.";
+ };
+
+ allowHtml = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Allow HTML in client messages, comments, and channel
+ descriptions.
+ '';
+ };
+
+ logDays = mkOption {
+ type = types.int;
+ default = 31;
+ description = ''
+ How long to store RPC logs for in the database. Set 0 to
+ keep logs forever, or -1 to disable DB logging.
+ '';
+ };
+
+ bonjour = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable Bonjour auto-discovery, which allows clients over
+ your LAN to automatically discover Murmur servers.
+ '';
+ };
+
+ sendVersion = mkOption {
+ type = types.bool;
+ default = true;
+ description = "Send Murmur version in UDP response.";
+ };
+
+ registerName = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ Public server registration name, and also the name of the
+ Root channel. Even if you don't publicly register your
+ server, you probably still want to set this.
+ '';
+ };
+
+ registerPassword = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ Public server registry password, used authenticate your
+ server to the registry to prevent impersonation; required for
+ subsequent registry updates.
+ '';
+ };
+
+ registerUrl = mkOption {
+ type = types.str;
+ default = "";
+ description = "URL website for your server.";
+ };
+
+ registerHostname = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ DNS hostname where your server can be reached. This is only
+ needed if you want your server to be accessed by its
+ hostname and not IP - but the name *must* resolve on the
+ internet properly.
+ '';
+ };
+
+ clientCertRequired = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Require clients to authenticate via certificates.";
+ };
+
+ sslCert = mkOption {
+ type = types.str;
+ default = "";
+ description = "Path to your SSL certificate.";
+ };
+
+ sslKey = mkOption {
+ type = types.str;
+ default = "";
+ description = "Path to your SSL key.";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.extraUsers.murmur = {
+ description = "Murmur Service user";
+ home = "/var/lib/murmur";
+ createHome = true;
+ uid = config.ids.uids.murmur;
+ };
+
+ systemd.services.murmur = {
+ description = "Murmur Chat Service";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target "];
+
+ serviceConfig = {
+ Type = "forking";
+ PIDFile = cfg.pidfile;
+ Restart = "always";
+ User = "murmur";
+ ExecStart = "${pkgs.murmur}/bin/murmurd -ini ${configFile}";
+ PermissionsStartOnly = true;
+ };
+
+ preStart = ''
+ mkdir -p /var/log/murmur
+ chown -R murmur /var/log/murmur
+ '';
+ };
+ };
+}
diff --git a/nixos/modules/services/networking/nat.nix b/nixos/modules/services/networking/nat.nix
index ce28f018828418bc3e4ba0172a03291be7db9c56..e8d9d00cc0a20eaa7b998c5249b87239dc151296 100644
--- a/nixos/modules/services/networking/nat.nix
+++ b/nixos/modules/services/networking/nat.nix
@@ -2,14 +2,16 @@
# XXX: todo: support multiple upstream links
# see http://yesican.chsoft.biz/lartc/MultihomedLinuxNetworking.html
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.networking.nat;
+ dest = if cfg.externalIP == null then "-j MASQUERADE" else "-j SNAT --to-source ${cfg.externalIP}";
+
in
{
@@ -27,14 +29,27 @@ in
'';
};
+ networking.nat.internalInterfaces = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = [ "eth0" ];
+ description =
+ ''
+ The interfaces for which to perform NAT. Packets coming from
+ these interface and destined for the external interface will
+ be rewritten.
+ '';
+ };
+
networking.nat.internalIPs = mkOption {
type = types.listOf types.str;
- example = [ "192.168.1.0/24" ] ;
+ default = [];
+ example = [ "192.168.1.0/24" ];
description =
''
The IP address ranges for which to perform NAT. Packets
- coming from these networks and destined for the external
- interface will be rewritten.
+ coming from these addresses (on any interface) and destined
+ for the external interface will be rewritten.
'';
};
@@ -80,25 +95,37 @@ in
preStart =
''
- iptables -t nat -F POSTROUTING
- iptables -t nat -X
- ''
- + (concatMapStrings (network:
- ''
- iptables -t nat -A POSTROUTING \
- -s ${network} -o ${cfg.externalInterface} \
- ${if cfg.externalIP == null
- then "-j MASQUERADE"
- else "-j SNAT --to-source ${cfg.externalIP}"}
- ''
- ) cfg.internalIPs) +
- ''
+ iptables -w -t nat -F PREROUTING
+ iptables -w -t nat -F POSTROUTING
+ iptables -w -t nat -X
+
+ # We can't match on incoming interface in POSTROUTING, so
+ # mark packets coming from the external interfaces.
+ ${concatMapStrings (iface: ''
+ iptables -w -t nat -A PREROUTING \
+ -i '${iface}' -j MARK --set-mark 1
+ '') cfg.internalInterfaces}
+
+ # NAT the marked packets.
+ ${optionalString (cfg.internalInterfaces != []) ''
+ iptables -w -t nat -A POSTROUTING -m mark --mark 1 \
+ -o ${cfg.externalInterface} ${dest}
+ ''}
+
+ # NAT packets coming from the internal IPs.
+ ${concatMapStrings (range: ''
+ iptables -w -t nat -A POSTROUTING \
+ -s '${range}' -o ${cfg.externalInterface} ${dest}
+ '') cfg.internalIPs}
+
echo 1 > /proc/sys/net/ipv4/ip_forward
'';
postStop =
''
- iptables -t nat -F POSTROUTING
+ iptables -w -t nat -F PREROUTING
+ iptables -w -t nat -F POSTROUTING
+ iptables -w -t nat -X
'';
};
};
diff --git a/nixos/modules/services/networking/networkmanager.nix b/nixos/modules/services/networking/networkmanager.nix
index 40c20aae4ef07a7cd13290f5ac9ea8e4e14b35b2..54bdf19373d59f3300189dc14ca932057d802cb1 100644
--- a/nixos/modules/services/networking/networkmanager.nix
+++ b/nixos/modules/services/networking/networkmanager.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
with pkgs;
let
@@ -31,7 +31,7 @@ let
[modem-manager]
Identity=unix-group:networkmanager
- Action=org.freedesktop.ModemManager.*
+ Action=org.freedesktop.ModemManager*
ResultAny=yes
ResultInactive=no
ResultActive=yes
@@ -42,7 +42,7 @@ let
subject.isInGroup("networkmanager")
&& subject.active
&& (action.id.indexOf("org.freedesktop.NetworkManager.") == 0
- || action.id.indexOf("org.freedesktop.ModemManager.") == 0
+ || action.id.indexOf("org.freedesktop.ModemManager") == 0
))
{ return polkit.Result.YES; }
});
@@ -89,7 +89,7 @@ in {
to change network settings to this group.
'';
};
-
+
packages = mkOption {
type = types.listOf types.path;
default = [ ];
@@ -130,6 +130,8 @@ in {
message = "You can not use networking.networkmanager with services.networking.wireless";
}];
+ boot.kernelModules = [ "ppp_mppe" ]; # Needed for most (all?) PPTP VPN connections.
+
environment.etc = [
{ source = ipUpScript;
target = "NetworkManager/dispatcher.d/01nixos-ip-up";
@@ -159,6 +161,7 @@ in {
networkmanager_vpnc
networkmanager_openconnect
networkmanager_pptp
+ modemmanager
];
users.extraGroups = singleton {
@@ -174,16 +177,13 @@ in {
systemd.services."networkmanager-init" = {
description = "NetworkManager initialisation";
wantedBy = [ "network.target" ];
- partOf = [ "NetworkManager.service" ];
wants = [ "NetworkManager.service" ];
before = [ "NetworkManager.service" ];
script = ''
mkdir -m 700 -p /etc/NetworkManager/system-connections
mkdir -m 755 -p ${stateDirs}
'';
- serviceConfig = {
- Type = "oneshot";
- };
+ serviceConfig.Type = "oneshot";
};
# Turn off NixOS' network management
@@ -204,6 +204,7 @@ in {
networkmanager_vpnc
networkmanager_openconnect
networkmanager_pptp
+ modemmanager
];
services.udev.packages = cfg.packages;
diff --git a/nixos/modules/services/networking/ngircd.nix b/nixos/modules/services/networking/ngircd.nix
new file mode 100644
index 0000000000000000000000000000000000000000..49e5f35598030d5112beec1a5d591a013c3ecac5
--- /dev/null
+++ b/nixos/modules/services/networking/ngircd.nix
@@ -0,0 +1,58 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.ngircd;
+
+ configFile = pkgs.stdenv.mkDerivation {
+ name = "ngircd.conf";
+
+ text = cfg.config;
+
+ preferLocalBuild = true;
+
+ buildCommand = ''
+ echo -n "$text" > $out
+ ${cfg.package}/sbin/ngircd --config $out --configtest
+ '';
+ };
+in {
+ options = {
+ services.ngircd = {
+ enable = mkEnableOption "the ngircd IRC server";
+
+ config = mkOption {
+ description = "The ngircd configuration (see ngircd.conf(5)).";
+
+ type = types.lines;
+ };
+
+ package = mkOption {
+ description = "The ngircd package.";
+
+ type = types.package;
+
+ default = pkgs.ngircd;
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ #!!! TODO: Use ExecReload (see https://github.com/NixOS/nixpkgs/issues/1988)
+ systemd.services.ngircd = {
+ description = "The ngircd IRC server";
+
+ wantedBy = [ "multi-user.target" ];
+
+ serviceConfig.ExecStart = "${cfg.package}/sbin/ngircd --config ${configFile} --nodaemon";
+
+ serviceConfig.User = "ngircd";
+ };
+
+ users.extraUsers.ngircd = {
+ uid = config.ids.uids.ngircd;
+ description = "ngircd user.";
+ };
+ };
+}
diff --git a/nixos/modules/services/networking/notbit.nix b/nixos/modules/services/networking/notbit.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b97435042395783b53a9c9572ae01e04362642f9
--- /dev/null
+++ b/nixos/modules/services/networking/notbit.nix
@@ -0,0 +1,93 @@
+{ config, lib, pkgs, ... }:
+
+let
+ cfg = config.services.notbit;
+ varDir = "/var/lib/notbit";
+
+ sendmail = pkgs.stdenv.mkDerivation {
+ name = "notbit-wrapper";
+ buildInputs = [ pkgs.makeWrapper ];
+ propagatedBuildInputs = [ pkgs.notbit ];
+ buildCommand = ''
+ mkdir -p $out/bin
+ makeWrapper ${pkgs.notbit}/bin/notbit-sendmail $out/bin/notbit-system-sendmail \
+ --set XDG_RUNTIME_DIR ${varDir}
+ '';
+ };
+in
+
+with lib;
+{
+
+ ### configuration
+
+ options = {
+
+ services.notbit = {
+
+ enable = mkOption {
+ type = types.uniq types.bool;
+ default = false;
+ description = ''
+ Enables the notbit daemon and provides a sendmail binary named `notbit-system-sendmail` for sending mail over the system instance of notbit. Users must be in the notbit group in order to send mail over the system notbit instance. Currently mail recipt is not supported.
+ '';
+ };
+
+ port = mkOption {
+ type = types.uniq types.int;
+ default = 8443;
+ description = "The port which the daemon listens for other bitmessage clients";
+ };
+
+ nice = mkOption {
+ type = types.uniq types.int;
+ default = 10;
+ description = "Set the nice level for the notbit daemon";
+ };
+
+ };
+
+ };
+
+ ### implementation
+
+ config = mkIf cfg.enable {
+
+ environment.systemPackages = [ pkgs.notbit sendmail ];
+
+ systemd.services.notbit = {
+ description = "Notbit daemon";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ path = [ pkgs.notbit ];
+ environment = { XDG_RUNTIME_DIR = varDir; };
+
+ postStart = ''
+ [ ! -f "${varDir}/addr" ] && notbit-keygen > ${varDir}/addr
+ chmod 0640 ${varDir}/{addr,notbit/notbit-ipc.lock}
+ chmod 0750 ${varDir}/notbit/{,notbit-ipc}
+ '';
+
+ serviceConfig = {
+ Type = "forking";
+ ExecStart = "${pkgs.notbit}/bin/notbit -d -p ${toString cfg.port}";
+ User = "notbit";
+ Group = "notbit";
+ UMask = "0077";
+ WorkingDirectory = varDir;
+ Nice = cfg.nice;
+ };
+ };
+
+ users.extraUsers.notbit = {
+ group = "notbit";
+ description = "Notbit daemon user";
+ home = varDir;
+ createHome = true;
+ uid = config.ids.uids.notbit;
+ };
+
+ users.extraGroups.notbit.gid = config.ids.gids.notbit;
+ };
+
+}
diff --git a/nixos/modules/services/networking/ntopng.nix b/nixos/modules/services/networking/ntopng.nix
index 156a6b32a6abac09c25008b7695cbfe9d0f0642a..ab86f1a5b2b4aa1eae76098a6172d1d219a7a579 100644
--- a/nixos/modules/services/networking/ntopng.nix
+++ b/nixos/modules/services/networking/ntopng.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/ntpd.nix b/nixos/modules/services/networking/ntpd.nix
index e5e164021d3a1faa7b3ed87f7b067401303a17c7..2f638904406b212ed3bbe5514e3e852831ce0d53 100644
--- a/nixos/modules/services/networking/ntpd.nix
+++ b/nixos/modules/services/networking/ntpd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -15,6 +15,11 @@ let
# chroot to ${stateDir}, we have to specify it as /ntp.drift.
driftfile /ntp.drift
+ restrict default kod nomodify notrap nopeer noquery
+ restrict -6 default kod nomodify notrap nopeer noquery
+ restrict 127.0.0.1
+ restrict -6 ::1
+
${toString (map (server: "server " + server + " iburst\n") config.services.ntp.servers)}
'';
@@ -31,7 +36,7 @@ in
services.ntp = {
enable = mkOption {
- default = true;
+ default = !config.boot.isContainer;
description = ''
Whether to synchronise your machine's time using the NTP
protocol.
diff --git a/nixos/modules/services/networking/oidentd.nix b/nixos/modules/services/networking/oidentd.nix
index a2a555a8ad1b76471a555162e1f324a6e50940b0..923e7cd0986e33d9028d7d9b0464089ffa53d4dd 100644
--- a/nixos/modules/services/networking/oidentd.nix
+++ b/nixos/modules/services/networking/oidentd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/networking/openfire.nix b/nixos/modules/services/networking/openfire.nix
index b2efb5e9c1230a3f13200d17381e89d1b9bcd980..c3b4ba90b4e77e5864ac8d3bb99202281645452c 100644
--- a/nixos/modules/services/networking/openfire.nix
+++ b/nixos/modules/services/networking/openfire.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/openvpn.nix b/nixos/modules/services/networking/openvpn.nix
index 292d45f434752fcb01d906f96ca8ea5e5518ae1d..e3998b1e5b28f1b205bec26366c0add592e7484f 100644
--- a/nixos/modules/services/networking/openvpn.nix
+++ b/nixos/modules/services/networking/openvpn.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/prayer.nix b/nixos/modules/services/networking/prayer.nix
index fb541bf101ae8065eac7dff57e49838dac99ce20..ad0fb0af01cb9d55512801e3b6ad911149828b98 100644
--- a/nixos/modules/services/networking/prayer.nix
+++ b/nixos/modules/services/networking/prayer.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/privoxy.nix b/nixos/modules/services/networking/privoxy.nix
index 89c40c53157936aecc6ae305a219fd81f74b8d20..950112b2dabe4ab9ae05b3ec324c8337113e585e 100644
--- a/nixos/modules/services/networking/privoxy.nix
+++ b/nixos/modules/services/networking/privoxy.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/quassel.nix b/nixos/modules/services/networking/quassel.nix
index f3a4e457ec847df384e4abaa5eb311fb09d1085c..749e5dcebb6160b57239a0a101f99dbf59357f2f 100644
--- a/nixos/modules/services/networking/quassel.nix
+++ b/nixos/modules/services/networking/quassel.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
quassel = pkgs.kde4.quasselDaemon;
diff --git a/nixos/modules/services/networking/radvd.nix b/nixos/modules/services/networking/radvd.nix
index 8d586ce6e46b165ab76466c717465861d1281b32..08762c9c8372b7abc14410afa90ee825cccbc9b8 100644
--- a/nixos/modules/services/networking/radvd.nix
+++ b/nixos/modules/services/networking/radvd.nix
@@ -1,8 +1,8 @@
# Module for the IPv6 Router Advertisement Daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/rdnssd.nix b/nixos/modules/services/networking/rdnssd.nix
index f797206ad5c768e986ca4ffc1707725b2e96c564..4c1891816e3ee60ce5cb8553d834d45cd782c04f 100644
--- a/nixos/modules/services/networking/rdnssd.nix
+++ b/nixos/modules/services/networking/rdnssd.nix
@@ -1,9 +1,9 @@
# Module for rdnssd, a daemon that configures DNS servers in
# /etc/resolv/conf from IPv6 RDNSS advertisements.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/networking/rpcbind.nix b/nixos/modules/services/networking/rpcbind.nix
index c966f85e260dbefbae51bc60dcad34079a612e46..eef1e8e8cd889e57566ccae4d1105bab70d52d19 100644
--- a/nixos/modules/services/networking/rpcbind.nix
+++ b/nixos/modules/services/networking/rpcbind.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/sabnzbd.nix b/nixos/modules/services/networking/sabnzbd.nix
index 8816ac0d2f83a12695c8e46843876c181d332449..83db0841b34617fd1a61d1ef2dfe4eafc29d3a2c 100644
--- a/nixos/modules/services/networking/sabnzbd.nix
+++ b/nixos/modules/services/networking/sabnzbd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/searx.nix b/nixos/modules/services/networking/searx.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b29db58af99bf9398d3518dadcb895156259b176
--- /dev/null
+++ b/nixos/modules/services/networking/searx.nix
@@ -0,0 +1,75 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.searx;
+
+ configFile = cfg.configFile;
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.searx = {
+
+ enable = mkOption {
+ default = false;
+ description = "
+ Whether to enable the Searx server. See https://github.com/asciimoo/searx
+ ";
+ };
+
+ configFile = mkOption {
+ default = "";
+ description = "
+ The path of the Searx server configuration file. If no file
+ is specified, a default file is used (default config file has
+ debug mode enabled).
+ ";
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.searx.enable {
+
+ users.extraUsers.searx =
+ { uid = config.ids.uids.searx;
+ description = "Searx user";
+ createHome = true;
+ home = "/var/lib/searx";
+ };
+
+ users.extraGroups.searx =
+ { gid = config.ids.gids.searx;
+ };
+
+ systemd.services.searx =
+ {
+ description = "Searx server, the meta search engine.";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ User = "searx";
+ ExecStart = "${pkgs.pythonPackages.searx}/bin/searx-run";
+ };
+ } // (optionalAttrs (configFile != "") {
+ environment.SEARX_SETTINGS_PATH = configFile;
+ });
+
+
+ environment.systemPackages = [ pkgs.pythonPackages.searx ];
+
+ };
+
+}
diff --git a/nixos/modules/services/networking/spiped.nix b/nixos/modules/services/networking/spiped.nix
new file mode 100644
index 0000000000000000000000000000000000000000..ec5908b182fbf00646819e51e661d8f9af845108
--- /dev/null
+++ b/nixos/modules/services/networking/spiped.nix
@@ -0,0 +1,212 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.spiped;
+in
+{
+ options = {
+ services.spiped = mkOption {
+ type = types.attrsOf (types.submodule (
+ {
+ options = {
+ encrypt = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Take unencrypted connections from the
+ source socket and send encrypted
+ connections to the target socket.
+ '';
+ };
+
+ decrypt = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Take encrypted connections from the
+ source socket and send unencrypted
+ connections to the target socket.
+ '';
+ };
+
+ source = mkOption {
+ type = types.str;
+ description = ''
+ Address on which spiped should listen for incoming
+ connections. Must be in one of the following formats:
+ /absolute/path/to/unix/socket,
+ host.name:port,
+ [ip.v4.ad.dr]:port or
+ [ipv6::addr]:port - note that
+ hostnames are resolved when spiped is launched and are
+ not re-resolved later; thus if DNS entries change
+ spiped will continue to connect to the expired
+ address.
+ '';
+ };
+
+ target = mkOption {
+ type = types.str;
+ description = "Address to which spiped should connect.";
+ };
+
+ keyfile = mkOption {
+ type = types.path;
+ description = ''
+ Name of a file containing the spiped key. As the
+ daemon runs as the spiped user, the
+ key file must be somewhere owned by that user. By
+ default, we recommend putting the keys for any spipe
+ services in /var/lib/spiped.
+ '';
+ };
+
+ timeout = mkOption {
+ type = types.int;
+ default = 5;
+ description = ''
+ Timeout, in seconds, after which an attempt to connect to
+ the target or a protocol handshake will be aborted (and the
+ connection dropped) if not completed
+ '';
+ };
+
+ maxConns = mkOption {
+ type = types.int;
+ default = 100;
+ description = ''
+ Limit on the number of simultaneous connections allowed.
+ '';
+ };
+
+ waitForDNS = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Wait for DNS. Normally when spiped is
+ launched it resolves addresses and binds to its source
+ socket before the parent process returns; with this option
+ it will daemonize first and retry failed DNS lookups until
+ they succeed. This allows spiped to
+ launch even if DNS isn't set up yet, but at the expense of
+ losing the guarantee that once spiped has
+ finished launching it will be ready to create pipes.
+ '';
+ };
+
+ disableKeepalives = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Disable transport layer keep-alives.";
+ };
+
+ weakHandshake = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Use fast/weak handshaking: This reduces the CPU time spent
+ in the initial connection setup, at the expense of losing
+ perfect forward secrecy.
+ '';
+ };
+
+ resolveRefresh = mkOption {
+ type = types.int;
+ default = 60;
+ description = ''
+ Resolution refresh time for the target socket, in seconds.
+ '';
+ };
+
+ disableReresolution = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Disable target address re-resolution.";
+ };
+ };
+ }
+ ));
+
+ default = {};
+
+ example = literalExample ''
+ {
+ pipe1 =
+ { keyfile = "/var/lib/spiped/pipe1.key";
+ encrypt = true;
+ source = "localhost:6000";
+ target = "endpoint.example.com:7000";
+ };
+ pipe2 =
+ { keyfile = "/var/lib/spiped/pipe2.key";
+ decrypt = true;
+ source = "0.0.0.0:7000";
+ target = "localhost:3000";
+ };
+ }
+ '';
+
+ description = ''
+ Configuration for a secure pipe daemon. The daemon can be
+ started, stopped, or examined using
+ systemctl, under the name
+ spiped@foo.
+ '';
+ };
+ };
+
+ config = {
+ assertions = mapAttrsToList (name: c: {
+ assertion = (c.encrypt -> !c.decrypt) || (c.decrypt -> c.encrypt);
+ message = "A pipe must either encrypt or decrypt";
+ }) cfg;
+
+ users.extraGroups.spiped.gid = config.ids.gids.spiped;
+ users.extraUsers.spiped = {
+ description = "Secure Pipe Service user";
+ group = "spiped";
+ uid = config.ids.uids.spiped;
+ };
+
+ systemd.services."spiped@" = {
+ description = "Secure pipe '%i'";
+ after = [ "network.target" ];
+
+ serviceConfig = {
+ Restart = "always";
+ User = "spiped";
+ PermissionsStartOnly = true;
+ };
+
+ preStart = ''
+ cd /var/lib/spiped
+ chmod -R 0660 *
+ chown -R spiped:spiped *
+ '';
+ scriptArgs = "%i";
+ script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/$1.spec`";
+ };
+
+ system.activationScripts.spiped = optionalString (cfg != {})
+ "mkdir -p /var/lib/spiped";
+
+ # Setup spiped config files
+ environment.etc = mapAttrs' (name: cfg: nameValuePair "spiped/${name}.spec"
+ { text = concatStringsSep " "
+ [ (if cfg.encrypt then "-e" else "-d") # Mode
+ "-s ${cfg.source}" # Source
+ "-t ${cfg.target}" # Target
+ "-k ${cfg.keyfile}" # Keyfile
+ "-n ${toString cfg.maxConns}" # Max number of conns
+ "-o ${toString cfg.timeout}" # Timeout
+ (optionalString cfg.waitForDNS "-D") # Wait for DNS
+ (optionalString cfg.weakHandshake "-f") # No PFS
+ (optionalString cfg.disableKeepalives "-j") # Keepalives
+ (if cfg.disableReresolution then "-R"
+ else "-r ${toString cfg.resolveRefresh}")
+ ];
+ }) cfg;
+ };
+}
diff --git a/nixos/modules/services/networking/ssh/lshd.nix b/nixos/modules/services/networking/ssh/lshd.nix
index 04ef76f1e4d41ad0327f5b2a9e14c2e6db7276f4..fca30a1fe49c13baf28ac312b6798a229c0514fe 100644
--- a/nixos/modules/services/networking/ssh/lshd.nix
+++ b/nixos/modules/services/networking/ssh/lshd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/ssh/sshd.nix b/nixos/modules/services/networking/ssh/sshd.nix
index 85b6ab1efecf64ba623b4c8f62dafbbc4b3b0cca..b66ccb87120cf5ddb4c53ced9a3a6ef21a50f3dd 100644
--- a/nixos/modules/services/networking/ssh/sshd.nix
+++ b/nixos/modules/services/networking/ssh/sshd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -258,7 +258,6 @@ in
path = [ pkgs.openssh pkgs.gawk ];
environment.LD_LIBRARY_PATH = nssModulesPath;
- environment.LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
preStart =
''
@@ -285,7 +284,7 @@ in
networking.firewall.allowedTCPPorts = cfg.ports;
security.pam.services.sshd =
- { startSession = true;
+ { startSession = !config.boot.isContainer;
showMotd = true;
unixAuth = cfg.passwordAuthentication;
};
diff --git a/nixos/modules/services/networking/supybot.nix b/nixos/modules/services/networking/supybot.nix
index fa8b7556de5d018c1fbf7bcc79de6ccfe10bd6f1..2cfb9fc9b923471e0ab335e9d32b094fd9994c8a 100644
--- a/nixos/modules/services/networking/supybot.nix
+++ b/nixos/modules/services/networking/supybot.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/syncthing.nix b/nixos/modules/services/networking/syncthing.nix
new file mode 100644
index 0000000000000000000000000000000000000000..02572c1e27d2c94dbd39f6615b8b3dd505e984e8
--- /dev/null
+++ b/nixos/modules/services/networking/syncthing.nix
@@ -0,0 +1,78 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.syncthing;
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.syncthing = {
+
+ enable = mkOption {
+ default = false;
+ description = ''
+ Whether to enable the Syncthing, self-hosted open-source alternative
+ to Dropbox and BittorrentSync. Initial interface will be
+ available on http://127.0.0.1:8080/.
+ '';
+ };
+
+ user = mkOption {
+ default = "syncthing";
+ description = ''
+ Syncthing will be run under this user (user must exist,
+ this can be your user name).
+ '';
+ };
+
+ dataDir = mkOption {
+ default = "/var/lib/syncthing";
+ description = ''
+ Path where the `.syncthing` (settings and keys) and `Sync`
+ (your synced files) directories will exist. This can be your home
+ directory.
+ '';
+ };
+
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ systemd.services.syncthing =
+ {
+ description = "Syncthing service";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ environment.STNORESTART = "placeholder"; # do not self-restart
+ environment.HOME = "${cfg.dataDir}";
+ serviceConfig = {
+ User = "${cfg.user}";
+ PermissionsStartOnly = true;
+ Restart = "always";
+ ExecStart = "${pkgs.syncthing}/bin/syncthing -home=${cfg.dataDir}/.syncthing";
+ };
+ preStart = ''
+ mkdir -p ${cfg.dataDir}
+ chown ${cfg.user} ${cfg.dataDir}
+ '';
+
+ };
+
+ environment.systemPackages = [ pkgs.syncthing ];
+
+ };
+
+}
diff --git a/nixos/modules/services/networking/tcpcrypt.nix b/nixos/modules/services/networking/tcpcrypt.nix
index 48cb884f2466397637d82e0ec656c5cfd8d15e2a..1359006aef4e9c6c0896bbadd9d16cfef65ca50e 100644
--- a/nixos/modules/services/networking/tcpcrypt.nix
+++ b/nixos/modules/services/networking/tcpcrypt.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/tftpd.nix b/nixos/modules/services/networking/tftpd.nix
index 37935496c59766a9e17e07dc6fa8522370d40861..a2f7ff06ea611183a18757889cc2dfb4b670a4b2 100644
--- a/nixos/modules/services/networking/tftpd.nix
+++ b/nixos/modules/services/networking/tftpd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/networking/unbound.nix b/nixos/modules/services/networking/unbound.nix
index fb75b4ed069a87bd80759b30ba33aa0ee033e6af..30ce4b49fa8d2d7225349c8546bff011bb82d223 100644
--- a/nixos/modules/services/networking/unbound.nix
+++ b/nixos/modules/services/networking/unbound.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/vsftpd.nix b/nixos/modules/services/networking/vsftpd.nix
index 1c77cc6df4ea3dba8781df470a129e170f08b0ee..62b6027c01208b24899ff347c67664a4c47487f1 100644
--- a/nixos/modules/services/networking/vsftpd.nix
+++ b/nixos/modules/services/networking/vsftpd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -91,6 +91,7 @@ let
${optionalString (pkgs.stdenv.system == "x86_64-linux") ''
seccomp_sandbox=NO
''}
+ anon_umask=${cfg.anonymousUmask}
'';
in
@@ -139,6 +140,13 @@ in
description = "RSA certificate file.";
};
+ anonymousUmask = mkOption {
+ type = types.string;
+ default = "077";
+ example = "002";
+ description = "Anonymous write umask.";
+ };
+
} // (listToAttrs (catAttrs "nixosOption" optionDescription));
};
diff --git a/nixos/modules/services/networking/wakeonlan.nix b/nixos/modules/services/networking/wakeonlan.nix
index 1fc54986b16fee3b47843204974bb7cf5775287a..11bb7e92525514d14dcfe4c519fad68987bb230a 100644
--- a/nixos/modules/services/networking/wakeonlan.nix
+++ b/nixos/modules/services/networking/wakeonlan.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
interfaces = config.services.wakeonlan.interfaces;
diff --git a/nixos/modules/services/networking/websockify.nix b/nixos/modules/services/networking/websockify.nix
index 12042bbad6c9b85246a9ab8567e02ed26f608265..4b76350ecf8a7ac08882d091353aaa8fe96aaf68 100644
--- a/nixos/modules/services/networking/websockify.nix
+++ b/nixos/modules/services/networking/websockify.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.services.networking.websockify; in {
options = {
diff --git a/nixos/modules/services/networking/wicd.nix b/nixos/modules/services/networking/wicd.nix
index 8e01227321647f0c0dd2c2835095600672a12ef6..18258084fc2c6309610b6e5cfc21343a0ac07459 100644
--- a/nixos/modules/services/networking/wicd.nix
+++ b/nixos/modules/services/networking/wicd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix
index 5e5f81ed5a0bc3de0125e6489daa120873dc9a94..eb721ec34559f55d8ff35891d8778c8a4731121f 100644
--- a/nixos/modules/services/networking/wpa_supplicant.nix
+++ b/nixos/modules/services/networking/wpa_supplicant.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/networking/xinetd.nix b/nixos/modules/services/networking/xinetd.nix
index 626183b810f13677b1819784838c8c7c122a8123..14ee52ae52e62888bbf627026f7de46c1102e796 100644
--- a/nixos/modules/services/networking/xinetd.nix
+++ b/nixos/modules/services/networking/xinetd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/printing/cupsd.nix b/nixos/modules/services/printing/cupsd.nix
index 1be3587c3bb9c13d0cd162e082dd392d6c3f73ca..4b758608cb64ab2b174b8f073e3d5636caa12bc3 100644
--- a/nixos/modules/services/printing/cupsd.nix
+++ b/nixos/modules/services/printing/cupsd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -143,7 +143,9 @@ in
};
services.printing.drivers =
- [ pkgs.cups pkgs.cups_pdf_filter pkgs.ghostscript additionalBackends pkgs.perl pkgs.coreutils pkgs.gnused ];
+ [ pkgs.cups pkgs.cups_pdf_filter pkgs.ghostscript additionalBackends
+ pkgs.perl pkgs.coreutils pkgs.gnused pkgs.bc pkgs.gawk pkgs.gnugrep
+ ];
services.printing.cupsdConf =
''
diff --git a/nixos/modules/services/scheduling/atd.nix b/nixos/modules/services/scheduling/atd.nix
index c516c5889f12981685bb7fff61f4690e1adcb53d..c6f128ec40260d27875fae96aaf2095ce14a5b4d 100644
--- a/nixos/modules/services/scheduling/atd.nix
+++ b/nixos/modules/services/scheduling/atd.nix
@@ -1,6 +1,6 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/scheduling/cron.nix b/nixos/modules/services/scheduling/cron.nix
index 44ed1ba5a078512bda4e2d39f2a85f6047fa2166..5da71b12dd76219b5ce9fbf43d16886127167d10 100644
--- a/nixos/modules/services/scheduling/cron.nix
+++ b/nixos/modules/services/scheduling/cron.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/scheduling/fcron.nix b/nixos/modules/services/scheduling/fcron.nix
index fda29ca0482b55b160d361a45b44445d5a14da1a..346a64f2c3cb9facba05aea59abcb0943a532641 100644
--- a/nixos/modules/services/scheduling/fcron.nix
+++ b/nixos/modules/services/scheduling/fcron.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/search/elasticsearch.nix b/nixos/modules/services/search/elasticsearch.nix
index b3d934862abf8ea0eb2ba05c8bf48005be212260..b7a3566f95d917dab6e7a9db0bc24778ee702260 100644
--- a/nixos/modules/services/search/elasticsearch.nix
+++ b/nixos/modules/services/search/elasticsearch.nix
@@ -1,20 +1,26 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.elasticsearch;
- es_home = "/var/lib/elasticsearch";
-
- configFile = pkgs.writeText "elasticsearch.yml" ''
+ esConfig = ''
network.host: ${cfg.host}
- network.port: ${cfg.port}
- network.tcp.port: ${cfg.tcp_port}
+ network.port: ${toString cfg.port}
+ network.tcp.port: ${toString cfg.tcp_port}
cluster.name: ${cfg.cluster_name}
${cfg.extraConf}
'';
+ configDir = pkgs.buildEnv {
+ name = "elasticsearch-config";
+ paths = [
+ (pkgs.writeTextDir "elasticsearch.yml" esConfig)
+ (pkgs.writeTextDir "logging.yml" cfg.logging)
+ ];
+ };
+
in {
###### interface
@@ -34,14 +40,14 @@ in {
port = mkOption {
description = "Elasticsearch port to listen for HTTP traffic";
- default = "9200";
- type = types.str;
+ default = 9200;
+ type = types.int;
};
tcp_port = mkOption {
description = "Elasticsearch port for the node to node communication";
- default = "9300";
- type = types.str;
+ default = 9300;
+ type = types.int;
};
cluster_name = mkOption {
@@ -79,27 +85,32 @@ in {
'';
type = types.str;
};
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/lib/elasticsearch";
+ description = ''
+ Data directory for elasticsearch.
+ '';
+ };
};
###### implementation
config = mkIf cfg.enable {
- environment.etc = [
- { source = configFile;
- target = "elasticsearch/elasticsearch.yml"; }
- { source = pkgs.writeText "logging.yml" cfg.logging;
- target = "elasticsearch/logging.yml"; }
- ];
-
systemd.services.elasticsearch = {
description = "Elasticsearch daemon";
wantedBy = [ "multi-user.target" ];
after = [ "network-interfaces.target" ];
- environment = { ES_HOME = es_home; };
+ environment = { ES_HOME = cfg.dataDir; };
serviceConfig = {
- ExecStart = "${pkgs.elasticsearch}/bin/elasticsearch -f -Des.path.conf=/etc/elasticsearch";
+ ExecStart = "${pkgs.elasticsearch}/bin/elasticsearch -f -Des.path.conf=${configDir}";
User = "elasticsearch";
};
+ preStart = ''
+ mkdir -m 0700 -p ${cfg.dataDir}
+ if [ "$(id -u)" = 0 ]; then chown -R elasticsearch ${cfg.dataDir}; fi
+ '';
};
environment.systemPackages = [ pkgs.elasticsearch ];
@@ -108,8 +119,7 @@ in {
name = "elasticsearch";
uid = config.ids.uids.elasticsearch;
description = "Elasticsearch daemon user";
- home = es_home;
- createHome = true;
+ home = cfg.dataDir;
};
};
}
diff --git a/nixos/modules/services/search/solr.nix b/nixos/modules/services/search/solr.nix
new file mode 100644
index 0000000000000000000000000000000000000000..38d9dedbe3cf15d64781d38467cd73d610107731
--- /dev/null
+++ b/nixos/modules/services/search/solr.nix
@@ -0,0 +1,147 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.solr;
+
+ # Assemble all jars needed for solr
+ solrJars = pkgs.stdenv.mkDerivation {
+ name = "solr-jars";
+
+ src = pkgs.fetchurl {
+ url = http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.36/bin/apache-tomcat-5.5.36.tar.gz;
+ sha256 = "01mzvh53wrs1p2ym765jwd00gl6kn8f9k3nhdrnhdqr8dhimfb2p";
+ };
+
+ buildPhases = [ "unpackPhase" "installPhase" ];
+
+ installPhase = ''
+ mkdir -p $out/lib
+ cp common/lib/*.jar $out/lib/
+ ln -s ${pkgs.ant}/lib/ant/lib/ant.jar $out/lib/
+ ln -s ${cfg.solrPackage}/lib/ext/* $out/lib/
+ ln -s ${pkgs.openjdk}/lib/openjdk/lib/tools.jar $out/lib/
+ '' + optionalString (cfg.extraJars != []) ''
+ for f in ${concatStringsSep " " cfg.extraJars}; do
+ cp $f $out/lib
+ done
+ '';
+ };
+
+in {
+
+ options = {
+ services.solr = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enables the solr service.
+ '';
+ };
+
+ javaPackage = mkOption {
+ type = types.package;
+ default = pkgs.openjre;
+ description = ''
+ Which Java derivation to use for running solr.
+ '';
+ };
+
+ solrPackage = mkOption {
+ type = types.package;
+ default = pkgs.solr;
+ description = ''
+ Which solr derivation to use for running solr.
+ '';
+ };
+
+ extraJars = mkOption {
+ type = types.listOf types.path;
+ default = [];
+ description = ''
+ List of paths pointing to jars. Jars are copied to commonLibFolder to be available to java/solr.
+ '';
+ };
+
+ log4jConfiguration = mkOption {
+ type = types.lines;
+ default = ''
+ log4j.rootLogger=INFO, stdout
+ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+ log4j.appender.stdout.Target=System.out
+ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+ log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
+ '';
+ description = ''
+ Contents of the log4j.properties used. By default,
+ everything is logged to stdout (picked up by systemd) with level INFO.
+ '';
+ };
+
+ user = mkOption {
+ type = types.str;
+ description = ''
+ The user that should run the solr process and.
+ the working directories.
+ '';
+ };
+
+ group = mkOption {
+ type = types.str;
+ description = ''
+ The group that will own the working directory.
+ '';
+ };
+
+ solrHome = mkOption {
+ type = types.str;
+ description = ''
+ The solr home directory. It is your own responsibility to
+ make sure this directory contains a working solr configuration,
+ and is writeable by the the user running the solr service.
+ Failing to do so, the solr will not start properly.
+ '';
+ };
+
+ extraJavaOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Extra command line options given to the java process running
+ solr.
+ '';
+ };
+
+ extraWinstoneOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Extra command line options given to the Winstone, which is
+ the servlet container hosting solr.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+
+ services.winstone.solr = {
+ serviceName = "solr";
+ inherit (cfg) user group javaPackage;
+ warFile = "${cfg.solrPackage}/lib/solr.war";
+ extraOptions = [
+ "--commonLibFolder=${solrJars}/lib"
+ "--useJasper"
+ ] ++ cfg.extraWinstoneOptions;
+ extraJavaOptions = [
+ "-Dsolr.solr.home=${cfg.solrHome}"
+ "-Dlog4j.configuration=file://${pkgs.writeText "log4j.properties" cfg.log4jConfiguration}"
+ ] ++ cfg.extraJavaOptions;
+ };
+
+ };
+
+}
diff --git a/nixos/modules/services/security/clamav.nix b/nixos/modules/services/security/clamav.nix
index 5ccb4927fcb7b0e94bc4a2a5a49f0e6feaffdf8a..057891a60475afb6a54d472fb8c16ec2036f5d8f 100644
--- a/nixos/modules/services/security/clamav.nix
+++ b/nixos/modules/services/security/clamav.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
clamavUser = "clamav";
stateDir = "/var/lib/clamav";
diff --git a/nixos/modules/services/security/fail2ban.nix b/nixos/modules/services/security/fail2ban.nix
index ae1fd22d23ee7e86308abf2021da2b3519dcfb9c..af54501663797a8f868560f83490b8c07ef411e0 100644
--- a/nixos/modules/services/security/fail2ban.nix
+++ b/nixos/modules/services/security/fail2ban.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/security/fprot.nix b/nixos/modules/services/security/fprot.nix
index 9f1fc4ed6d8b42fe7b86cb5487e6bb598029bbe1..7270a9f98145a7e8c093cc396a187c55cac7d68e 100644
--- a/nixos/modules/services/security/fprot.nix
+++ b/nixos/modules/services/security/fprot.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
fprotUser = "fprot";
stateDir = "/var/lib/fprot";
@@ -10,33 +10,31 @@ in {
services.fprot = {
updater = {
- enable = mkOption {
- default = false;
- description = ''
- Whether to enable automatic F-Prot virus definitions database updates.
- '';
- };
-
- productData = mkOption {
- default = "${pkgs.fprot}/opt/f-prot/product.data";
- description = ''
- product.data file. Defaults to the one supplied with installation package.
- '';
- };
-
- frequency = mkOption {
- default = 30;
- description = ''
- Update virus definitions every X minutes.
- '';
- };
-
- licenseKeyfile = mkOption {
- default = "${pkgs.fprot}/opt/f-prot/license.key";
- description = ''
- License keyfile. Defaults to the one supplied with installation package.
- '';
- };
+ enable = mkOption {
+ default = false;
+ description = ''
+ Whether to enable automatic F-Prot virus definitions database updates.
+ '';
+ };
+
+ productData = mkOption {
+ description = ''
+ product.data file. Defaults to the one supplied with installation package.
+ '';
+ };
+
+ frequency = mkOption {
+ default = 30;
+ description = ''
+ Update virus definitions every X minutes.
+ '';
+ };
+
+ licenseKeyfile = mkOption {
+ description = ''
+ License keyfile. Defaults to the one supplied with installation package.
+ '';
+ };
};
};
@@ -45,6 +43,10 @@ in {
###### implementation
config = mkIf cfg.updater.enable {
+
+ services.fprot.updater.productData = mkDefault "${pkgs.fprot}/opt/f-prot/product.data";
+ services.fprot.updater.licenseKeyfile = mkDefault "${pkgs.fprot}/opt/f-prot/license.key";
+
environment.systemPackages = [ pkgs.fprot ];
environment.etc = singleton {
source = "${pkgs.fprot}/opt/f-prot/f-prot.conf";
@@ -67,22 +69,22 @@ in {
jobs = {
fprot_updater = {
- name = "fprot-updater";
- task = true;
+ name = "fprot-updater";
+ task = true;
- # have to copy fpupdate executable because it insists on storing the virus database in the same dir
+ # have to copy fpupdate executable because it insists on storing the virus database in the same dir
preStart = ''
mkdir -m 0755 -p ${stateDir}
chown ${fprotUser}:${fprotGroup} ${stateDir}
- cp ${pkgs.fprot}/opt/f-prot/fpupdate ${stateDir}
- ln -sf ${cfg.updater.productData} ${stateDir}/product.data
+ cp ${pkgs.fprot}/opt/f-prot/fpupdate ${stateDir}
+ ln -sf ${cfg.updater.productData} ${stateDir}/product.data
'';
- #setuid = fprotUser;
- #setgid = fprotGroup;
+ #setuid = fprotUser;
+ #setgid = fprotGroup;
exec = "/var/lib/fprot/fpupdate --keyfile ${cfg.updater.licenseKeyfile}";
- };
+ };
};
};
-}
\ No newline at end of file
+}
diff --git a/nixos/modules/services/security/haveged.nix b/nixos/modules/services/security/haveged.nix
index c3ea3fb03ed952e6e0d668b19367591b7bad7091..1d52ed55dbda8b6cc696dba0d76801f025ce2eae 100644
--- a/nixos/modules/services/security/haveged.nix
+++ b/nixos/modules/services/security/haveged.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/security/tor.nix b/nixos/modules/services/security/tor.nix
index e70eb8511a63d0ed1c5412bb2df32ceaf7fe3462..582dd124c290337167dac02b2bdf803b162a9127 100644
--- a/nixos/modules/services/security/tor.nix
+++ b/nixos/modules/services/security/tor.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/security/torify.nix b/nixos/modules/services/security/torify.nix
index 1c158906a911cc88e843d7d37ad9a1e07c7e7f12..53f48a714b4b557e40e27c45a7e2a5085c051f1d 100644
--- a/nixos/modules/services/security/torify.nix
+++ b/nixos/modules/services/security/torify.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.tor;
diff --git a/nixos/modules/services/security/torsocks.nix b/nixos/modules/services/security/torsocks.nix
index d6974282a6b5cc2cc9bc2031780ae7f78a3c64fa..ede6c983677a67b2212eed90e335042ea800fc35 100644
--- a/nixos/modules/services/security/torsocks.nix
+++ b/nixos/modules/services/security/torsocks.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.tor;
diff --git a/nixos/modules/services/system/dbus.nix b/nixos/modules/services/system/dbus.nix
index cb5110f6feb317c5be1d48e3af8b9e97d3e5db69..8cc655803c5986707c971d8d04a8dd4980547a9a 100644
--- a/nixos/modules/services/system/dbus.nix
+++ b/nixos/modules/services/system/dbus.nix
@@ -1,8 +1,8 @@
# D-Bus configuration and system bus daemon.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/system/nscd.nix b/nixos/modules/services/system/nscd.nix
index b817b1df779fb47c3d0f641fb52026afa0c65a3b..f357eb4e1fc81576e8b40c1d05690aa7e320ea5b 100644
--- a/nixos/modules/services/system/nscd.nix
+++ b/nixos/modules/services/system/nscd.nix
@@ -1,10 +1,11 @@
-{pkgs, config, ...}:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
nssModulesPath = config.system.nssModules.path;
+ cfg = config.services.nscd;
inherit (pkgs.lib) singleton;
@@ -24,6 +25,12 @@ in
description = "Whether to enable the Name Service Cache Daemon.";
};
+ config = mkOption {
+ type = types.lines;
+ default = builtins.readFile ./nscd.conf;
+ description = "Configuration to use for Name Service Cache Daemon.";
+ };
+
};
};
@@ -31,7 +38,7 @@ in
###### implementation
- config = mkIf config.services.nscd.enable {
+ config = mkIf cfg.enable {
users.extraUsers = singleton
{ name = "nscd";
@@ -56,7 +63,7 @@ in
restartTriggers = [ config.environment.etc.hosts.source ];
serviceConfig =
- { ExecStart = "@${pkgs.glibc}/sbin/nscd nscd -f ${./nscd.conf}";
+ { ExecStart = "@${pkgs.glibc}/sbin/nscd nscd -f ${pkgs.writeText "nscd.conf" cfg.config}";
Type = "forking";
PIDFile = "/run/nscd/nscd.pid";
Restart = "always";
diff --git a/nixos/modules/services/torrent/deluge.nix b/nixos/modules/services/torrent/deluge.nix
index e0c212e5661f74f66f9e3bcf4f1af8eed1941edd..00df4042d89019bcae0adb0d1404d189a20afca9 100644
--- a/nixos/modules/services/torrent/deluge.nix
+++ b/nixos/modules/services/torrent/deluge.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.deluge;
diff --git a/nixos/modules/services/torrent/transmission.nix b/nixos/modules/services/torrent/transmission.nix
index 68f9b0647c0e4839596a97ee8bf24946c340d760..5cdecd1eb57737b3b9d0711c0afce187674aa693 100644
--- a/nixos/modules/services/torrent/transmission.nix
+++ b/nixos/modules/services/torrent/transmission.nix
@@ -1,13 +1,14 @@
-# NixOS module for Transmission BitTorrent daemon
+{ config, lib, pkgs, ... }:
-{ config, pkgs, ... }:
-
-with pkgs.lib;
+with lib;
let
-
cfg = config.services.transmission;
+ apparmor = config.security.apparmor.enable;
+
homeDir = "/var/lib/transmission";
+ downloadDir = "${homeDir}/Downloads";
+ incompleteDir = "${homeDir}/.incomplete";
settingsDir = "${homeDir}/.config/transmission-daemon";
settingsFile = "${settingsDir}/settings.json";
@@ -31,16 +32,12 @@ let
(if isList value then value else [value]))
as));
+ # for users in group "transmission" to have access to torrents
+ fullSettings = cfg.settings // { umask = 2; };
in
-
{
-
- ### configuration
-
options = {
-
services.transmission = {
-
enable = mkOption {
type = types.uniq types.bool;
default = false;
@@ -59,65 +56,48 @@ in
type = types.attrs;
default =
{
- # for users in group "transmission" to have access to torrents
- umask = 2;
- }
- ;
+ download-dir = downloadDir;
+ incomplete-dir = incompleteDir;
+ incomplete-dir-enabled = true;
+ };
example =
{
download-dir = "/srv/torrents/";
incomplete-dir = "/srv/torrents/.incomplete/";
incomplete-dir-enabled = true;
rpc-whitelist = "127.0.0.1,192.168.*.*";
- # for users in group "transmission" to have access to torrents
- umask = 2;
- }
- ;
+ };
description = ''
Attribute set whos fields overwrites fields in settings.json (each
time the service starts). String values must be quoted, integer and
boolean values must not.
- See https://trac.transmissionbt.com/wiki/EditConfigFiles for documentation
- and/or look at ${settingsFile}."
+ See https://trac.transmissionbt.com/wiki/EditConfigFiles for
+ documentation and/or look at ${settingsFile}.
'';
};
- rpc_port = mkOption {
+ port = mkOption {
type = types.uniq types.int;
default = 9091;
description = "TCP port number to run the RPC/web interface.";
};
-
- apparmor = mkOption {
- type = types.uniq types.bool;
- default = true;
- description = "Generate apparmor profile for transmission-daemon.";
- };
};
-
};
- ### implementation
-
config = mkIf cfg.enable {
-
systemd.services.transmission = {
- description = "Transmission BitTorrent Daemon";
- after = [ "network.target" ] ++ optional (config.security.apparmor.enable && cfg.apparmor) "apparmor.service";
- requires = mkIf (config.security.apparmor.enable && cfg.apparmor) [ "apparmor.service" ];
+ description = "Transmission BitTorrent Service";
+ after = [ "network.target" ] ++ optional apparmor "apparmor.service";
+ requires = mkIf apparmor [ "apparmor.service" ];
wantedBy = [ "multi-user.target" ];
# 1) Only the "transmission" user and group have access to torrents.
# 2) Optionally update/force specific fields into the configuration file.
- serviceConfig.ExecStartPre =
- if cfg.settings != {} then ''
- ${pkgs.stdenv.shell} -c "chmod 770 ${homeDir} && mkdir -p ${settingsDir} && ${pkgs.transmission}/bin/transmission-daemon -d |& sed ${attrsToSedArgs cfg.settings} > ${settingsFile}.tmp && mv ${settingsFile}.tmp ${settingsFile}"
- ''
- else ''
- ${pkgs.stdenv.shell} -c "chmod 770 ${homeDir}"
- '';
- serviceConfig.ExecStart = "${pkgs.transmission}/bin/transmission-daemon -f --port ${toString config.services.transmission.rpc_port}";
+ serviceConfig.ExecStartPre = ''
+ ${pkgs.stdenv.shell} -c "chmod 770 ${homeDir} && mkdir -p ${settingsDir} ${downloadDir} ${incompleteDir} && ${pkgs.transmission}/bin/transmission-daemon -d |& sed ${attrsToSedArgs fullSettings} > ${settingsFile}.tmp && mv ${settingsFile}.tmp ${settingsFile}"
+ '';
+ serviceConfig.ExecStart = "${pkgs.transmission}/bin/transmission-daemon -f --port ${toString config.services.transmission.port}";
serviceConfig.ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
serviceConfig.User = "transmission";
# NOTE: transmission has an internal umask that also must be set (in settings.json)
@@ -127,6 +107,7 @@ in
# It's useful to have transmission in path, e.g. for remote control
environment.systemPackages = [ pkgs.transmission ];
+ users.extraGroups.transmission.gid = config.ids.gids.transmission;
users.extraUsers.transmission = {
group = "transmission";
uid = config.ids.uids.transmission;
@@ -135,10 +116,8 @@ in
createHome = true;
};
- users.extraGroups.transmission.gid = config.ids.gids.transmission;
-
# AppArmor profile
- security.apparmor.profiles = mkIf (config.security.apparmor.enable && cfg.apparmor) [
+ security.apparmor.profiles = mkIf apparmor [
(pkgs.writeText "apparmor-transmission-daemon" ''
#include
@@ -161,9 +140,9 @@ in
owner ${settingsDir}/** rw,
- ${cfg.settings.download-dir}/** rw,
- ${optionalString cfg.settings.incomplete-dir-enabled ''
- ${cfg.settings.incomplete-dir}/** rw,
+ ${fullSettings.download-dir}/** rw,
+ ${optionalString fullSettings.incomplete-dir-enabled ''
+ ${fullSettings.incomplete-dir}/** rw,
''}
}
'')
diff --git a/nixos/modules/services/ttys/agetty.nix b/nixos/modules/services/ttys/agetty.nix
index ae4fa87d4b7bb84ef0e4f8595832b98669402b7d..df21ebbd9743ac88191e6e4a668f659fa0d5b9f5 100644
--- a/nixos/modules/services/ttys/agetty.nix
+++ b/nixos/modules/services/ttys/agetty.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
@@ -28,6 +28,17 @@ with pkgs.lib;
'';
};
+ serialSpeed = mkOption {
+ type = types.listOf types.int;
+ default = [ 115200 57600 38400 9600 ];
+ example = [ 38400 9600 ];
+ description = ''
+ Bitrates to allow for agetty's listening on serial ports. Listing more
+ bitrates gives more interoperability but at the cost of long delays
+ for getting a sync on the line.
+ '';
+ };
+
};
};
@@ -37,81 +48,23 @@ with pkgs.lib;
config = {
- # FIXME: these are mostly copy/pasted from the systemd sources,
- # which some small modifications, which is annoying.
-
- # Generate a separate job for each tty.
- systemd.units."getty@.service".text =
- ''
- [Unit]
- Description=Getty on %I
- Documentation=man:agetty(8)
- After=systemd-user-sessions.service plymouth-quit-wait.service
-
- # If additional gettys are spawned during boot then we should make
- # sure that this is synchronized before getty.target, even though
- # getty.target didn't actually pull it in.
- Before=getty.target
- IgnoreOnIsolate=yes
-
- ConditionPathExists=/dev/tty0
-
- [Service]
- Environment=TERM=linux
- Environment=LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
- ExecStart=@${pkgs.utillinux}/sbin/agetty agetty --noclear --login-program ${pkgs.shadow}/bin/login %I 38400
- Type=idle
- Restart=always
- RestartSec=0
- UtmpIdentifier=%I
- TTYPath=/dev/%I
- TTYReset=yes
- TTYVHangup=yes
- TTYVTDisallocate=yes # set to no to prevent clearing the screen
- KillMode=process
- IgnoreSIGPIPE=no
-
- # Some login implementations ignore SIGTERM, so we send SIGHUP
- # instead, to ensure that login terminates cleanly.
- KillSignal=SIGHUP
-
- X-RestartIfChanged=false
- '';
-
- systemd.units."serial-getty@.service".text =
- ''
- [Unit]
- Description=Serial Getty on %I
- Documentation=man:agetty(8) man:systemd-getty-generator(8)
- BindsTo=dev-%i.device
- After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
-
- # If additional gettys are spawned during boot then we should make
- # sure that this is synchronized before getty.target, even though
- # getty.target didn't actually pull it in.
- Before=getty.target
- IgnoreOnIsolate=yes
-
- [Service]
- Environment=TERM=linux
- Environment=LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
- ExecStart=@${pkgs.utillinux}/sbin/agetty agetty --login-program ${pkgs.shadow}/bin/login %I 115200,57600,38400,9600
- Type=idle
- Restart=always
- RestartSec=0
- UtmpIdentifier=%I
- TTYPath=/dev/%I
- TTYReset=yes
- TTYVHangup=yes
- KillMode=process
- IgnoreSIGPIPE=no
-
- # Some login implementations ignore SIGTERM, so we send SIGHUP
- # instead, to ensure that login terminates cleanly.
- KillSignal=SIGHUP
-
- X-RestartIfChanged=false
- '';
+ systemd.services."getty@" =
+ { serviceConfig.ExecStart = "@${pkgs.utillinux}/sbin/agetty agetty --noclear --login-program ${pkgs.shadow}/bin/login --keep-baud %I 115200,38400,9600 $TERM";
+ restartIfChanged = false;
+ };
+
+ systemd.services."serial-getty@" =
+ { serviceConfig.ExecStart =
+ let speeds = concatStringsSep "," (map toString config.services.mingetty.serialSpeed);
+ in "@${pkgs.utillinux}/sbin/agetty agetty --login-program ${pkgs.shadow}/bin/login %I ${speeds} $TERM";
+ restartIfChanged = false;
+ };
+
+ systemd.services."container-getty@" =
+ { unitConfig.ConditionPathExists = "/dev/pts/%I"; # Work around being respawned when "machinectl login" exits.
+ serviceConfig.ExecStart = "@${pkgs.utillinux}/sbin/agetty agetty --noclear --login-program ${pkgs.shadow}/bin/login --keep-baud pts/%I 115200,38400,9600 $TERM";
+ restartIfChanged = false;
+ };
environment.etc = singleton
{ # Friendly greeting on the virtual consoles.
diff --git a/nixos/modules/services/ttys/gpm.nix b/nixos/modules/services/ttys/gpm.nix
index 74cee67aeae9e09b703470c8d92a98d530ed5a8c..03b0f39824d0f7fa077434825f1ab67d35c387a8 100644
--- a/nixos/modules/services/ttys/gpm.nix
+++ b/nixos/modules/services/ttys/gpm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -40,12 +40,15 @@ in
config = mkIf cfg.enable {
- jobs.gpm =
- { description = "General purpose mouse";
+ systemd.services.gpm =
+ { description = "Console Mouse Daemon";
- startOn = "started udev";
+ wantedBy = [ "multi-user.target" ];
+ requires = [ "getty.target" ];
- exec = "${pkgs.gpm}/sbin/gpm -m /dev/input/mice -t ${cfg.protocol} -D &>/dev/null";
+ serviceConfig.ExecStart = "@${pkgs.gpm}/sbin/gpm gpm -m /dev/input/mice -t ${cfg.protocol}";
+ serviceConfig.Type = "forking";
+ serviceConfig.PIDFile = "/run/gpm.pid";
};
};
diff --git a/nixos/modules/services/ttys/kmscon.nix b/nixos/modules/services/ttys/kmscon.nix
index 302e660a7bffd891e50786cf0a817b9fa76dae92..70555e5d88256a33425b87650196b4edb50caafd 100644
--- a/nixos/modules/services/ttys/kmscon.nix
+++ b/nixos/modules/services/ttys/kmscon.nix
@@ -44,6 +44,7 @@ in {
After=systemd-user-sessions.service
After=plymouth-quit-wait.service
After=systemd-logind.service
+ After=systemd-vconsole-setup.service
Requires=systemd-logind.service
Before=getty.target
Conflicts=getty@%i.service
@@ -62,17 +63,19 @@ in {
X-RestartIfChanged=false
'';
- systemd.units."autovt@.service".linkTarget = "${config.systemd.units."kmsconvt@.service".unit}/kmsconvt@.service";
-
- systemd.services."systemd-vconsole-setup".restartIfChanged = false;
+ systemd.units."autovt@.service".unit = pkgs.runCommand "unit" { }
+ ''
+ mkdir -p $out
+ ln -s ${config.systemd.units."kmsconvt@.service".unit}/kmsconvt@.service $out/autovt@.service
+ '';
- systemd.units."kmsconvt@tty1.service".extraConfig.wait-for-vconsole-setup = "After=systemd-vconsole-setup.service";
+ systemd.services.systemd-vconsole-setup.restartIfChanged = false;
services.kmscon.extraConfig = mkIf cfg.hwRender ''
drm
hwaccel
'';
- services.mesa.enable = mkIf cfg.hwRender true;
+ hardware.opengl.enable = mkIf cfg.hwRender true;
};
}
diff --git a/nixos/modules/services/web-servers/apache-httpd/default.nix b/nixos/modules/services/web-servers/apache-httpd/default.nix
index cdb42fa7308a5f5e60aa9f7272e87580c4a26431..75ec6671d156c4f74b43cd687f200c2d9ab5984b 100644
--- a/nixos/modules/services/web-servers/apache-httpd/default.nix
+++ b/nixos/modules/services/web-servers/apache-httpd/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -63,8 +63,9 @@ let
enablePHP = false;
phpOptions = "";
options = {};
+ documentRoot = null;
};
- res = defaults // svcFunction { inherit config pkgs serverInfo php; };
+ res = defaults // svcFunction { inherit config lib pkgs serverInfo php; };
in res;
in map f defs;
@@ -188,7 +189,11 @@ let
subservices = callSubservices serverInfo cfg.extraSubservices;
- documentRoot = if cfg.documentRoot != null then cfg.documentRoot else
+ maybeDocumentRoot = fold (svc: acc:
+ if acc == null then svc.documentRoot else assert svc.documentRoot == null; acc
+ ) null ([ cfg ] ++ subservices);
+
+ documentRoot = if maybeDocumentRoot != null then maybeDocumentRoot else
pkgs.runCommand "empty" {} "ensureDir $out";
documentRootConf = ''
@@ -240,7 +245,7 @@ let
${robotsConf}
- ${if isMainServer || cfg.documentRoot != null then documentRootConf else ""}
+ ${if isMainServer || maybeDocumentRoot != null then documentRootConf else ""}
${if cfg.enableUserDir then ''
@@ -260,7 +265,7 @@ let
'' else ""}
- ${if cfg.globalRedirect != null then ''
+ ${if cfg.globalRedirect != null && cfg.globalRedirect != "" then ''
RedirectPermanent / ${cfg.globalRedirect}
'' else ""}
@@ -414,7 +419,7 @@ in
};
package = mkOption {
- type = types.path;
+ type = types.package;
default = pkgs.apacheHttpd.override { mpm = mainCfg.multiProcessingModule; };
example = "pkgs.apacheHttpd_2_4";
description = ''
@@ -445,7 +450,7 @@ in
extraModules = mkOption {
type = types.listOf types.unspecified;
default = [];
- example = literalExample ''[ "proxy_connect" { name = "php5"; path = "''${php}/modules/libphp5.so"; } ]'';
+ example = literalExample ''[ "proxy_connect" { name = "php5"; path = "''${pkgs.php}/modules/libphp5.so"; } ]'';
description = ''
Additional Apache modules to be used. These can be
specified as a string in the case of modules distributed
@@ -505,7 +510,7 @@ in
virtualHosts = mkOption {
type = types.listOf (types.submodule (
{ options = import ./per-server-options.nix {
- inherit pkgs;
+ inherit lib;
forMainServer = false;
};
}));
@@ -572,7 +577,7 @@ in
# Include the options shared between the main server and virtual hosts.
// (import ./per-server-options.nix {
- inherit pkgs;
+ inherit lib;
forMainServer = true;
});
@@ -582,6 +587,12 @@ in
###### implementation
config = mkIf config.services.httpd.enable {
+
+ assertions = [ { assertion = mainCfg.enableSSL == true
+ -> mainCfg.sslServerCert != null
+ && mainCfg.sslServerKey != null;
+ message = "SSL is enabled for HTTPD, but sslServerCert and/or sslServerKey haven't been specified."; }
+ ];
users.extraUsers = optionalAttrs (mainCfg.user == "wwwrun") singleton
{ name = "wwwrun";
@@ -610,7 +621,7 @@ in
{ description = "Apache HTTPD";
wantedBy = [ "multi-user.target" ];
- requires = [ "keys.target" ];
+ wants = [ "keys.target" ];
after = [ "network.target" "fs.target" "postgresql.service" "keys.target" ];
path =
@@ -622,8 +633,8 @@ in
++ concatMap (svc: svc.extraServerPath) allSubservices;
environment =
- { PHPRC = if enablePHP then phpIni else "";
- } // (listToAttrs (concatMap (svc: svc.globalEnvVars) allSubservices));
+ optionalAttrs enablePHP { PHPRC = phpIni; }
+ // (listToAttrs (concatMap (svc: svc.globalEnvVars) allSubservices));
preStart =
''
diff --git a/nixos/modules/services/web-servers/apache-httpd/mediawiki.nix b/nixos/modules/services/web-servers/apache-httpd/mediawiki.nix
index 423087991e1360fb8772750c57410c7bdef08cab..7d59c13b9575b1f90bea80360e03595b40130f03 100644
--- a/nixos/modules/services/web-servers/apache-httpd/mediawiki.nix
+++ b/nixos/modules/services/web-servers/apache-httpd/mediawiki.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, serverInfo, php, ... }:
+{ config, lib, pkgs, serverInfo, php, ... }:
-with pkgs.lib;
+with lib;
let
@@ -93,6 +93,10 @@ let
ensureDir $out
cp -r * $out
cp ${mediawikiConfig} $out/LocalSettings.php
+ sed -i 's|/bin/bash|${pkgs.stdenv.shell}|' \
+ $out/maintenance/fuzz-tester.php \
+ $out/bin/ulimit.sh \
+ $out/includes/GlobalFunctions.php
'';
};
@@ -122,7 +126,18 @@ in
''}
- Alias ${config.urlPrefix} ${mediawikiRoot}
+ ${if config.urlPrefix != "" then "Alias ${config.urlPrefix} ${mediawikiRoot}" else ''
+ RewriteEngine On
+ RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
+ RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
+ RewriteRule ${if config.enableUploads
+ then "!^/images"
+ else "^.*\$"
+ } %{DOCUMENT_ROOT}/${if config.articleUrlPrefix == ""
+ then ""
+ else "${config.articleUrlPrefix}/"
+ }index.php [L]
+ ''}
Order allow,deny
@@ -135,6 +150,8 @@ in
''}
'';
+ documentRoot = if config.urlPrefix == "" then mediawikiRoot else null;
+
enablePHP = true;
options = {
@@ -290,6 +307,7 @@ in
echo COMMIT
) | ${pkgs.postgresql}/bin/psql -U "${config.dbUser}" "${config.dbName}"
fi
+ ${php}/bin/php ${mediawikiRoot}/maintenance/update.php
'');
robotsEntries = optionalString (config.articleUrlPrefix != "")
diff --git a/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix b/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix
index 53f34e28c27e8e134723bfbb044f0dab9ca4680d..b8e86334539842081ab2f1d300e5ed04b637d018 100644
--- a/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix
+++ b/nixos/modules/services/web-servers/apache-httpd/per-server-options.nix
@@ -3,9 +3,9 @@
# has additional options that affect the web server as a whole, like
# the user/group to run under.)
-{ forMainServer, pkgs }:
+{ forMainServer, lib }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/services/web-servers/apache-httpd/trac.nix b/nixos/modules/services/web-servers/apache-httpd/trac.nix
index dc82fd34f2faa6386812703ba0d44c75e16bab3d..ad791d7d95825f0f97d5e84dd12240e627e8974f 100644
--- a/nixos/modules/services/web-servers/apache-httpd/trac.nix
+++ b/nixos/modules/services/web-servers/apache-httpd/trac.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, serverInfo, ... }:
+{ config, lib, pkgs, serverInfo, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/web-servers/apache-httpd/zabbix.nix b/nixos/modules/services/web-servers/apache-httpd/zabbix.nix
index a6e6042fdf6d9af689ed4ce11c1097930b4ba2c6..cab16593bcbc7054b6ca1313b5342b12ba8f6a9e 100644
--- a/nixos/modules/services/web-servers/apache-httpd/zabbix.nix
+++ b/nixos/modules/services/web-servers/apache-httpd/zabbix.nix
@@ -1,4 +1,6 @@
-{ config, pkgs, serverInfo, ... }:
+{ config, lib, pkgs, serverInfo, ... }:
+
+with lib;
let
@@ -51,7 +53,7 @@ in
options = {
- urlPrefix = pkgs.lib.mkOption {
+ urlPrefix = mkOption {
default = "/zabbix";
description = "
The URL prefix under which the Zabbix service appears.
@@ -59,9 +61,9 @@ in
";
};
- configFile = pkgs.lib.mkOption {
+ configFile = mkOption {
default = null;
- type = with pkgs.lib.types; nullOr path;
+ type = types.nullOr types.path;
description = ''
The configuration file (zabbix.conf.php) which contains the database
connection settings. If not set, the configuration settings will created
@@ -69,7 +71,7 @@ in
'';
};
- stateDir = pkgs.lib.mkOption {
+ stateDir = mkOption {
default = "/var/lib/zabbix/frontend";
description = "
Directory where the dynamically generated configuration data
diff --git a/nixos/modules/services/web-servers/jboss/default.nix b/nixos/modules/services/web-servers/jboss/default.nix
index e1bcede6563cf4745647e75ec89cbe9da576f5e7..8a292ad67917dc0fb4ca7cc274e4bcc89b2e3032 100644
--- a/nixos/modules/services/web-servers/jboss/default.nix
+++ b/nixos/modules/services/web-servers/jboss/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/web-servers/lighttpd/cgit.nix b/nixos/modules/services/web-servers/lighttpd/cgit.nix
index 62264f1db452ce9aef4cf6d92e56094cf63d39c0..dbff565bd8a32bd03e0a98d7ee76e0edb9585462 100644
--- a/nixos/modules/services/web-servers/lighttpd/cgit.nix
+++ b/nixos/modules/services/web-servers/lighttpd/cgit.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.lighttpd.cgit;
diff --git a/nixos/modules/services/web-servers/lighttpd/default.nix b/nixos/modules/services/web-servers/lighttpd/default.nix
index 4cc34c65d843ddc9060b6879c5b577532b94aee4..3ba934c72bf86cc90cf99a982c3bbea9bd128a9e 100644
--- a/nixos/modules/services/web-servers/lighttpd/default.nix
+++ b/nixos/modules/services/web-servers/lighttpd/default.nix
@@ -1,8 +1,8 @@
# NixOS module for lighttpd web server
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/web-servers/lighttpd/gitweb.nix b/nixos/modules/services/web-servers/lighttpd/gitweb.nix
index f02bd4db264519e8d6e886818e23fd3b3361a7f0..d49278be09a87fb50d48a591b8bf7fd8e68d45ec 100644
--- a/nixos/modules/services/web-servers/lighttpd/gitweb.nix
+++ b/nixos/modules/services/web-servers/lighttpd/gitweb.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.lighttpd.gitweb;
diff --git a/nixos/modules/services/web-servers/nginx/default.nix b/nixos/modules/services/web-servers/nginx/default.nix
index 4a1b6de2873f303beadf5fcc42a769434631ba83..ff94ee42d28deee1e4d443bb9cad72975c5e2396 100644
--- a/nixos/modules/services/web-servers/nginx/default.nix
+++ b/nixos/modules/services/web-servers/nginx/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.nginx;
@@ -9,6 +9,12 @@ let
user ${cfg.user} ${cfg.group};
daemon off;
${cfg.config}
+ ${optionalString (cfg.httpConfig != "") ''
+ http {
+ ${cfg.httpConfig}
+ }
+ ''}
+ ${cfg.appendConfig}
'';
in
@@ -24,6 +30,7 @@ in
package = mkOption {
default = pkgs.nginx;
+ type = types.package;
description = "
Nginx package to use.
";
@@ -36,6 +43,25 @@ in
";
};
+ appendConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Configuration lines appended to the generated Nginx
+ configuration file. Commonly used by different modules
+ providing http snippets.
+ can be specified more than once and it's value will be
+ concatenated (contrary to which
+ can be set only once).
+ '';
+ };
+
+ httpConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = "Configuration lines to be appended inside of the http {} block.";
+ };
+
stateDir = mkOption {
default = "/var/spool/nginx";
description = "
diff --git a/nixos/modules/services/web-servers/phpfpm.nix b/nixos/modules/services/web-servers/phpfpm.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4a14f9b41a42e2cc9b6f2d3544325eb6d927cdcb
--- /dev/null
+++ b/nixos/modules/services/web-servers/phpfpm.nix
@@ -0,0 +1,84 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.phpfpm;
+
+ stateDir = "/run/phpfpm";
+
+ pidFile = "${stateDir}/phpfpm.pid";
+
+ cfgFile = pkgs.writeText "phpfpm.conf" ''
+ [global]
+ pid = ${pidFile}
+ error_log = syslog
+ daemonize = yes
+ ${cfg.extraConfig}
+
+ ${concatStringsSep "\n" (mapAttrsToList (n: v: "[${n}]\n${v}") cfg.poolConfigs)}
+ '';
+
+in {
+
+ options = {
+ services.phpfpm = {
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra configuration that should be put in the global section of
+ the PHP FPM configuration file. Do not specify the options
+ pid, error_log or
+ daemonize here, since they are generated by
+ NixOS.
+ '';
+ };
+
+ phpPackage = mkOption {
+ default = pkgs.php54;
+ description = ''
+ The PHP package to use for running the FPM service.
+ '';
+ };
+
+ poolConfigs = mkOption {
+ type = types.attrsOf types.lines;
+ default = {};
+ example = {
+ mypool = ''
+ listen = /run/phpfpm/mypool
+ user = nobody
+ pm = dynamic
+ pm.max_children = 75
+ pm.start_servers = 10
+ pm.min_spare_servers = 5
+ pm.max_spare_servers = 20
+ pm.max_requests = 500
+ '';
+ };
+ description = ''
+ A mapping between PHP FPM pool names and their configurations.
+ See the documentation on php-fpm.conf for
+ details on configuration directives. If no pools are defined,
+ the phpfpm service is disabled.
+ '';
+ };
+ };
+ };
+
+ config = mkIf (cfg.poolConfigs != {}) {
+
+ systemd.services.phpfpm = {
+ wantedBy = [ "multi-user.target" ];
+ preStart = ''
+ mkdir -p "${stateDir}"
+ '';
+ serviceConfig = {
+ ExecStart = "${cfg.phpPackage}/sbin/php-fpm -y ${cfgFile}";
+ PIDFile = pidFile;
+ };
+ };
+
+ };
+}
diff --git a/nixos/modules/services/web-servers/tomcat.nix b/nixos/modules/services/web-servers/tomcat.nix
index a68828de5d8e6d877f9f863e5ac90a46897af0f0..b5eee8f8be8ff15afe192e810a29f5580032e9f1 100644
--- a/nixos/modules/services/web-servers/tomcat.nix
+++ b/nixos/modules/services/web-servers/tomcat.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/web-servers/varnish/default.nix b/nixos/modules/services/web-servers/varnish/default.nix
index 7e327120c3d15946b8c898a1ae87453ab8a64176..364f6c68faca691989d82f90dae1ca83500e0fe7 100644
--- a/nixos/modules/services/web-servers/varnish/default.nix
+++ b/nixos/modules/services/web-servers/varnish/default.nix
@@ -1,9 +1,9 @@
-{ config, pkgs, ...}:
+{ config, lib, pkgs, ...}:
let
cfg = config.services.varnish;
in
-with pkgs.lib;
+with lib;
{
options = {
services.varnish = {
diff --git a/nixos/modules/services/web-servers/winstone.nix b/nixos/modules/services/web-servers/winstone.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7f48012f158e01153945e3220dd7625a6ae4bb3b
--- /dev/null
+++ b/nixos/modules/services/web-servers/winstone.nix
@@ -0,0 +1,129 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.winstone;
+
+ winstoneOpts = { name, ... }: {
+ options = {
+ name = mkOption {
+ default = name;
+ internal = true;
+ };
+
+ serviceName = mkOption {
+ type = types.str;
+ description = ''
+ The name of the systemd service. By default, it is
+ derived from the winstone instance name.
+ '';
+ };
+
+ warFile = mkOption {
+ type = types.str;
+ description = ''
+ The WAR file that Winstone should serve.
+ '';
+ };
+
+ javaPackage = mkOption {
+ type = types.package;
+ default = pkgs.openjre;
+ description = ''
+ Which Java derivation to use for running Winstone.
+ '';
+ };
+
+ user = mkOption {
+ type = types.str;
+ description = ''
+ The user that should run this Winstone process and
+ own the working directory.
+ '';
+ };
+
+ group = mkOption {
+ type = types.str;
+ description = ''
+ The group that will own the working directory.
+ '';
+ };
+
+ workDir = mkOption {
+ type = types.str;
+ description = ''
+ The working directory for this Winstone instance. Will
+ contain extracted webapps etc. The directory will be
+ created if it doesn't exist.
+ '';
+ };
+
+ extraJavaOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Extra command line options given to the java process running
+ Winstone.
+ '';
+ };
+
+ extraOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ Extra command line options given to the Winstone process.
+ '';
+ };
+ };
+
+ config = {
+ workDir = mkDefault "/run/winstone/${name}";
+ serviceName = mkDefault "winstone-${name}";
+ };
+ };
+
+ mkService = cfg: let
+ opts = concatStringsSep " " (cfg.extraOptions ++ [
+ "--warfile ${cfg.warFile}"
+ ]);
+
+ javaOpts = concatStringsSep " " (cfg.extraJavaOptions ++ [
+ "-Djava.io.tmpdir=${cfg.workDir}"
+ "-jar ${pkgs.winstone}/lib/winstone.jar"
+ ]);
+ in {
+ wantedBy = [ "multi-user.target" ];
+ description = "winstone service for ${cfg.name}";
+ preStart = ''
+ mkdir -p "${cfg.workDir}"
+ chown ${cfg.user}:${cfg.group} "${cfg.workDir}"
+ '';
+ serviceConfig = {
+ ExecStart = "${cfg.javaPackage}/bin/java ${javaOpts} ${opts}";
+ User = cfg.user;
+ PermissionsStartOnly = true;
+ };
+ };
+
+in {
+
+ options = {
+ services.winstone = mkOption {
+ default = {};
+ type = types.attrsOf types.optionSet;
+ options = [ winstoneOpts ];
+ description = ''
+ Defines independent Winstone services, each serving one WAR-file.
+ '';
+ };
+ };
+
+ config = mkIf (cfg != {}) {
+
+ systemd.services = mapAttrs' (n: c: nameValuePair c.serviceName (mkService c)) cfg;
+
+ };
+
+}
diff --git a/nixos/modules/services/web-servers/zope2.nix b/nixos/modules/services/web-servers/zope2.nix
index 576f4b08fb904047c8645c670157980ac56a1e3d..21117118457ddeff62808b8da944bb70a19e7f28 100644
--- a/nixos/modules/services/web-servers/zope2.nix
+++ b/nixos/modules/services/web-servers/zope2.nix
@@ -1,6 +1,6 @@
-{ pkgs, config, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/desktop-managers/default.nix b/nixos/modules/services/x11/desktop-managers/default.nix
index 035b23b4e1bba13c53ea92a87e379ad323a3f2f2..b82398ccf9ddd3dc6911a7ceb0da7517d47ea19d 100644
--- a/nixos/modules/services/x11/desktop-managers/default.nix
+++ b/nixos/modules/services/x11/desktop-managers/default.nix
@@ -1,15 +1,15 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
xcfg = config.services.xserver;
cfg = xcfg.desktopManager;
- # Whether desktop manager `d' is capable of setting a background.
- # If it isn't, the `feh' program is used as a fallback.
- needBGCond = d: ! (d ? bgSupport && d.bgSupport);
+ # If desktop manager `d' isn't capable of setting a background and
+ # the xserver is enabled, the `feh' program is used as a fallback.
+ needBGCond = d: ! (d ? bgSupport && d.bgSupport) && xcfg.enable;
in
@@ -17,7 +17,7 @@ in
# Note: the order in which desktop manager modules are imported here
# determines the default: later modules (if enabled) are preferred.
# E.g., if KDE is enabled, it supersedes xterm.
- imports = [ ./none.nix ./xterm.nix ./xfce.nix ./kde4.nix ./e17.nix ];
+ imports = [ ./none.nix ./xterm.nix ./xfce.nix ./kde4.nix ./e17.nix ./gnome3.nix ./xbmc.nix ];
options = {
diff --git a/nixos/modules/services/x11/desktop-managers/e17.nix b/nixos/modules/services/x11/desktop-managers/e17.nix
index 3d91617c62aa16001e18db482577c479b2f2eed2..4cac53c9c75b9fe6608a862eba1431cd0e4c6888 100644
--- a/nixos/modules/services/x11/desktop-managers/e17.nix
+++ b/nixos/modules/services/x11/desktop-managers/e17.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/desktop-managers/gnome3.nix b/nixos/modules/services/x11/desktop-managers/gnome3.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4620bc6722afc6795d466e1f4e24be3a9a1615e7
--- /dev/null
+++ b/nixos/modules/services/x11/desktop-managers/gnome3.nix
@@ -0,0 +1,129 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.xserver.desktopManager.gnome3;
+ gnome3 = pkgs.gnome3;
+
+ # Remove packages of ys from xs, based on their names
+ removePackagesByName = xs: ys:
+ let
+ pkgName = drv: (builtins.parseDrvName drv.name).name;
+ ysNames = map pkgName ys;
+ res = (filter (x: !(builtins.elem (pkgName x) ysNames)) xs);
+ in
+ filter (x: !(builtins.elem (pkgName x) ysNames)) xs;
+
+in {
+
+ options = {
+
+ services.xserver.desktopManager.gnome3.enable = mkOption {
+ default = false;
+ example = true;
+ description = "Enable Gnome 3 desktop manager.";
+ };
+
+ environment.gnome3.excludePackages = mkOption {
+ default = [];
+ example = "[ pkgs.gnome3.totem ]";
+ type = types.listOf types.package;
+ description = "Which packages gnome should exclude from the default environment";
+ };
+
+ };
+
+ config = mkIf cfg.enable {
+
+ # Enable helpful DBus services.
+ security.polkit.enable = true;
+ services.udisks2.enable = true;
+ services.accounts-daemon.enable = true;
+ services.gnome3.at-spi2-core.enable = true;
+ services.gnome3.evolution-data-server.enable = true;
+ services.gnome3.gnome-keyring.enable = true;
+ services.gnome3.gnome-online-accounts.enable = mkDefault true;
+ services.gnome3.gnome-user-share.enable = mkDefault true;
+ services.gnome3.sushi.enable = mkDefault true;
+ services.gnome3.tracker.enable = mkDefault true;
+ hardware.pulseaudio.enable = mkDefault true;
+ services.telepathy.enable = mkDefault true;
+ networking.networkmanager.enable = true;
+ services.upower.enable = config.powerManagement.enable;
+
+ fonts.extraFonts = [ pkgs.dejavu_fonts ];
+
+ services.xserver.desktopManager.session = singleton
+ { name = "gnome3";
+ start = ''
+ # Set GTK_DATA_PREFIX so that GTK+ can find the themes
+ export GTK_DATA_PREFIX=${config.system.path}
+
+ # find theme engines
+ export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0
+
+ export XDG_MENU_PREFIX=gnome
+
+ # Don't let epiphany depend upon gnome-shell
+ export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${pkgs.gnome3.gnome_shell}/share/gsettings-schemas/${pkgs.gnome3.gnome_shell.name}
+
+ # Let gnome-control-center find gnome-shell search providers
+ export GNOME_SEARCH_PROVIDERS_DIR=${config.system.path}/share/gnome-shell/search-providers/
+
+ # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/
+ ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update
+
+ ${gnome3.gnome_session}/bin/gnome-session&
+ waitPID=$!
+ '';
+ };
+
+ environment.variables.GIO_EXTRA_MODULES = [ "${gnome3.dconf}/lib/gio/modules"
+ "${pkgs.glib_networking}/lib/gio/modules" ];
+ environment.systemPackages =
+ [ pkgs.desktop_file_utils
+ pkgs.glib_networking
+ pkgs.gtk3 # for gtk-update-icon-cache
+ pkgs.ibus
+ pkgs.shared_mime_info # for update-mime-database
+ gnome3.dconf
+ gnome3.gnome-backgrounds
+ gnome3.gnome_control_center
+ gnome3.gnome_icon_theme
+ gnome3.gnome-menus
+ gnome3.gnome_settings_daemon
+ gnome3.gnome_shell
+ gnome3.gnome_themes_standard
+ ] ++ (removePackagesByName [
+ gnome3.baobab
+ gnome3.empathy
+ gnome3.eog
+ gnome3.epiphany
+ gnome3.evince
+ gnome3.gucharmap
+ gnome3.nautilus
+ gnome3.totem
+ gnome3.vino
+ gnome3.yelp
+ gnome3.gnome-calculator
+ gnome3.gnome-contacts
+ gnome3.gnome-font-viewer
+ gnome3.gnome-screenshot
+ gnome3.gnome-shell-extensions
+ gnome3.gnome-system-log
+ gnome3.gnome-system-monitor
+ gnome3.gnome_terminal
+ gnome3.gnome-user-docs
+
+ gnome3.file-roller
+ gnome3.gnome-tweak-tool
+ ] config.environment.gnome3.excludePackages);
+
+ # Needed for themes and backgrounds
+ environment.pathsToLink = [ "/share" ];
+
+ };
+
+
+}
diff --git a/nixos/modules/services/x11/desktop-managers/kde4.nix b/nixos/modules/services/x11/desktop-managers/kde4.nix
index 108b52bb951dd5cc9575ac5425a760a1e8c91f41..26b0612671c40548be2b6ec7dea3ce9f94545945 100644
--- a/nixos/modules/services/x11/desktop-managers/kde4.nix
+++ b/nixos/modules/services/x11/desktop-managers/kde4.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -159,7 +159,7 @@ in
# Enable helpful DBus services.
services.udisks.enable = ! wantsUdisks2;
- services.udisks2.enable = wantsUdisks2;
+ services.udisks2.enable = true;
services.upower.enable = config.powerManagement.enable;
security.pam.services.kde = { allowNullPassword = true; };
diff --git a/nixos/modules/services/x11/desktop-managers/xbmc.nix b/nixos/modules/services/x11/desktop-managers/xbmc.nix
new file mode 100644
index 0000000000000000000000000000000000000000..97e966ca01974a9d19442af9bb96fb021bcd9690
--- /dev/null
+++ b/nixos/modules/services/x11/desktop-managers/xbmc.nix
@@ -0,0 +1,31 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.xserver.desktopManager.xbmc;
+in
+
+{
+ options = {
+ services.xserver.desktopManager.xbmc = {
+ enable = mkOption {
+ default = false;
+ example = true;
+ description = "Enable the xbmc multimedia center.";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services.xserver.desktopManager.session = [{
+ name = "xbmc";
+ start = ''
+ ${pkgs.xbmc}/bin/xbmc --lircdev /var/run/lirc/lircd --standalone &
+ waitPID=$!
+ '';
+ }];
+
+ environment.systemPackages = [ pkgs.xbmc ];
+ };
+}
\ No newline at end of file
diff --git a/nixos/modules/services/x11/desktop-managers/xfce.nix b/nixos/modules/services/x11/desktop-managers/xfce.nix
index 5e5fab3ed2bb32d88d375c908181874b311a77c9..a72eea76239f3482c50b6bd0c2559987b26ac7a4 100644
--- a/nixos/modules/services/x11/desktop-managers/xfce.nix
+++ b/nixos/modules/services/x11/desktop-managers/xfce.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -29,7 +29,7 @@ in
start =
''
# Set GTK_PATH so that GTK+ can find the theme engines.
- export GTK_PATH=${config.system.path}/lib/gtk-2.0
+ export GTK_PATH="${config.system.path}/lib/gtk-2.0:${config.system.path}/lib/gtk-3.0"
# Set GTK_DATA_PREFIX so that GTK+ can find the Xfce themes.
export GTK_DATA_PREFIX=${config.system.path}
@@ -81,7 +81,7 @@ in
environment.pathsToLink =
[ "/share/xfce4" "/share/themes" "/share/mime" "/share/desktop-directories" "/share/gtksourceview-2.0" ];
- environment.variables.GIO_EXTRA_MODULES = "${pkgs.xfce.gvfs}/lib/gio/modules";
+ environment.variables.GIO_EXTRA_MODULES = [ "${pkgs.xfce.gvfs}/lib/gio/modules" ];
# Enable helpful DBus services.
services.udisks2.enable = true;
diff --git a/nixos/modules/services/x11/desktop-managers/xterm.nix b/nixos/modules/services/x11/desktop-managers/xterm.nix
index edc61c103ea9fa5a6d8edac8379cd282b69844e8..eab914071410e429f6c934f32e5082adc528e3a7 100644
--- a/nixos/modules/services/x11/desktop-managers/xterm.nix
+++ b/nixos/modules/services/x11/desktop-managers/xterm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -19,7 +19,7 @@ in
};
- config = mkIf cfg.enable {
+ config = mkIf (config.services.xserver.enable && cfg.enable) {
services.xserver.desktopManager.session = singleton
{ name = "xterm";
diff --git a/nixos/modules/services/x11/display-managers/auto.nix b/nixos/modules/services/x11/display-managers/auto.nix
index 33d97e0e07a95c321772a33bf3d3a7fa621d0dd5..c02ccdf12b65b4a3ad0432ac127a6f80efdd6756 100644
--- a/nixos/modules/services/x11/display-managers/auto.nix
+++ b/nixos/modules/services/x11/display-managers/auto.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/display-managers/default.nix b/nixos/modules/services/x11/display-managers/default.nix
index 575386bac0aabf57b61ebf19d240bda302019a9c..3bf18bd58c842c95e91c2a571fe223062fdf7b04 100644
--- a/nixos/modules/services/x11/display-managers/default.nix
+++ b/nixos/modules/services/x11/display-managers/default.nix
@@ -7,9 +7,9 @@
# (e.g., KDE, Gnome or a plain xterm), and optionally the *window
# manager* (e.g. kwin or twm).
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -51,17 +51,6 @@ let
''}
- ${optionalString cfg.startOpenSSHAgent ''
- if test -z "$SSH_AUTH_SOCK"; then
- # Restart this script as a child of the SSH agent. (It is
- # also possible to start the agent as a child that prints
- # the required environment variabled on stdout, but in
- # that mode ssh-agent is not terminated when we log out.)
- export SSH_ASKPASS=${pkgs.x11_ssh_askpass}/libexec/x11-ssh-askpass
- exec ${pkgs.openssh}/bin/ssh-agent "$0" "$sessionType"
- fi
- ''}
-
${optionalString cfg.startGnuPGAgent ''
if test -z "$SSH_AUTH_SOCK"; then
# Restart this script as a child of the GnuPG agent.
diff --git a/nixos/modules/services/x11/display-managers/kdm.nix b/nixos/modules/services/x11/display-managers/kdm.nix
index c51e7edfddf3dc366e77cace34e9d99c5bc6216f..7ec489ae3e73fe5cee9cd0befdf116667fba82cb 100644
--- a/nixos/modules/services/x11/display-managers/kdm.nix
+++ b/nixos/modules/services/x11/display-managers/kdm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/display-managers/lightdm.nix b/nixos/modules/services/x11/display-managers/lightdm.nix
index e4125891e6cbd340a27970c4510fe394d78a4bf4..d459c59b0483c0ad668a2054fa81b7e00c256fba 100644
--- a/nixos/modules/services/x11/display-managers/lightdm.nix
+++ b/nixos/modules/services/x11/display-managers/lightdm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -55,8 +55,8 @@ let
''
[LightDM]
greeter-user = ${config.users.extraUsers.lightdm.name}
- xgreeters-directory = ${cfg.greeter.package}
- xsessions-directory = ${dmcfg.session.desktops}
+ greeters-directory = ${cfg.greeter.package}
+ sessions-directory = ${dmcfg.session.desktops}
[SeatDefaults]
xserver-command = ${xserverWrapper}
diff --git a/nixos/modules/services/x11/display-managers/slim.nix b/nixos/modules/services/x11/display-managers/slim.nix
index 35834ef3764b5f76c99faa8b781b5ee6d9481c20..114d34557a072b171d1e44bcf995d1c2718e3c2f 100644
--- a/nixos/modules/services/x11/display-managers/slim.nix
+++ b/nixos/modules/services/x11/display-managers/slim.nix
@@ -1,10 +1,11 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
dmcfg = config.services.xserver.displayManager;
+
cfg = dmcfg.slim;
slimConfig = pkgs.writeText "slim.cfg"
@@ -109,6 +110,12 @@ in
execCmd = "exec ${pkgs.slim}/bin/slim";
};
+ services.xserver.displayManager.sessionCommands =
+ ''
+ # Export the config/themes for slimlock.
+ export SLIM_THEMESDIR=${slimThemesDir}
+ '';
+
# Allow null passwords so that the user can login as root on the
# installation CD.
security.pam.services.slim = { allowNullPassword = true; startSession = true; };
diff --git a/nixos/modules/services/x11/hardware/multitouch.nix b/nixos/modules/services/x11/hardware/multitouch.nix
index 4f9048bfd910be7d1b7610a953587086bcb7a596..6e6e88e672180c61b665a0cde12f4c3bd61ba66f 100644
--- a/nixos/modules/services/x11/hardware/multitouch.nix
+++ b/nixos/modules/services/x11/hardware/multitouch.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let cfg = config.services.xserver.multitouch; in
diff --git a/nixos/modules/services/x11/hardware/synaptics.nix b/nixos/modules/services/x11/hardware/synaptics.nix
index 91e01f2e30b178af142d54f661525d7ff2fbdcff..f2227a34a20c050b0013f1dedff2f4c55457c2bb 100644
--- a/nixos/modules/services/x11/hardware/synaptics.nix
+++ b/nixos/modules/services/x11/hardware/synaptics.nix
@@ -1,10 +1,24 @@
-{ config, pkgs, ... }:
-
-with pkgs.lib;
-
-let cfg = config.services.xserver.synaptics; in
-
-{
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let cfg = config.services.xserver.synaptics;
+ tapConfig = if cfg.tapButtons then enabledTapConfig else disabledTapConfig;
+ enabledTapConfig = ''
+ Option "MaxTapTime" "180"
+ Option "MaxTapMove" "220"
+ Option "TapButton1" "${builtins.elemAt cfg.buttonsMap 0}"
+ Option "TapButton2" "${builtins.elemAt cfg.buttonsMap 1}"
+ Option "TapButton3" "${builtins.elemAt cfg.buttonsMap 2}"
+ '';
+ disabledTapConfig = ''
+ Option "MaxTapTime" "0"
+ Option "MaxTapMove" "0"
+ Option "TapButton1" "0"
+ Option "TapButton2" "0"
+ Option "TapButton3" "0"
+ '';
+in {
options = {
@@ -106,15 +120,10 @@ let cfg = config.services.xserver.synaptics; in
MatchIsTouchpad "on"
${optionalString (cfg.dev != null) ''MatchDevicePath "${cfg.dev}"''}
Driver "synaptics"
- Option "MaxTapTime" "180"
- Option "MaxTapMove" "220"
Option "MinSpeed" "${cfg.minSpeed}"
Option "MaxSpeed" "${cfg.maxSpeed}"
Option "AccelFactor" "${cfg.accelFactor}"
- ${if cfg.tapButtons then "" else ''Option "MaxTapTime" "0"''}
- Option "TapButton1" "${builtins.elemAt cfg.buttonsMap 0}"
- Option "TapButton2" "${builtins.elemAt cfg.buttonsMap 1}"
- Option "TapButton3" "${builtins.elemAt cfg.buttonsMap 2}"
+ ${optionalString cfg.tapButtons tapConfig}
Option "ClickFinger1" "${builtins.elemAt cfg.buttonsMap 0}"
Option "ClickFinger2" "${builtins.elemAt cfg.buttonsMap 1}"
Option "ClickFinger3" "${builtins.elemAt cfg.buttonsMap 2}"
diff --git a/nixos/modules/services/x11/hardware/wacom.nix b/nixos/modules/services/x11/hardware/wacom.nix
index dfc588cd21322c3fff538e786ce601f3f281493c..540ed168b4895a18663bc0e821ef7dd43ef8bfcd 100644
--- a/nixos/modules/services/x11/hardware/wacom.nix
+++ b/nixos/modules/services/x11/hardware/wacom.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/redshift.nix b/nixos/modules/services/x11/redshift.nix
index b9ad962d8e46b8ab97049701272f76020cf2011d..d73b58de6c08d6841525797b827d01677e8f3ac2 100644
--- a/nixos/modules/services/x11/redshift.nix
+++ b/nixos/modules/services/x11/redshift.nix
@@ -1,5 +1,5 @@
-{ config, pkgs, ... }:
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
let
cfg = config.services.redshift;
@@ -14,24 +14,37 @@ in {
services.redshift.latitude = mkOption {
description = "Your current latitude";
- type = types.string;
+ type = types.uniq types.string;
};
services.redshift.longitude = mkOption {
description = "Your current longitude";
- type = types.string;
+ type = types.uniq types.string;
};
services.redshift.temperature = {
day = mkOption {
description = "Colour temperature to use during day time";
default = 5500;
- type = types.int;
+ type = types.uniq types.int;
};
night = mkOption {
description = "Colour temperature to use during night time";
default = 3700;
- type = types.int;
+ type = types.uniq types.int;
+ };
+ };
+
+ services.redshift.brightness = {
+ day = mkOption {
+ description = "Screen brightness to apply during the day (between 0.1 and 1.0)";
+ default = "1";
+ type = types.uniq types.string;
+ };
+ night = mkOption {
+ description = "Screen brightness to apply during the night (between 0.1 and 1.0)";
+ default = "1";
+ type = types.uniq types.string;
};
};
};
@@ -41,10 +54,12 @@ in {
description = "Redshift colour temperature adjuster";
requires = [ "display-manager.service" ];
after = [ "display-manager.service" ];
- script = ''
+ wantedBy = [ "graphical.target" ];
+ serviceConfig.ExecStart = ''
${pkgs.redshift}/bin/redshift \
-l ${cfg.latitude}:${cfg.longitude} \
- -t ${toString cfg.temperature.day}:${toString cfg.temperature.night}
+ -t ${toString cfg.temperature.day}:${toString cfg.temperature.night} \
+ -b ${toString cfg.brightness.day}:${toString cfg.brightness.night}
'';
environment = { DISPLAY = ":0"; };
serviceConfig.Restart = "always";
diff --git a/nixos/modules/services/x11/terminal-server.nix b/nixos/modules/services/x11/terminal-server.nix
index bf9c3435503dcbef43e49908f0a2d1ba5bf0965b..bdc23c0acd1837b1893a869e1cf56e6ff0df67bb 100644
--- a/nixos/modules/services/x11/terminal-server.nix
+++ b/nixos/modules/services/x11/terminal-server.nix
@@ -5,9 +5,9 @@
# not, a X server (Xvfb) is started for that user. The Xvfb instances
# persist across VNC sessions.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -27,7 +27,7 @@ in
config = {
services.xserver.enable = true;
- services.xserver.videoDrivers = [];
+ hardware.opengl.videoDrivers = [];
# Enable KDM. Any display manager will do as long as it supports XDMCP.
services.xserver.displayManager.kdm.enable = true;
diff --git a/nixos/modules/services/x11/window-managers/awesome.nix b/nixos/modules/services/x11/window-managers/awesome.nix
index 1c61419a44c04dd691b4a5eb4e8a98fcd5bfcf57..9b2f042a87a67fa36353ffbe5ce44ef7745b8f87 100644
--- a/nixos/modules/services/x11/window-managers/awesome.nix
+++ b/nixos/modules/services/x11/window-managers/awesome.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/compiz.nix b/nixos/modules/services/x11/window-managers/compiz.nix
index 209401f26468b9c7d5d8461a23f2a777d06e4c3a..ffd71e5f91ec097ddfe6de32471ed093abab7ff4 100644
--- a/nixos/modules/services/x11/window-managers/compiz.nix
+++ b/nixos/modules/services/x11/window-managers/compiz.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/default.nix b/nixos/modules/services/x11/window-managers/default.nix
index 4d52e398b47742a086879778a72b4bdeb0e060f8..f27ba366141317936035d95a46145d58329003bc 100644
--- a/nixos/modules/services/x11/window-managers/default.nix
+++ b/nixos/modules/services/x11/window-managers/default.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.xserver.windowManager;
@@ -16,7 +16,6 @@ in
./wmii.nix
./xmonad.nix
./i3.nix
- ./xbmc.nix
./herbstluftwm.nix
];
diff --git a/nixos/modules/services/x11/window-managers/herbstluftwm.nix b/nixos/modules/services/x11/window-managers/herbstluftwm.nix
index 9480abba43b7ec3a84128709e1dbacf8dfcc2802..6cda910b6b331f214deb9a1f3ad040ef74458c49 100644
--- a/nixos/modules/services/x11/window-managers/herbstluftwm.nix
+++ b/nixos/modules/services/x11/window-managers/herbstluftwm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.xserver.windowManager.herbstluftwm;
diff --git a/nixos/modules/services/x11/window-managers/i3.nix b/nixos/modules/services/x11/window-managers/i3.nix
index e53d86187ae69ae915f2f871c0b5ea6a3751b714..e85c3bce591d9e81476db9b676a408af29da82a2 100644
--- a/nixos/modules/services/x11/window-managers/i3.nix
+++ b/nixos/modules/services/x11/window-managers/i3.nix
@@ -1,6 +1,6 @@
-{ pkgs, config, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.services.xserver.windowManager.i3;
diff --git a/nixos/modules/services/x11/window-managers/icewm.nix b/nixos/modules/services/x11/window-managers/icewm.nix
index b7da4051c141995cd9e358ba6a20eca101ebdd2e..36028da453a5c62da3b5b21846554081509ef9c9 100644
--- a/nixos/modules/services/x11/window-managers/icewm.nix
+++ b/nixos/modules/services/x11/window-managers/icewm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/metacity.nix b/nixos/modules/services/x11/window-managers/metacity.nix
index 712e2038594ebd0e8ee626d3f13221fe42e9a861..d13cbcfe40e8391ccb8fdf1435ef5b6e4babae3b 100644
--- a/nixos/modules/services/x11/window-managers/metacity.nix
+++ b/nixos/modules/services/x11/window-managers/metacity.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/twm.nix b/nixos/modules/services/x11/window-managers/twm.nix
index d80ffe4942fb03d3da29a44c39002541dcd677d1..684b34c2f246a52e3b5906b55e69456fc4801bea 100644
--- a/nixos/modules/services/x11/window-managers/twm.nix
+++ b/nixos/modules/services/x11/window-managers/twm.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/wmii.nix b/nixos/modules/services/x11/window-managers/wmii.nix
index b61521274fbaffbd41676289117ede0dfa203665..75f6fdfe3bc467b921961725ba4e0f1c0959f304 100644
--- a/nixos/modules/services/x11/window-managers/wmii.nix
+++ b/nixos/modules/services/x11/window-managers/wmii.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/window-managers/xbmc.nix b/nixos/modules/services/x11/window-managers/xbmc.nix
deleted file mode 100644
index 46494202b404bf5f6f665db4f4f94fdd442cc1f0..0000000000000000000000000000000000000000
--- a/nixos/modules/services/x11/window-managers/xbmc.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{pkgs, config, ...}:
-
-let
- inherit (pkgs.lib) mkOption mkIf;
- cfg = config.services.xserver.windowManager.xbmc;
-in
-
-{
- options = {
- services.xserver.windowManager.xbmc = {
- enable = mkOption {
- default = false;
- example = true;
- description = "Enable the xbmc multimedia center.";
- };
- };
- };
-
- config = mkIf cfg.enable {
- services.xserver.windowManager = {
- session = [{
- name = "xbmc";
- start = "
- ${pkgs.xbmc}/bin/xbmc --lircdev /var/run/lirc/lircd --standalone &
- waitPID=$!
- ";
- }];
- };
- environment.systemPackages = [ pkgs.xbmc ];
- };
-}
diff --git a/nixos/modules/services/x11/xfs.nix b/nixos/modules/services/x11/xfs.nix
index 44c1d533c3acd85a7d784c19c56bd56a77cb2b82..196f3beb41e9404129269dfa513bfe00b905f561 100644
--- a/nixos/modules/services/x11/xfs.nix
+++ b/nixos/modules/services/x11/xfs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/services/x11/xserver.nix b/nixos/modules/services/x11/xserver.nix
index 5600ce7fac137b0a930e38e8ad8ef17b7ca23bd5..65f93b544996534a28a096cd6209490abdd4d345 100644
--- a/nixos/modules/services/x11/xserver.nix
+++ b/nixos/modules/services/x11/xserver.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, pkgs_i686, ... }:
+{ config, lib, pkgs, pkgs_i686, ... }:
-with pkgs.lib;
+with lib;
let
@@ -20,9 +20,16 @@ let
nvidiaLegacy304 = { modules = [ kernelPackages.nvidia_x11_legacy304 ]; driverName = "nvidia"; };
unichrome = { modules = [ pkgs.xorgVideoUnichrome ]; };
virtualbox = { modules = [ kernelPackages.virtualboxGuestAdditions ]; driverName = "vboxvideo"; };
+ ati = { modules = [ pkgs.xorg.xf86videoati pkgs.xorg.glamoregl ]; };
+ intel-testing = { modules = with pkgs.xorg; [ xf86videointel-testing glamoregl ]; driverName = "intel"; };
};
- driverNames = config.services.mesa.videoDrivers;
+ driverNames = config.hardware.opengl.videoDrivers;
+
+ needsAcpid =
+ (elem "nvidia" driverNames) ||
+ (elem "nvidiaLegacy173" driverNames) ||
+ (elem "nvidiaLegacy304" driverNames);
drivers = flip map driverNames
(name: { inherit name; driverName = name; } //
@@ -181,7 +188,7 @@ in
description = ''
The name of the video driver for your graphics card. This
option is obsolete; please set the
- instead.
+ instead.
'';
};
@@ -194,17 +201,6 @@ in
'';
};
- startOpenSSHAgent = mkOption {
- type = types.bool;
- default = true;
- description = ''
- Whether to start the OpenSSH agent when you log in. The OpenSSH agent
- remembers private keys for you so that you don't have to type in
- passphrases every time you make an SSH connection. Use
- ssh-add to add a key to the agent.
- '';
- };
-
startGnuPGAgent = mkOption {
type = types.bool;
default = false;
@@ -372,6 +368,14 @@ in
'';
};
+ useGlamor = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to use the Glamor module for 2D acceleration,
+ if possible.
+ '';
+ };
};
};
@@ -381,15 +385,15 @@ in
###### implementation
config = mkIf cfg.enable {
- services.mesa.enable = true;
- services.mesa.videoDrivers = mkIf (cfg.videoDriver != null) [ cfg.videoDriver ];
+ hardware.opengl.enable = true;
+ hardware.opengl.videoDrivers = mkIf (cfg.videoDriver != null) [ cfg.videoDriver ];
assertions =
- [ { assertion = !(cfg.startOpenSSHAgent && cfg.startGnuPGAgent);
+ [ { assertion = !(config.programs.ssh.startAgent && cfg.startGnuPGAgent);
message =
''
- The OpenSSH agent and GnuPG agent cannot be started both.
- Choose between `startOpenSSHAgent' and `startGnuPGAgent'.
+ The OpenSSH agent and GnuPG agent cannot be started both. Please
+ choose between ‘programs.ssh.startAgent’ and ‘services.xserver.startGnuPGAgent’.
'';
}
{ assertion = config.security.polkit.enable;
@@ -428,6 +432,8 @@ in
++ optional (elem "virtualbox" driverNames) xorg.xrefresh
++ optional (elem "ati_unfree" driverNames) kernelPackages.ati_drivers_x11;
+ services.acpid.enable = mkIf needsAcpid true;
+
environment.pathsToLink =
[ "/etc/xdg" "/share/xdg" "/share/applications" "/share/icons" "/share/pixmaps" ];
@@ -436,7 +442,8 @@ in
systemd.services."display-manager" =
{ description = "X11 Server";
- after = [ "systemd-udev-settle.service" "local-fs.target" ];
+ after = [ "systemd-udev-settle.service" "local-fs.target" ]
+ ++ optional needsAcpid "acpid.service";
restartIfChanged = false;
@@ -523,6 +530,13 @@ in
'')}
EndSection
+ ${if cfg.useGlamor then ''
+ Section "Module"
+ Load "dri2"
+ Load "glamoregl"
+ EndSection
+ '' else ""}
+
# For each supported driver, add a "Device" and "Screen"
# section.
${flip concatMapStrings drivers (driver: ''
@@ -530,6 +544,7 @@ in
Section "Device"
Identifier "Device-${driver.name}[0]"
Driver "${driver.driverName}"
+ ${if cfg.useGlamor then ''Option "AccelMethod" "glamor"'' else ""}
${cfg.deviceSection}
${xrandrDeviceSection}
EndSection
diff --git a/nixos/modules/system/activation/activation-script.nix b/nixos/modules/system/activation/activation-script.nix
index 1545bcb8a1f9c277f272ed4eebfc060ec4e7d4c6..41fe7d309a5a433a70685039d421b345e70a5ac7 100644
--- a/nixos/modules/system/activation/activation-script.nix
+++ b/nixos/modules/system/activation/activation-script.nix
@@ -1,7 +1,7 @@
# generate the script used to activate the configuration.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/system/activation/no-clone.nix b/nixos/modules/system/activation/no-clone.nix
index c9ab691ce477ab190c58c8762145497ba868d92f..7f4584435266ba1a50587e6b828a5230e8bcbbaf 100644
--- a/nixos/modules/system/activation/no-clone.nix
+++ b/nixos/modules/system/activation/no-clone.nix
@@ -1,6 +1,6 @@
-{pkgs, ...}:
+{ lib, ... }:
-with pkgs.lib;
+with lib;
{
boot.loader.grub.device = mkOverride 0 "nodev";
diff --git a/nixos/modules/system/activation/switch-to-configuration.pl b/nixos/modules/system/activation/switch-to-configuration.pl
index 91beed1130eb930155aa586dabf3a9bad9057adb..25b5afe99da4c6535960f0a93d7aa1eb1e1d5e66 100644
--- a/nixos/modules/system/activation/switch-to-configuration.pl
+++ b/nixos/modules/system/activation/switch-to-configuration.pl
@@ -27,7 +27,10 @@ EOF
exit 1;
}
-die "This is not a NixOS installation (/etc/NIXOS is missing)!\n" unless -f "/etc/NIXOS";
+# This is a NixOS installation if it has /etc/NIXOS or a proper
+# /etc/os-release.
+die "This is not a NixOS installation!\n" unless
+ -f "/etc/NIXOS" || (read_file("/etc/os-release", err_mode => 'quiet') // "") =~ /ID=nixos/s;
openlog("nixos", "", LOG_USER);
@@ -96,12 +99,18 @@ sub parseFstab {
sub parseUnit {
my ($filename) = @_;
my $info = {};
- foreach my $line (read_file($filename)) {
+ parseKeyValues($info, read_file($filename));
+ parseKeyValues($info, read_file("${filename}.d/overrides.conf")) if -f "${filename}.d/overrides.conf";
+ return $info;
+}
+
+sub parseKeyValues {
+ my $info = shift;
+ foreach my $line (@_) {
# FIXME: not quite correct.
$line =~ /^([^=]+)=(.*)$/ or next;
$info->{$1} = $2;
}
- return $info;
}
sub boolIsTrue {
@@ -109,6 +118,14 @@ sub boolIsTrue {
return $s eq "yes" || $s eq "true";
}
+# As a fingerprint for determining whether a unit has changed, we use
+# its absolute path. If it has an override file, we append *its*
+# absolute path as well.
+sub fingerprintUnit {
+ my ($s) = @_;
+ return abs_path($s) . (-f "${s}.d/overrides.conf" ? " " . abs_path "${s}.d/overrides.conf" : "");
+}
+
# Stop all services that no longer exist or have changed in the new
# configuration.
my (@unitsToStop, @unitsToSkip);
@@ -125,7 +142,7 @@ while (my ($unit, $state) = each %{$activePrev}) {
$baseName =~ s/\.[a-z]*$//;
if (-e $prevUnitFile && ($state->{state} eq "active" || $state->{state} eq "activating")) {
- if (! -e $newUnitFile) {
+ if (! -e $newUnitFile || abs_path($newUnitFile) eq "/dev/null") {
push @unitsToStop, $unit;
}
@@ -160,7 +177,7 @@ while (my ($unit, $state) = each %{$activePrev}) {
}
}
- elsif (abs_path($prevUnitFile) ne abs_path($newUnitFile)) {
+ elsif (fingerprintUnit($prevUnitFile) ne fingerprintUnit($newUnitFile)) {
if ($unit eq "sysinit.target" || $unit eq "basic.target" || $unit eq "multi-user.target" || $unit eq "graphical.target") {
# Do nothing. These cannot be restarted directly.
} elsif ($unit =~ /\.mount$/) {
@@ -170,7 +187,10 @@ while (my ($unit, $state) = each %{$activePrev}) {
# FIXME: do something?
} else {
my $unitInfo = parseUnit($newUnitFile);
- if (!boolIsTrue($unitInfo->{'X-RestartIfChanged'} // "yes")) {
+ if (boolIsTrue($unitInfo->{'X-ReloadIfChanged'} // "no")) {
+ write_file($reloadListFile, { append => 1 }, "$unit\n");
+ }
+ elsif (!boolIsTrue($unitInfo->{'X-RestartIfChanged'} // "yes")) {
push @unitsToSkip, $unit;
} else {
# If this unit is socket-activated, then stop the
@@ -319,7 +339,7 @@ if (scalar @restart > 0) {
# that are symlinks to other units. We shouldn't start both at the
# same time because we'll get a "Failed to add path to set" error from
# systemd.
-my @start = unique("default.target", "timers.target", split('\n', read_file($startListFile, err_mode => 'quiet') // ""));
+my @start = unique("default.target", "timers.target", "sockets.target", split('\n', read_file($startListFile, err_mode => 'quiet') // ""));
print STDERR "starting the following units: ", join(", ", sort(@start)), "\n";
$systemdManager->StartUnit($_, "replace") for @start;
unlink($startListFile);
diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix
index 30a529988a96fb285130d92f20bb026610af3af5..1600a1fb01041acd920fea17192b79e72af65a05 100644
--- a/nixos/modules/system/activation/top-level.nix
+++ b/nixos/modules/system/activation/top-level.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, modules, baseModules, ... }:
+{ config, lib, pkgs, modules, baseModules, ... }:
-with pkgs.lib;
+with lib;
let
@@ -11,7 +11,7 @@ let
# you can provide an easy way to boot the same configuration
# as you use, but with another kernel
# !!! fix this
- cloner = inheritParent: list: with pkgs.lib;
+ cloner = inheritParent: list:
map (childConfig:
(import ../../../lib/eval-config.nix {
inherit baseModules;
@@ -68,6 +68,7 @@ let
echo -n "$configurationName" > $out/configuration-name
echo -n "systemd ${toString config.systemd.package.interfaceVersion}" > $out/init-interface-version
echo -n "$nixosVersion" > $out/nixos-version
+ echo -n "$system" > $out/system
mkdir $out/fine-tune
childCount=0
diff --git a/nixos/modules/system/boot/kernel.nix b/nixos/modules/system/boot/kernel.nix
index 2b075bf6a6d2b318b1783fd3a4dba456feeacffa..b81bcf20f439f21bea40df944655ea80b2f0d9fb 100644
--- a/nixos/modules/system/boot/kernel.nix
+++ b/nixos/modules/system/boot/kernel.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -159,7 +159,7 @@ in
boot.kernel.sysctl."kernel.printk" = config.boot.consoleLogLevel;
- boot.kernelModules = [ "loop" ];
+ boot.kernelModules = [ "loop" "configs" ];
boot.initrd.availableKernelModules =
[ # Note: most of these (especially the SATA/PATA modules)
@@ -203,6 +203,9 @@ in
# To wait for SCSI devices to appear.
"scsi_wait_scan"
+
+ # Needed by the stage 2 init script.
+ "rtc_cmos"
];
boot.initrd.kernelModules =
@@ -215,37 +218,26 @@ in
# Create /etc/modules-load.d/nixos.conf, which is read by
# systemd-modules-load.service to load required kernel modules.
- # FIXME: ensure that systemd-modules-load.service is restarted if
- # this file changes.
environment.etc = singleton
{ target = "modules-load.d/nixos.conf";
source = kernelModulesConf;
};
- # Sigh. This overrides systemd's systemd-modules-load.service
- # just so we can set a restart trigger. Also make
- # multi-user.target pull it in so that it gets started if it
- # failed earlier.
systemd.services."systemd-modules-load" =
- { description = "Load Kernel Modules";
- wantedBy = [ "sysinit.target" "multi-user.target" ];
- before = [ "sysinit.target" "shutdown.target" ];
- conflicts = [ "shutdown.target" ];
- unitConfig =
- { DefaultDependencies = false;
- ConditionCapability = "CAP_SYS_MODULE";
- };
+ { wantedBy = [ "multi-user.target" ];
+ restartTriggers = [ kernelModulesConf ];
+ environment.MODULE_DIR = "/run/booted-system/kernel-modules/lib/modules";
serviceConfig =
- { Type = "oneshot";
- RemainAfterExit = true;
- ExecStart = "${config.systemd.package}/lib/systemd/systemd-modules-load";
- # Ignore failed module loads. Typically some of the
+ { # Ignore failed module loads. Typically some of the
# modules in ‘boot.kernelModules’ are "nice to have but
# not required" (e.g. acpi-cpufreq), so we don't want to
# barf on those.
SuccessExitStatus = "0 1";
};
- restartTriggers = [ kernelModulesConf ];
+ };
+
+ systemd.services.kmod-static-nodes =
+ { environment.MODULE_DIR = "/run/booted-system/kernel-modules/lib/modules";
};
lib.kernelConfig = {
diff --git a/nixos/modules/system/boot/loader/efi.nix b/nixos/modules/system/boot/loader/efi.nix
index 7e739173f9a3006a4bfbf5b10d17e180014cf11e..241cfc7e836d97b1f929b8f23b8e582d329cc525 100644
--- a/nixos/modules/system/boot/loader/efi.nix
+++ b/nixos/modules/system/boot/loader/efi.nix
@@ -1,6 +1,6 @@
-{ pkgs, ... }:
+{ lib, ... }:
-with pkgs.lib;
+with lib;
{
options.boot.loader.efi = {
diff --git a/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix b/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix
index 9855c8c19dd0b896f940fb8547c0cda587b2c1c4..4b5e84f53c1ac767719912b243187e34fc16caa6 100644
--- a/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix
+++ b/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/system/boot/loader/grub/grub.nix b/nixos/modules/system/boot/loader/grub/grub.nix
index ef6ff71ed77843dfaaabd87da7539e23c5803b5a..a3b09223cbb886c825028d95e0c7f1462a6dc205 100644
--- a/nixos/modules/system/boot/loader/grub/grub.nix
+++ b/nixos/modules/system/boot/loader/grub/grub.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -133,11 +133,8 @@ in
chainloader (hd0,1)+1
# GRUB 2 example
- menuentry "Windows7" {
- title Windows7
- insmod ntfs
- set root='(hd1,1)'
- chainloader +1
+ menuentry "Windows 7" {
+ chainloader (hd0,4)+1
}
'';
description = ''
diff --git a/nixos/modules/system/boot/loader/grub/memtest.nix b/nixos/modules/system/boot/loader/grub/memtest.nix
index 80c1a160cfde4036220aff8a7a8eaf3dc3d93890..94e5a14174b0d8e7061cc5d7a6b0f09921261d1e 100644
--- a/nixos/modules/system/boot/loader/grub/memtest.nix
+++ b/nixos/modules/system/boot/loader/grub/memtest.nix
@@ -1,33 +1,87 @@
# This module adds Memtest86+ to the GRUB boot menu.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
memtest86 = pkgs.memtest86plus;
+ cfg = config.boot.loader.grub.memtest86;
in
{
options = {
- boot.loader.grub.memtest86 = mkOption {
- default = false;
- type = types.bool;
- description = ''
- Make Memtest86+, a memory testing program, available from the
- GRUB boot menu.
- '';
+ boot.loader.grub.memtest86 = {
+
+ enable = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Make Memtest86+, a memory testing program, available from the
+ GRUB boot menu.
+ '';
+ };
+
+ params = mkOption {
+ default = [];
+ example = [ "console=ttyS0,115200" ];
+ type = types.listOf types.str;
+ description = ''
+ Parameters added to the Memtest86+ command line. As of memtest86+ 5.01
+ the following list of (apparently undocumented) parameters are
+ accepted:
+
+
+
+
+ console=..., set up a serial console.
+ Examples:
+ console=ttyS0,
+ console=ttyS0,9600 or
+ console=ttyS0,115200n8.
+
+
+
+ btrace, enable boot trace.
+
+
+
+ maxcpus=N, limit number of CPUs.
+
+
+
+ onepass, run one pass and exit if there
+ are no errors.
+
+
+
+ tstlist=..., list of tests to run.
+ Example: 0,1,2.
+
+
+
+ cpumask=..., set a CPU mask, to select CPUs
+ to use for testing.
+
+
+
+
+ This list of command line options was obtained by reading the
+ Memtest86+ source code.
+ '';
+ };
+
};
};
- config = mkIf config.boot.loader.grub.memtest86 {
+ config = mkIf cfg.enable {
boot.loader.grub.extraEntries =
if config.boot.loader.grub.version == 2 then
''
menuentry "Memtest86+" {
- linux16 @bootRoot@/memtest.bin
+ linux16 @bootRoot@/memtest.bin ${toString cfg.params}
}
''
else
diff --git a/nixos/modules/system/boot/loader/gummiboot/gummiboot-builder.py b/nixos/modules/system/boot/loader/gummiboot/gummiboot-builder.py
index 9ea224b51f63339d70f4e1fc3d5b2c215666d08a..db73544181b6979a7952b54aed4506586c47c9c0 100644
--- a/nixos/modules/system/boot/loader/gummiboot/gummiboot-builder.py
+++ b/nixos/modules/system/boot/loader/gummiboot/gummiboot-builder.py
@@ -9,7 +9,6 @@ import tempfile
import errno
def copy_if_not_exists(source, dest):
- known_paths.append(dest)
if not os.path.exists(dest):
shutil.copyfile(source, dest)
@@ -38,12 +37,13 @@ def write_loader_conf(generation):
print >> f, "default nixos-generation-%d" % (generation)
os.rename("@efiSysMountPoint@/loader/loader.conf.tmp", "@efiSysMountPoint@/loader/loader.conf")
-def copy_from_profile(generation, name):
+def copy_from_profile(generation, name, dry_run=False):
store_file_path = os.readlink("%s/%s" % (system_dir(generation), name))
suffix = os.path.basename(store_file_path)
store_dir = os.path.basename(os.path.dirname(store_file_path))
efi_file_path = "/efi/nixos/%s-%s.efi" % (store_dir, suffix)
- copy_if_not_exists(store_file_path, "@efiSysMountPoint@%s" % (efi_file_path))
+ if not dry_run:
+ copy_if_not_exists(store_file_path, "@efiSysMountPoint@%s" % (efi_file_path))
return efi_file_path
def add_entry(generation):
@@ -72,6 +72,10 @@ def get_generations(profile):
def remove_old_entries(gens):
slice_start = len("@efiSysMountPoint@/loader/entries/nixos-generation-")
slice_end = -1 * len(".conf")
+ known_paths = []
+ for gen in gens:
+ known_paths.append(copy_from_profile(gen, "kernel", True))
+ known_paths.append(copy_from_profile(gen, "initrd", True))
for path in glob.iglob("@efiSysMountPoint@/loader/entries/nixos-generation-[1-9]*.conf"):
try:
gen = int(path[slice_start:slice_end])
@@ -94,7 +98,6 @@ if os.getenv("NIXOS_INSTALL_GRUB") == "1":
else:
subprocess.check_call(["@gummiboot@/bin/gummiboot", "--path=@efiSysMountPoint@", "--no-variables", "install"])
-known_paths = []
mkdir_p("@efiSysMountPoint@/efi/nixos")
mkdir_p("@efiSysMountPoint@/loader/entries")
try:
@@ -106,9 +109,8 @@ except IOError as e:
machine_id = None
gens = get_generations("system")
+remove_old_entries(gens)
for gen in gens:
add_entry(gen)
if os.readlink(system_dir(gen)) == args.default_config:
write_loader_conf(gen)
-
-remove_old_entries(gens)
diff --git a/nixos/modules/system/boot/loader/gummiboot/gummiboot.nix b/nixos/modules/system/boot/loader/gummiboot/gummiboot.nix
index 7edc30776379a7a40127eff9f22d0ef668880fee..19c613a7c94c05942fb4e7ae50deefbcc2aa6391 100644
--- a/nixos/modules/system/boot/loader/gummiboot/gummiboot.nix
+++ b/nixos/modules/system/boot/loader/gummiboot/gummiboot.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
cfg = config.boot.loader.gummiboot;
diff --git a/nixos/modules/system/boot/loader/init-script/init-script.nix b/nixos/modules/system/boot/loader/init-script/init-script.nix
index 4b0fcd85b4b5a3fc0c4860899f1b0a6756f47f96..3b33d42b4ae4ecd9a77eb96649466c6109b9eb48 100644
--- a/nixos/modules/system/boot/loader/init-script/init-script.nix
+++ b/nixos/modules/system/boot/loader/init-script/init-script.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/system/boot/loader/raspberrypi/raspberrypi.nix b/nixos/modules/system/boot/loader/raspberrypi/raspberrypi.nix
index 5bc856c3df0ba2db6b6aff65ece9935dfbb75aad..d3f32418a64c495c8c4c835d2658d5ed196922f6 100644
--- a/nixos/modules/system/boot/loader/raspberrypi/raspberrypi.nix
+++ b/nixos/modules/system/boot/loader/raspberrypi/raspberrypi.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/system/boot/luksroot.nix b/nixos/modules/system/boot/luksroot.nix
index ba357f5d2de3173cc0215908da31d4c32a0928d7..c923cc49c4499bc9ecdd2daa82a8914fdb6a7b46 100644
--- a/nixos/modules/system/boot/luksroot.nix
+++ b/nixos/modules/system/boot/luksroot.nix
@@ -1,11 +1,11 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
luks = config.boot.initrd.luks;
- openCommand = { name, device, keyFile, keyFileSize, allowDiscards, ... }: ''
+ openCommand = { name, device, keyFile, keyFileSize, allowDiscards, yubikey, ... }: ''
# Wait for luksRoot to appear, e.g. if on a usb drive.
# XXX: copied and adapted from stage-1-init.sh - should be
# available as a function.
@@ -31,9 +31,161 @@ let
fi
''}
+ open_normally() {
+ cryptsetup luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} \
+ ${optionalString (keyFile != null) "--key-file=${keyFile} ${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"}"}
+ }
+
+ ${optionalString (luks.yubikeySupport && (yubikey != null)) ''
+
+ rbtohex() {
+ ( od -An -vtx1 | tr -d ' \n' )
+ }
+
+ hextorb() {
+ ( tr '[:lower:]' '[:upper:]' | sed -e 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf )
+ }
+
+ open_yubikey() {
+
+ # Make all of these local to this function
+ # to prevent their values being leaked
+ local salt
+ local iterations
+ local k_user
+ local challenge
+ local response
+ local k_luks
+ local opened
+ local new_salt
+ local new_iterations
+ local new_challenge
+ local new_response
+ local new_k_luks
+
+ mkdir -p ${yubikey.storage.mountPoint}
+ mount -t ${yubikey.storage.fsType} ${toString yubikey.storage.device} ${yubikey.storage.mountPoint}
+
+ salt="$(cat ${yubikey.storage.mountPoint}${yubikey.storage.path} | sed -n 1p | tr -d '\n')"
+ iterations="$(cat ${yubikey.storage.mountPoint}${yubikey.storage.path} | sed -n 2p | tr -d '\n')"
+ challenge="$(echo -n $salt | openssl-wrap dgst -binary -sha512 | rbtohex)"
+ response="$(ykchalresp -${toString yubikey.slot} -x $challenge 2>/dev/null)"
+
+ for try in $(seq 3); do
+
+ ${optionalString yubikey.twoFactor ''
+ echo -n "Enter two-factor passphrase: "
+ read -s k_user
+ echo
+ ''}
+
+ if [ ! -z "$k_user" ]; then
+ k_luks="$(echo -n $k_user | pbkdf2-sha512 ${toString yubikey.keyLength} $iterations $response | rbtohex)"
+ else
+ k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $iterations $response | rbtohex)"
+ fi
+
+ echo -n "$k_luks" | hextorb | cryptsetup luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} --key-file=-
+
+ if [ $? == "0" ]; then
+ opened=true
+ break
+ else
+ opened=false
+ echo "Authentication failed!"
+ fi
+ done
+
+ if [ "$opened" == false ]; then
+ umount ${yubikey.storage.mountPoint}
+ echo "Maximum authentication errors reached"
+ exit 1
+ fi
+
+ echo -n "Gathering entropy for new salt (please enter random keys to generate entropy if this blocks for long)..."
+ for i in $(seq ${toString yubikey.saltLength}); do
+ byte="$(dd if=/dev/random bs=1 count=1 2>/dev/null | rbtohex)";
+ new_salt="$new_salt$byte";
+ echo -n .
+ done;
+ echo "ok"
+
+ new_iterations="$iterations"
+ ${optionalString (yubikey.iterationStep > 0) ''
+ new_iterations="$(($new_iterations + ${toString yubikey.iterationStep}))"
+ ''}
+
+ new_challenge="$(echo -n $new_salt | openssl-wrap dgst -binary -sha512 | rbtohex)"
+
+ new_response="$(ykchalresp -${toString yubikey.slot} -x $new_challenge 2>/dev/null)"
+
+ if [ ! -z "$k_user" ]; then
+ new_k_luks="$(echo -n $k_user | pbkdf2-sha512 ${toString yubikey.keyLength} $new_iterations $new_response | rbtohex)"
+ else
+ new_k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $new_iterations $new_response | rbtohex)"
+ fi
+
+ mkdir -p ${yubikey.ramfsMountPoint}
+ # A ramfs is used here to ensure that the file used to update
+ # the key slot with cryptsetup will never get swapped out.
+ # Warning: Do NOT replace with tmpfs!
+ mount -t ramfs none ${yubikey.ramfsMountPoint}
+
+ echo -n "$new_k_luks" | hextorb > ${yubikey.ramfsMountPoint}/new_key
+ echo -n "$k_luks" | hextorb | cryptsetup luksChangeKey ${device} --key-file=- ${yubikey.ramfsMountPoint}/new_key
+
+ if [ $? == "0" ]; then
+ echo -ne "$new_salt\n$new_iterations" > ${yubikey.storage.mountPoint}${yubikey.storage.path}
+ else
+ echo "Warning: Could not update LUKS key, current challenge persists!"
+ fi
+
+ rm -f ${yubikey.ramfsMountPoint}/new_key
+ umount ${yubikey.ramfsMountPoint}
+ rm -rf ${yubikey.ramfsMountPoint}
+
+ umount ${yubikey.storage.mountPoint}
+ }
+
+ ${optionalString (yubikey.gracePeriod > 0) ''
+ echo -n "Waiting ${toString yubikey.gracePeriod} seconds as grace..."
+ for i in $(seq ${toString yubikey.gracePeriod}); do
+ sleep 1
+ echo -n .
+ done
+ echo "ok"
+ ''}
+
+ yubikey_missing=true
+ ykinfo -v 1>/dev/null 2>&1
+ if [ $? != "0" ]; then
+ echo -n "waiting 10 seconds for yubikey to appear..."
+ for try in $(seq 10); do
+ sleep 1
+ ykinfo -v 1>/dev/null 2>&1
+ if [ $? == "0" ]; then
+ yubikey_missing=false
+ break
+ fi
+ echo -n .
+ done
+ echo "ok"
+ else
+ yubikey_missing=false
+ fi
+
+ if [ "$yubikey_missing" == true ]; then
+ echo "no yubikey found, falling back to non-yubikey open procedure"
+ open_normally
+ else
+ open_yubikey
+ fi
+ ''}
+
# open luksRoot and scan for logical volumes
- cryptsetup luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} \
- ${optionalString (keyFile != null) "--key-file=${keyFile} ${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"}"}
+ ${optionalString ((!luks.yubikeySupport) || (yubikey == null)) ''
+ open_normally
+ ''}
'';
isPreLVM = f: f.preLVM;
@@ -139,10 +291,108 @@ in
'';
};
- };
+ yubikey = mkOption {
+ default = null;
+ type = types.nullOr types.optionSet;
+ description = ''
+ The options to use for this LUKS device in Yubikey-PBA.
+ If null (the default), Yubikey-PBA will be disabled for this device.
+ '';
+ options = {
+ twoFactor = mkOption {
+ default = true;
+ type = types.bool;
+ description = "Whether to use a passphrase and a Yubikey (true), or only a Yubikey (false)";
+ };
+
+ slot = mkOption {
+ default = 2;
+ type = types.int;
+ description = "Which slot on the Yubikey to challenge";
+ };
+
+ saltLength = mkOption {
+ default = 16;
+ type = types.int;
+ description = "Length of the new salt in byte (64 is the effective maximum)";
+ };
+
+ keyLength = mkOption {
+ default = 64;
+ type = types.int;
+ description = "Length of the LUKS slot key derived with PBKDF2 in byte";
+ };
+
+ iterationStep = mkOption {
+ default = 0;
+ type = types.int;
+ description = "How much the iteration count for PBKDF2 is increased at each successful authentication";
+ };
+
+ gracePeriod = mkOption {
+ default = 2;
+ type = types.int;
+ description = "Time in seconds to wait before attempting to find the Yubikey";
+ };
+
+ ramfsMountPoint = mkOption {
+ default = "/crypt-ramfs";
+ type = types.string;
+ description = "Path where the ramfs used to update the LUKS key will be mounted in stage-1";
+ };
+
+ storage = mkOption {
+ type = types.optionSet;
+ description = "Options related to the storing the salt";
+
+ options = {
+ device = mkOption {
+ default = /dev/sda1;
+ type = types.path;
+ description = ''
+ An unencrypted device that will temporarily be mounted in stage-1.
+ Must contain the current salt to create the challenge for this LUKS device.
+ '';
+ };
+
+ fsType = mkOption {
+ default = "vfat";
+ type = types.string;
+ description = "The filesystem of the unencrypted device";
+ };
+
+ mountPoint = mkOption {
+ default = "/crypt-storage";
+ type = types.string;
+ description = "Path where the unencrypted device will be mounted in stage-1";
+ };
+
+ path = mkOption {
+ default = "/crypt-storage/default";
+ type = types.string;
+ description = ''
+ Absolute path of the salt on the unencrypted device with
+ that device's root directory as "/".
+ '';
+ };
+ };
+ };
+ };
+ };
+
+ };
};
+ boot.initrd.luks.yubikeySupport = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Enables support for authenticating with a Yubikey on LUKS devices.
+ See the NixOS wiki for information on how to properly setup a LUKS device
+ and a Yubikey to work with this feature.
+ '';
+ };
};
config = mkIf (luks.devices != []) {
@@ -157,15 +407,48 @@ in
# copy the cryptsetup binary and it's dependencies
boot.initrd.extraUtilsCommands = ''
cp -pdv ${pkgs.cryptsetup}/sbin/cryptsetup $out/bin
- # XXX: do we have a function that does this?
- for lib in $(ldd $out/bin/cryptsetup |grep '=>' |grep /nix/store/ |cut -d' ' -f3); do
- cp -pdvn $lib $out/lib
- cp -pvn $(readlink -f $lib) $out/lib
- done
+
+ cp -pdv ${pkgs.libgcrypt}/lib/libgcrypt*.so.* $out/lib
+ cp -pdv ${pkgs.libgpgerror}/lib/libgpg-error*.so.* $out/lib
+ cp -pdv ${pkgs.cryptsetup}/lib/libcryptsetup*.so.* $out/lib
+ cp -pdv ${pkgs.popt}/lib/libpopt*.so.* $out/lib
+
+ ${optionalString luks.yubikeySupport ''
+ cp -pdv ${pkgs.ykpers}/bin/ykchalresp $out/bin
+ cp -pdv ${pkgs.ykpers}/bin/ykinfo $out/bin
+ cp -pdv ${pkgs.openssl}/bin/openssl $out/bin
+
+ cc -O3 -I${pkgs.openssl}/include -L${pkgs.openssl}/lib ${./pbkdf2-sha512.c} -o $out/bin/pbkdf2-sha512 -lcrypto
+ strip -s $out/bin/pbkdf2-sha512
+
+ cp -pdv ${pkgs.libusb1}/lib/libusb*.so.* $out/lib
+ cp -pdv ${pkgs.ykpers}/lib/libykpers*.so.* $out/lib
+ cp -pdv ${pkgs.libyubikey}/lib/libyubikey*.so.* $out/lib
+ cp -pdv ${pkgs.openssl}/lib/libssl*.so.* $out/lib
+ cp -pdv ${pkgs.openssl}/lib/libcrypto*.so.* $out/lib
+
+ mkdir -p $out/etc/ssl
+ cp -pdv ${pkgs.openssl}/etc/ssl/openssl.cnf $out/etc/ssl
+
+ cat > $out/bin/openssl-wrap < $out/bin/openssl-wrap <
+#include
+#include
+#include
+
+void hextorb(uint8_t* hex, uint8_t* rb)
+{
+ while(sscanf(hex, "%2x", rb) == 1)
+ {
+ hex += 2;
+ rb += 1;
+ }
+ *rb = '\0';
+}
+
+int main(int argc, char** argv)
+{
+ uint8_t k_user[2048];
+ uint8_t salt[2048];
+ uint8_t key[4096];
+
+ uint32_t key_length = atoi(argv[1]);
+ uint32_t iteration_count = atoi(argv[2]);
+
+ hextorb(argv[3], salt);
+ uint32_t salt_length = strlen(argv[3]) / 2;
+
+ fgets(k_user, 2048, stdin);
+ uint32_t k_user_length = strlen(k_user);
+ if(k_user[k_user_length - 1] == '\n') {
+ k_user[k_user_length - 1] = '\0';
+ }
+
+ PKCS5_PBKDF2_HMAC(k_user, k_user_length, salt, salt_length, iteration_count, EVP_sha512(), key_length, key);
+ fwrite(key, 1, key_length, stdout);
+
+ return 0;
+}
\ No newline at end of file
diff --git a/nixos/modules/system/boot/shutdown.nix b/nixos/modules/system/boot/shutdown.nix
index 44cadcd64a767a53b8f69a43fed002dff1926cde..68bc936c5b0bf3cb2b993c9e3ddb4fa0e73efd6f 100644
--- a/nixos/modules/system/boot/shutdown.nix
+++ b/nixos/modules/system/boot/shutdown.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
diff --git a/nixos/modules/system/boot/stage-1-init.sh b/nixos/modules/system/boot/stage-1-init.sh
index 1f65026b5defb31cf5cdd72cb0f5ddbb95d9879a..216937a619b1ebea245b1027ad90c4d460c7c1a0 100644
--- a/nixos/modules/system/boot/stage-1-init.sh
+++ b/nixos/modules/system/boot/stage-1-init.sh
@@ -14,7 +14,7 @@ fail() {
# in an interactive shell.
cat <restartIfChanged is
+ ignored.
+ '';
+ };
+
stopIfChanged = mkOption {
type = types.bool;
default = true;
@@ -268,7 +299,7 @@ in rec {
};
- socketOptions = unitOptions // {
+ socketOptions = commonUnitOptions // {
listenStreams = mkOption {
default = [];
@@ -295,7 +326,7 @@ in rec {
};
- timerOptions = unitOptions // {
+ timerOptions = commonUnitOptions // {
timerConfig = mkOption {
default = {};
@@ -314,7 +345,24 @@ in rec {
};
- mountOptions = unitOptions // {
+ pathOptions = commonUnitOptions // {
+
+ pathConfig = mkOption {
+ default = {};
+ example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
+ type = types.attrsOf unitOption;
+ description = ''
+ Each attribute in this set specifies an option in the
+ [Path] section of the unit. See
+ systemd.path
+ 5 for details.
+ '';
+ };
+
+ };
+
+
+ mountOptions = commonUnitOptions // {
what = mkOption {
example = "/dev/sda1";
@@ -358,7 +406,7 @@ in rec {
};
};
- automountOptions = unitOptions // {
+ automountOptions = commonUnitOptions // {
where = mkOption {
example = "/mnt";
@@ -382,4 +430,6 @@ in rec {
};
};
+ targetOptions = commonUnitOptions;
+
}
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index b575deb24b7bc24cb804124b28f4d0df062bb0ee..6c6adab66e7c36d221f0b977f873ba9948633a3c 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -1,8 +1,8 @@
-{ config, pkgs, utils, ... }:
+{ config, lib, pkgs, utils, ... }:
-with pkgs.lib;
+with lib;
with utils;
-with import ./systemd-unit-options.nix { inherit config pkgs; };
+with import ./systemd-unit-options.nix { inherit config lib; };
let
@@ -11,29 +11,26 @@ let
systemd = cfg.package;
makeUnit = name: unit:
- pkgs.runCommand "unit" { preferLocalBuild = true; inherit (unit) text; }
- ((if !unit.enable then ''
- mkdir -p $out
- ln -s /dev/null $out/${name}
- '' else if unit.linkTarget != null then ''
- mkdir -p $out
- ln -s ${unit.linkTarget} $out/${name}
- '' else if unit.text != null then ''
- mkdir -p $out
- echo -n "$text" > $out/${name}
- '' else "") + optionalString (unit.extraConfig != {}) ''
- mkdir -p $out/${name}.d
- ${concatStringsSep "\n" (mapAttrsToList (n: v: "echo -n \"${v}\" > $out/${name}.d/${n}") unit.extraConfig)}
- '');
-
- upstreamUnits =
+ if unit.enable then
+ pkgs.runCommand "unit" { preferLocalBuild = true; inherit (unit) text; }
+ ''
+ mkdir -p $out
+ echo -n "$text" > $out/${name}
+ ''
+ else
+ pkgs.runCommand "unit" { preferLocalBuild = true; }
+ ''
+ mkdir -p $out
+ ln -s /dev/null $out/${name}
+ '';
+
+ upstreamSystemUnits =
[ # Targets.
"basic.target"
"sysinit.target"
"sockets.target"
"graphical.target"
"multi-user.target"
- "getty.target"
"network.target"
"network-online.target"
"nss-lookup.target"
@@ -43,6 +40,7 @@ let
"sigpwr.target"
"timers.target"
"paths.target"
+ "rpcbind.target"
# Rescue mode.
"rescue.target"
@@ -55,6 +53,13 @@ let
"systemd-udev-settle.service"
"systemd-udev-trigger.service"
+ # Consoles.
+ "getty.target"
+ "getty@.service"
+ "serial-getty@.service"
+ "container-getty@.service"
+ "systemd-vconsole-setup.service"
+
# Hardware (started by udev when a relevant device is plugged in).
"sound.target"
"bluetooth.target"
@@ -67,12 +72,15 @@ let
#"systemd-vconsole-setup.service"
"systemd-user-sessions.service"
"dbus-org.freedesktop.login1.service"
+ "dbus-org.freedesktop.machine1.service"
"user@.service"
# Journal.
"systemd-journald.socket"
"systemd-journald.service"
"systemd-journal-flush.service"
+ "systemd-journal-gatewayd.socket"
+ "systemd-journal-gatewayd.service"
"syslog.socket"
# SysV init compatibility.
@@ -80,7 +88,8 @@ let
"systemd-initctl.service"
# Kernel module loading.
- #"systemd-modules-load.service"
+ "systemd-modules-load.service"
+ "kmod-static-nodes.service"
# Filesystems.
"systemd-fsck@.service"
@@ -93,10 +102,16 @@ let
"swap.target"
"dev-hugepages.mount"
"dev-mqueue.mount"
+ "proc-sys-fs-binfmt_misc.mount"
"sys-fs-fuse-connections.mount"
"sys-kernel-config.mount"
"sys-kernel-debug.mount"
+ # Maintaining state across reboots.
+ "systemd-random-seed.service"
+ "systemd-backlight@.service"
+ "systemd-rfkill@.service"
+
# Hibernate / suspend.
"hibernate.target"
"suspend.target"
@@ -121,12 +136,30 @@ let
"final.target"
"kexec.target"
"systemd-kexec.service"
+ "systemd-update-utmp.service"
# Password entry.
"systemd-ask-password-console.path"
"systemd-ask-password-console.service"
"systemd-ask-password-wall.path"
"systemd-ask-password-wall.service"
+
+ # Slices / containers.
+ "slices.target"
+ "-.slice"
+ "system.slice"
+ "user.slice"
+ "machine.slice"
+ "systemd-machined.service"
+
+ # Temporary file creation / cleanup.
+ "systemd-tmpfiles-clean.service"
+ "systemd-tmpfiles-clean.timer"
+ "systemd-tmpfiles-setup.service"
+ "systemd-tmpfiles-setup-dev.service"
+
+ # Misc.
+ "systemd-sysctl.service"
]
++ optionals cfg.enableEmergencyMode [
@@ -134,16 +167,26 @@ let
"emergency.service"
];
- upstreamWants =
+ upstreamSystemWants =
[ #"basic.target.wants"
"sysinit.target.wants"
"sockets.target.wants"
"local-fs.target.wants"
"multi-user.target.wants"
- "shutdown.target.wants"
"timers.target.wants"
];
+ upstreamUserUnits =
+ [ "basic.target"
+ "default.target"
+ "exit.target"
+ "paths.target"
+ "shutdown.target"
+ "sockets.target"
+ "systemd-exit.service"
+ "timers.target"
+ ];
+
makeJobScript = name: text:
let x = pkgs.writeTextFile { name = "unit-script"; executable = true; destination = "/bin/${name}"; inherit text; };
in "${x}/bin/${name}";
@@ -151,15 +194,23 @@ let
unitConfig = { name, config, ... }: {
config = {
unitConfig =
- { Requires = concatStringsSep " " config.requires;
- Wants = concatStringsSep " " config.wants;
- After = concatStringsSep " " config.after;
- Before = concatStringsSep " " config.before;
- BindsTo = concatStringsSep " " config.bindsTo;
- PartOf = concatStringsSep " " config.partOf;
- Conflicts = concatStringsSep " " config.conflicts;
- "X-Restart-Triggers" = toString config.restartTriggers;
- } // optionalAttrs (config.description != "") {
+ optionalAttrs (config.requires != [])
+ { Requires = toString config.requires; }
+ // optionalAttrs (config.wants != [])
+ { Wants = toString config.wants; }
+ // optionalAttrs (config.after != [])
+ { After = toString config.after; }
+ // optionalAttrs (config.before != [])
+ { Before = toString config.before; }
+ // optionalAttrs (config.bindsTo != [])
+ { BindsTo = toString config.bindsTo; }
+ // optionalAttrs (config.partOf != [])
+ { PartOf = toString config.partOf; }
+ // optionalAttrs (config.conflicts != [])
+ { Conflicts = toString config.conflicts; }
+ // optionalAttrs (config.restartTriggers != [])
+ { X-Restart-Triggers = toString config.restartTriggers; }
+ // optionalAttrs (config.description != "") {
Description = config.description;
};
};
@@ -244,6 +295,11 @@ let
(if isList value then value else [value]))
as));
+ commonUnitText = def: ''
+ [Unit]
+ ${attrsToSection def.unitConfig}
+ '';
+
targetToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
text =
@@ -255,15 +311,16 @@ let
serviceToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
- text =
+ text = commonUnitText def +
''
- [Unit]
- ${attrsToSection def.unitConfig}
-
[Service]
${let env = cfg.globalEnvironment // def.environment;
in concatMapStrings (n: "Environment=\"${n}=${getAttr n env}\"\n") (attrNames env)}
- ${optionalString (!def.restartIfChanged) "X-RestartIfChanged=false"}
+ ${if def.reloadIfChanged then ''
+ X-ReloadIfChanged=true
+ '' else if !def.restartIfChanged then ''
+ X-RestartIfChanged=false
+ '' else ""}
${optionalString (!def.stopIfChanged) "X-StopIfChanged=false"}
${attrsToSection def.serviceConfig}
'';
@@ -271,11 +328,8 @@ let
socketToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
- text =
+ text = commonUnitText def +
''
- [Unit]
- ${attrsToSection def.unitConfig}
-
[Socket]
${attrsToSection def.socketConfig}
${concatStringsSep "\n" (map (s: "ListenStream=${s}") def.listenStreams)}
@@ -284,23 +338,26 @@ let
timerToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
- text =
+ text = commonUnitText def +
''
- [Unit]
- ${attrsToSection def.unitConfig}
-
[Timer]
${attrsToSection def.timerConfig}
'';
};
- mountToUnit = name: def:
+ pathToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
- text =
+ text = commonUnitText def +
''
- [Unit]
- ${attrsToSection def.unitConfig}
+ [Path]
+ ${attrsToSection def.pathConfig}
+ '';
+ };
+ mountToUnit = name: def:
+ { inherit (def) wantedBy requiredBy enable;
+ text = commonUnitText def +
+ ''
[Mount]
${attrsToSection def.mountConfig}
'';
@@ -308,70 +365,99 @@ let
automountToUnit = name: def:
{ inherit (def) wantedBy requiredBy enable;
- text =
+ text = commonUnitText def +
''
- [Unit]
- ${attrsToSection def.unitConfig}
-
[Automount]
${attrsToSection def.automountConfig}
'';
};
- units = pkgs.runCommand "units" { preferLocalBuild = true; }
- ''
+ generateUnits = type: units: upstreamUnits: upstreamWants:
+ pkgs.runCommand "${type}-units" { preferLocalBuild = true; } ''
mkdir -p $out
+
+ # Copy the upstream systemd units we're interested in.
for i in ${toString upstreamUnits}; do
- fn=${systemd}/example/systemd/system/$i
+ fn=${systemd}/example/systemd/${type}/$i
if ! [ -e $fn ]; then echo "missing $fn"; false; fi
if [ -L $fn ]; then
- cp -pd $fn $out/
+ target="$(readlink "$fn")"
+ if [ ''${target:0:3} = ../ ]; then
+ ln -s "$(readlink -f "$fn")" $out/
+ else
+ cp -pd $fn $out/
+ fi
else
ln -s $fn $out/
fi
done
+ # Copy .wants links, but only those that point to units that
+ # we're interested in.
for i in ${toString upstreamWants}; do
- fn=${systemd}/example/systemd/system/$i
+ fn=${systemd}/example/systemd/${type}/$i
if ! [ -e $fn ]; then echo "missing $fn"; false; fi
x=$out/$(basename $fn)
mkdir $x
for i in $fn/*; do
y=$x/$(basename $i)
cp -pd $i $y
- if ! [ -e $y ]; then rm -v $y; fi
+ if ! [ -e $y ]; then rm $y; fi
done
done
- for i in ${toString (mapAttrsToList (n: v: v.unit) cfg.units)}; do
- ln -fs $i/* $out/
+ # Symlink all units provided listed in systemd.packages.
+ for i in ${toString cfg.packages}; do
+ files=$(echo $i/etc/systemd/${type}/* $i/lib/systemd/${type}/*)
+ if [ -n "$files" ]; then
+ ln -s $files $out/
+ fi
done
- for i in ${toString cfg.packages}; do
- ln -s $i/etc/systemd/system/* $out/
+ # Symlink all units defined by systemd.units. If these are also
+ # provided by systemd or systemd.packages, then add them as
+ # .d/overrides.conf, which makes them extend the
+ # upstream unit.
+ for i in ${toString (mapAttrsToList (n: v: v.unit) units)}; do
+ fn=$(basename $i/*)
+ if [ -e $out/$fn ]; then
+ if [ "$(readlink -f $i/$fn)" = /dev/null ]; then
+ ln -sfn /dev/null $out/$fn
+ else
+ mkdir $out/$fn.d
+ ln -s $i/$fn $out/$fn.d/overrides.conf
+ fi
+ else
+ ln -fs $i/$fn $out/
+ fi
done
+ # Created .wants and .requires symlinks from the wantedBy and
+ # requiredBy options.
${concatStrings (mapAttrsToList (name: unit:
concatMapStrings (name2: ''
mkdir -p $out/'${name2}.wants'
ln -sfn '../${name}' $out/'${name2}.wants'/
- '') unit.wantedBy) cfg.units)}
+ '') unit.wantedBy) units)}
${concatStrings (mapAttrsToList (name: unit:
concatMapStrings (name2: ''
mkdir -p $out/'${name2}.requires'
ln -sfn '../${name}' $out/'${name2}.requires'/
- '') unit.requiredBy) cfg.units)}
+ '') unit.requiredBy) units)}
- ln -s ${cfg.defaultUnit} $out/default.target
+ ${optionalString (type == "system") ''
+ # Stupid misc. symlinks.
+ ln -s ${cfg.defaultUnit} $out/default.target
- ln -s rescue.target $out/kbrequest.target
+ ln -s rescue.target $out/kbrequest.target
- mkdir -p $out/getty.target.wants/
- ln -s ../autovt@tty1.service $out/getty.target.wants/
+ mkdir -p $out/getty.target.wants/
+ ln -s ../autovt@tty1.service $out/getty.target.wants/
- ln -s ../local-fs.target ../remote-fs.target ../network.target ../nss-lookup.target \
- ../nss-user-lookup.target ../swap.target $out/multi-user.target.wants/
+ ln -s ../local-fs.target ../remote-fs.target ../network.target ../nss-lookup.target \
+ ../nss-user-lookup.target ../swap.target $out/multi-user.target.wants/
+ ''}
''; # */
in
@@ -393,55 +479,9 @@ in
default = {};
type = types.attrsOf types.optionSet;
options = { name, config, ... }:
- { options = {
- text = mkOption {
- type = types.nullOr types.str;
- default = null;
- description = "Text of this systemd unit.";
- };
- enable = mkOption {
- default = true;
- type = types.bool;
- description = ''
- If set to false, this unit will be a symlink to
- /dev/null. This is primarily useful to prevent specific
- template instances (e.g. serial-getty@ttyS0)
- from being started.
- '';
- };
- requiredBy = mkOption {
- default = [];
- type = types.listOf types.string;
- description = "Units that require (i.e. depend on and need to go down with) this unit.";
- };
- wantedBy = mkOption {
- default = [];
- type = types.listOf types.string;
- description = "Units that want (i.e. depend on) this unit.";
- };
- unit = mkOption {
- internal = true;
- description = "The generated unit.";
- };
- linkTarget = mkOption {
- default = null;
- description = "The file to symlink this target to.";
- type = types.nullOr types.path;
- };
- extraConfig = mkOption {
- default = {};
- example = { "foo@1.conf" = "X-RestartIfChanged=false"; };
- type = types.attrsOf types.lines;
- description = ''
- Extra files to be appended to the configuration for the unit.
- This can be used to override configuration for a unit provided
- by systemd or another package, or to override only a single instance
- of a template unit.
- '';
- };
- };
+ { options = concreteUnitOptions;
config = {
- unit = makeUnit name config;
+ unit = mkDefault (makeUnit name config);
};
};
};
@@ -455,7 +495,7 @@ in
systemd.targets = mkOption {
default = {};
type = types.attrsOf types.optionSet;
- options = [ unitOptions unitConfig ];
+ options = [ targetOptions unitConfig ];
description = "Definition of systemd target units.";
};
@@ -480,6 +520,13 @@ in
description = "Definition of systemd timer units.";
};
+ systemd.paths = mkOption {
+ default = {};
+ type = types.attrsOf types.optionSet;
+ options = [ pathOptions unitConfig ];
+ description = "Definition of systemd path units.";
+ };
+
systemd.mounts = mkOption {
default = [];
type = types.listOf types.optionSet;
@@ -567,6 +614,14 @@ in
'';
};
+ services.journald.enableHttpGateway = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Whether to enable the HTTP gateway to the journal.
+ '';
+ };
+
services.logind.extraConfig = mkOption {
default = "";
type = types.lines;
@@ -590,6 +645,41 @@ in
'';
};
+ systemd.tmpfiles.rules = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = [ "d /tmp 1777 root root 10d" ];
+ description = ''
+ Rules for creating and cleaning up temporary files
+ automatically. See
+ tmpfiles.d5
+ for the exact format. You should not use this option to create
+ files required by systemd services, since there is no
+ guarantee that systemd-tmpfiles runs when
+ the system is reconfigured using
+ nixos-rebuild.
+ '';
+ };
+
+ systemd.user.units = mkOption {
+ description = "Definition of systemd per-user units.";
+ default = {};
+ type = types.attrsOf types.optionSet;
+ options = { name, config, ... }:
+ { options = concreteUnitOptions;
+ config = {
+ unit = mkDefault (makeUnit name config);
+ };
+ };
+ };
+
+ systemd.user.services = mkOption {
+ default = {};
+ type = types.attrsOf types.optionSet;
+ options = [ serviceOptions unitConfig serviceConfig ];
+ description = "Definition of systemd per-user service units.";
+ };
+
};
@@ -597,11 +687,20 @@ in
config = {
- system.build.units = units;
+ assertions = mapAttrsToList (name: service: {
+ assertion = service.serviceConfig.Type or "" == "oneshot" -> service.serviceConfig.Restart or "no" == "no";
+ message = "${name}: Type=oneshot services must have Restart=no";
+ }) cfg.services;
+
+ system.build.units = cfg.units;
environment.systemPackages = [ systemd ];
- environment.etc."systemd/system".source = units;
+ environment.etc."systemd/system".source =
+ generateUnits "system" cfg.units upstreamSystemUnits upstreamSystemWants;
+
+ environment.etc."systemd/user".source =
+ generateUnits "user" cfg.user.units upstreamUserUnits [];
environment.etc."systemd/system.conf".text =
''
@@ -645,8 +744,11 @@ in
'';
# Target for ‘charon send-keys’ to hook into.
+ users.extraGroups.keys.gid = config.ids.gids.keys;
+
systemd.targets.keys =
{ description = "Security Keys";
+ unitConfig.X-StopOnReconfiguration = true;
};
systemd.units =
@@ -654,6 +756,7 @@ in
// mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.services
// mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.sockets
// mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.timers
+ // mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths
// listToAttrs (map
(v: let n = escapeSystemdPath v.where;
in nameValuePair "${n}.mount" (mountToUnit n v)) cfg.mounts)
@@ -661,6 +764,9 @@ in
(v: let n = escapeSystemdPath v.where;
in nameValuePair "${n}.automount" (automountToUnit n v)) cfg.automounts);
+ systemd.user.units =
+ mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.user.services;
+
system.requiredKernelConfig = map config.lib.kernelConfig.isEnabled [
"CGROUPS" "AUTOFS4_FS" "DEVTMPFS"
];
@@ -673,6 +779,8 @@ in
};
users.extraGroups.systemd-journal.gid = config.ids.gids.systemd-journal;
+ users.extraUsers.systemd-journal-gateway.uid = config.ids.uids.systemd-journal-gateway;
+ users.extraGroups.systemd-journal-gateway.gid = config.ids.gids.systemd-journal-gateway;
# Generate timer units for all services that have a ‘startAt’ value.
systemd.timers =
@@ -682,43 +790,25 @@ in
})
(filterAttrs (name: service: service.startAt != "") cfg.services);
- # FIXME: These are borrowed from upstream systemd.
- systemd.services."systemd-update-utmp" =
- { description = "Update UTMP about System Reboot/Shutdown";
- wantedBy = [ "sysinit.target" ];
- after = [ "systemd-remount-fs.service" ];
- before = [ "sysinit.target" "shutdown.target" ];
- conflicts = [ "shutdown.target" ];
- unitConfig = {
- DefaultDependencies = false;
- RequiresMountsFor = "/var/log";
- };
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
- ExecStart = "${systemd}/lib/systemd/systemd-update-utmp reboot";
- ExecStop = "${systemd}/lib/systemd/systemd-update-utmp shutdown";
- };
- restartIfChanged = false;
- };
+ systemd.sockets.systemd-journal-gatewayd.wantedBy =
+ optional config.services.journald.enableHttpGateway "sockets.target";
- systemd.services."systemd-random-seed" =
- { description = "Load/Save Random Seed";
- wantedBy = [ "sysinit.target" "multi-user.target" ];
- after = [ "systemd-remount-fs.service" ];
- before = [ "sysinit.target" "shutdown.target" ];
- conflicts = [ "shutdown.target" ];
- unitConfig = {
- DefaultDependencies = false;
- RequiresMountsFor = "/var/lib";
- };
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
- ExecStart = "${systemd}/lib/systemd/systemd-random-seed load";
- ExecStop = "${systemd}/lib/systemd/systemd-random-seed save";
- };
+ # Provide the systemd-user PAM service, required to run systemd
+ # user instances.
+ security.pam.services.systemd-user =
+ { # Ensure that pam_systemd gets included. This is special-cased
+ # in systemd to provide XDG_RUNTIME_DIR.
+ startSession = true;
};
+ environment.etc."tmpfiles.d/x11.conf".source = "${systemd}/example/tmpfiles.d/x11.conf";
+
+ environment.etc."tmpfiles.d/nixos.conf".text =
+ ''
+ # This file is created automatically and should not be modified.
+ # Please change the option ‘systemd.tmpfiles.rules’ instead.
+ ${concatStringsSep "\n" cfg.tmpfiles.rules}
+ '';
+
};
}
diff --git a/nixos/modules/system/etc/etc.nix b/nixos/modules/system/etc/etc.nix
index a8f0a59b6fa91a1e2910cd1d31ded7f9bd0675eb..22d55a9e246c705c1eaa5fda1ff25b7851f4af26 100644
--- a/nixos/modules/system/etc/etc.nix
+++ b/nixos/modules/system/etc/etc.nix
@@ -1,8 +1,8 @@
# Management of static files in /etc.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -19,6 +19,8 @@ let
sources = map (x: x.source) etc';
targets = map (x: x.target) etc';
modes = map (x: x.mode) etc';
+ uids = map (x: x.uid) etc';
+ gids = map (x: x.gid) etc';
};
in
@@ -87,6 +89,24 @@ in
'';
};
+ uid = mkOption {
+ default = 0;
+ type = types.int;
+ description = ''
+ UID of created file. Only takes affect when the file is
+ copied (that is, the mode is not 'symlink').
+ '';
+ };
+
+ gid = mkOption {
+ default = 0;
+ type = types.int;
+ description = ''
+ GID of created file. Only takes affect when the file is
+ copied (that is, the mode is not 'symlink').
+ '';
+ };
+
};
config = {
diff --git a/nixos/modules/system/etc/make-etc.sh b/nixos/modules/system/etc/make-etc.sh
index 7cf68db9ddce546089777f47fc56b5a4a318765e..60d4ba1301a3f33c4d0c1b1b7657d9d9d5303368 100644
--- a/nixos/modules/system/etc/make-etc.sh
+++ b/nixos/modules/system/etc/make-etc.sh
@@ -6,6 +6,8 @@ set -f
sources_=($sources)
targets_=($targets)
modes_=($modes)
+uids_=($uids)
+gids_=($gids)
set +f
for ((i = 0; i < ${#targets_[@]}; i++)); do
@@ -35,6 +37,8 @@ for ((i = 0; i < ${#targets_[@]}; i++)); do
if test "${modes_[$i]}" != symlink; then
echo "${modes_[$i]}" > $out/etc/$target.mode
+ echo "${uids_[$i]}" > $out/etc/$target.uid
+ echo "${gids_[$i]}" > $out/etc/$target.gid
fi
fi
diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl
index 4b79dbaab89e8bbdc7b93cbeadd6745a2963e1d9..8ba9a370b27ab9679c92a5849cdc0a458c1b5bbf 100644
--- a/nixos/modules/system/etc/setup-etc.pl
+++ b/nixos/modules/system/etc/setup-etc.pl
@@ -60,7 +60,15 @@ sub link {
if ($mode eq "direct-symlink") {
atomicSymlink readlink("$static/$fn"), $target or warn;
} else {
+ open UID, "<$_.uid";
+ my $uid = ; chomp $uid;
+ close UID;
+ open GID, "<$_.gid";
+ my $gid = ; chomp $gid;
+ close GID;
+
copy "$static/$fn", "$target.tmp" or warn;
+ chown int($uid), int($gid), "$target.tmp" or warn;
chmod oct($mode), "$target.tmp" or warn;
rename "$target.tmp", $target or warn;
}
diff --git a/nixos/modules/system/upstart/upstart.nix b/nixos/modules/system/upstart/upstart.nix
index aa5c8dfe64b2f351f298483aeb48a27214c1fe54..5c0461304072d3fc2a1feb4b6848d82a5689b7eb 100644
--- a/nixos/modules/system/upstart/upstart.nix
+++ b/nixos/modules/system/upstart/upstart.nix
@@ -1,7 +1,7 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
-with import ../boot/systemd-unit-options.nix { inherit config pkgs; };
+with lib;
+with import ../boot/systemd-unit-options.nix { inherit config lib; };
let
@@ -93,7 +93,7 @@ let
if job.daemonType == "fork" || job.daemonType == "daemon" then { Type = "forking"; GuessMainPID = true; } else
if job.daemonType == "none" then { } else
throw "invalid daemon type `${job.daemonType}'")
- // optionalAttrs (!job.task && job.respawn)
+ // optionalAttrs (!job.task && !(job.script == "" && job.exec == "") && job.respawn)
{ Restart = "always"; }
// optionalAttrs job.task
{ Type = "oneshot"; RemainAfterExit = false; };
diff --git a/nixos/modules/tasks/cpu-freq.nix b/nixos/modules/tasks/cpu-freq.nix
index 705ec93a13600c88b1223596a071f44562d755c5..eb1dfe5f6be23f795b3dc6c0b6ac38772e309c11 100644
--- a/nixos/modules/tasks/cpu-freq.nix
+++ b/nixos/modules/tasks/cpu-freq.nix
@@ -1,6 +1,11 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
+
+let
+ cpupower = config.boot.kernelPackages.cpupower;
+ cfg = config.powerManagement;
+in
{
###### interface
@@ -23,31 +28,28 @@ with pkgs.lib;
###### implementation
- config = mkIf (config.powerManagement.cpuFreqGovernor != null) {
-
- environment.systemPackages = [ pkgs.cpufrequtils ];
-
- jobs.cpufreq =
- { description = "CPU Frequency Governor Setup";
-
- after = [ "systemd-modules-load.service" ];
- wantedBy = [ "multi-user.target" ];
+ config = mkIf (!config.boot.isContainer && config.powerManagement.cpuFreqGovernor != null) {
- unitConfig.ConditionPathIsReadWrite = "/sys/devices/";
+ boot.kernelModules = [ "acpi-cpufreq" "speedstep-lib" "pcc-cpufreq"
+ "cpufreq_${cfg.cpuFreqGovernor}"
+ ];
- path = [ pkgs.cpufrequtils ];
+ environment.systemPackages = [ cpupower ];
- preStart = ''
- for i in $(seq 0 $(($(nproc) - 1))); do
- for gov in $(cpufreq-info -c $i -g); do
- if [ "$gov" = ${config.powerManagement.cpuFreqGovernor} ]; then
- echo "<6>setting governor on CPU $i to ‘$gov’"
- cpufreq-set -c $i -g $gov
- fi
- done
- done
- '';
+ systemd.services.cpufreq = {
+ description = "CPU Frequency Governor Setup";
+ after = [ "systemd-modules-load.service" ];
+ wantedBy = [ "multi-user.target" ];
+ path = [ cpupower ];
+ script = ''
+ cpupower frequency-set -g ${cfg.cpuFreqGovernor}
+ '';
+ unitConfig.ConditionVirtualization = false;
+ serviceConfig = {
+ Type = "oneshot";
+ RemainAfterExit = "yes";
};
- };
+ };
+ };
}
diff --git a/nixos/modules/tasks/filesystems.nix b/nixos/modules/tasks/filesystems.nix
index b0bcd2eb373eab2ee9edb45beefd09f57f875c5d..954d0b0781f7c3fc13a3c3fd3ab03b1e2d600d0b 100644
--- a/nixos/modules/tasks/filesystems.nix
+++ b/nixos/modules/tasks/filesystems.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, utils, ... }:
+{ config, lib, pkgs, utils, ... }:
-with pkgs.lib;
+with lib;
with utils;
let
@@ -148,7 +148,7 @@ in
system.fsPackages = [ pkgs.dosfstools ];
environment.systemPackages =
- [ pkgs.ntfs3g pkgs.cifs_utils ]
+ [ pkgs.ntfs3g pkgs.cifs_utils pkgs.fuse ]
++ config.system.fsPackages;
environment.etc.fstab.text =
diff --git a/nixos/modules/tasks/filesystems/btrfs.nix b/nixos/modules/tasks/filesystems/btrfs.nix
index d95a32e2e3f7484955107dc45ed5c03699ae6445..d0a2ac645e0b5011da3b49adc6d3977efb035ad5 100644
--- a/nixos/modules/tasks/filesystems/btrfs.nix
+++ b/nixos/modules/tasks/filesystems/btrfs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/tasks/filesystems/nfs.nix b/nixos/modules/tasks/filesystems/nfs.nix
index 2b720a93b893f9d46417e4dafd79a4b69b7425fb..e8c3d8ab56d531e04166f64ef9b91fbaeb3ba11f 100644
--- a/nixos/modules/tasks/filesystems/nfs.nix
+++ b/nixos/modules/tasks/filesystems/nfs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/tasks/filesystems/reiserfs.nix b/nixos/modules/tasks/filesystems/reiserfs.nix
index f8c6a70000409a3d30f99f8b6a8cb0c2a637896d..a3bfb3fed8ef70446b4eb5446d29bda1ad3e3b8c 100644
--- a/nixos/modules/tasks/filesystems/reiserfs.nix
+++ b/nixos/modules/tasks/filesystems/reiserfs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/tasks/filesystems/vfat.nix b/nixos/modules/tasks/filesystems/vfat.nix
index 5ca72f142b7d7e5aebc30648f47175fd511f41f2..4cfe6e208f7e192722e9f5d6b4b78d8596af368b 100644
--- a/nixos/modules/tasks/filesystems/vfat.nix
+++ b/nixos/modules/tasks/filesystems/vfat.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/tasks/filesystems/xfs.nix b/nixos/modules/tasks/filesystems/xfs.nix
index 6800696a05a3b437f83372469ffb91e032243756..5225b62a88c593221c5175caa0b2e8810aa0e680 100644
--- a/nixos/modules/tasks/filesystems/xfs.nix
+++ b/nixos/modules/tasks/filesystems/xfs.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix
index 7c3c662eeac939f49a5836b49175c836bf1ed460..1d75a24692c000d671a3e31fa30b979e5beedd76 100644
--- a/nixos/modules/tasks/filesystems/zfs.nix
+++ b/nixos/modules/tasks/filesystems/zfs.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
#
# todo:
# - crontab for scrubs, etc
@@ -6,23 +6,35 @@
# - /etc/zfs/zpool.cache handling
-with pkgs.lib;
+with lib;
let
cfgSpl = config.boot.spl;
+ cfgSnapshots = config.services.zfs.autoSnapshot;
+
inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems;
inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems;
+
+ enableAutoSnapshots = cfgSnapshots.enable;
+ enableZfs = inInitrd || inSystem || enableAutoSnapshots;
+
kernel = config.boot.kernelPackages;
+ autosnapPkg = pkgs.zfstools.override {
+ zfs = config.boot.kernelPackages.zfs;
+ };
+
+ zfsAutoSnap = "${autosnapPkg}/bin/zfs-auto-snapshot";
+
in
{
###### interface
-
- options = {
- boot.spl.hostid = mkOption {
+
+ options = {
+ boot.spl.hostid = mkOption {
default = "";
example = "0xdeadbeef";
description = ''
@@ -34,62 +46,177 @@ in
manually import pools.
'';
};
- };
- ###### implementation
+ services.zfs.autoSnapshot = {
+ enable = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Enable the (OpenSolaris-compatible) ZFS auto-snapshotting service.
+ Note that you must set the com.sun:auto-snapshot
+ property to true on all datasets which you wish
+ to auto-snapshot.
- config = mkIf ( inInitrd || inSystem ) {
+ You can override a child dataset to use, or not use auto-snapshotting
+ by setting its flag with the given interval:
+ zfs set com.sun:auto-snapshot:weekly=false DATASET
+ '';
+ };
- boot = {
- kernelModules = [ "spl" "zfs" ] ;
- extraModulePackages = [ kernel.zfs kernel.spl ];
- extraModprobeConfig = mkIf (cfgSpl.hostid != "") ''
- options spl spl_hostid=${cfgSpl.hostid}
- '';
- };
+ frequent = mkOption {
+ default = 4;
+ type = types.int;
+ description = ''
+ Number of frequent (15-minute) auto-snapshots that you wish to keep.
+ '';
+ };
+
+ hourly = mkOption {
+ default = 24;
+ type = types.int;
+ description = ''
+ Number of hourly auto-snapshots that you wish to keep.
+ '';
+ };
+
+ daily = mkOption {
+ default = 7;
+ type = types.int;
+ description = ''
+ Number of daily auto-snapshots that you wish to keep.
+ '';
+ };
- boot.initrd = mkIf inInitrd {
- kernelModules = [ "spl" "zfs" ] ;
- extraUtilsCommands =
- ''
- cp -v ${kernel.zfs}/sbin/zfs $out/bin
- cp -v ${kernel.zfs}/sbin/zdb $out/bin
- cp -v ${kernel.zfs}/sbin/zpool $out/bin
- cp -pdv ${kernel.zfs}/lib/lib*.so* $out/lib
- cp -pdv ${pkgs.zlib}/lib/lib*.so* $out/lib
+ weekly = mkOption {
+ default = 4;
+ type = types.int;
+ description = ''
+ Number of weekly auto-snapshots that you wish to keep.
'';
- postDeviceCommands =
- ''
- zpool import -f -a -d /dev
+ };
+
+ monthly = mkOption {
+ default = 12;
+ type = types.int;
+ description = ''
+ Number of monthly auto-snapshots that you wish to keep.
'';
+ };
};
+ };
- systemd.services."zpool-import" = {
- description = "Import zpools";
- after = [ "systemd-udev-settle.service" ];
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
+ ###### implementation
+
+ config = mkMerge [
+ (mkIf enableZfs {
+ boot = {
+ kernelModules = [ "spl" "zfs" ] ;
+ extraModulePackages = [ kernel.zfs kernel.spl ];
+ extraModprobeConfig = mkIf (cfgSpl.hostid != "") ''
+ options spl spl_hostid=${cfgSpl.hostid}
+ '';
+ };
+
+ boot.initrd = mkIf inInitrd {
+ kernelModules = [ "spl" "zfs" ] ;
+ extraUtilsCommands =
+ ''
+ cp -v ${kernel.zfs}/sbin/zfs $out/bin
+ cp -v ${kernel.zfs}/sbin/zdb $out/bin
+ cp -v ${kernel.zfs}/sbin/zpool $out/bin
+ cp -pdv ${kernel.zfs}/lib/lib*.so* $out/lib
+ cp -pdv ${pkgs.zlib}/lib/lib*.so* $out/lib
+ '';
+ postDeviceCommands =
+ ''
+ zpool import -f -a
+ '';
+ };
+
+ systemd.services."zpool-import" = {
+ description = "Import zpools";
+ after = [ "systemd-udev-settle.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ RemainAfterExit = true;
+ ExecStart = "${kernel.zfs}/sbin/zpool import -f -a";
+ };
restartIfChanged = false;
- ExecStart = "${kernel.zfs}/sbin/zpool import -f -a -d /dev";
};
- };
- systemd.services."zfs-mount" = {
- description = "Mount ZFS Volumes";
- after = [ "zpool-import.service" ];
- wantedBy = [ "local-fs.target" ];
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
+ systemd.services."zfs-mount" = {
+ description = "Mount ZFS Volumes";
+ after = [ "zpool-import.service" ];
+ wantedBy = [ "local-fs.target" ];
+ serviceConfig = {
+ Type = "oneshot";
+ RemainAfterExit = true;
+ ExecStart = "${kernel.zfs}/sbin/zfs mount -a";
+ ExecStop = "${kernel.zfs}/sbin/zfs umount -a";
+ };
restartIfChanged = false;
- ExecStart = "${kernel.zfs}/sbin/zfs mount -a";
- ExecStop = "${kernel.zfs}/sbin/zfs umount -a";
};
- };
- system.fsPackages = [ kernel.zfs ]; # XXX: needed? zfs doesn't have (need) a fsck
- environment.systemPackages = [ kernel.zfs ];
- services.udev.packages = [ kernel.zfs ]; # to hook zvol naming, etc.
- };
+ system.fsPackages = [ kernel.zfs ]; # XXX: needed? zfs doesn't have (need) a fsck
+ environment.systemPackages = [ kernel.zfs ];
+ services.udev.packages = [ kernel.zfs ]; # to hook zvol naming, etc.
+ })
+
+ (mkIf enableAutoSnapshots {
+ systemd.services."zfs-snapshot-frequent" = {
+ description = "ZFS auto-snapshotting every 15 mins";
+ after = [ "zpool-import.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${zfsAutoSnap} frequent ${toString cfgSnapshots.frequent}";
+ };
+ restartIfChanged = false;
+ startAt = "*:15,30,45";
+ };
+
+ systemd.services."zfs-snapshot-hourly" = {
+ description = "ZFS auto-snapshotting every hour";
+ after = [ "zpool-import.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${zfsAutoSnap} hourly ${toString cfgSnapshots.hourly}";
+ };
+ restartIfChanged = false;
+ startAt = "hourly";
+ };
+
+ systemd.services."zfs-snapshot-daily" = {
+ description = "ZFS auto-snapshotting every day";
+ after = [ "zpool-import.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${zfsAutoSnap} daily ${toString cfgSnapshots.daily}";
+ };
+ restartIfChanged = false;
+ startAt = "daily";
+ };
+
+ systemd.services."zfs-snapshot-weekly" = {
+ description = "ZFS auto-snapshotting every week";
+ after = [ "zpool-import.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${zfsAutoSnap} weekly ${toString cfgSnapshots.weekly}";
+ };
+ restartIfChanged = false;
+ startAt = "weekly";
+ };
+
+ systemd.services."zfs-snapshot-monthly" = {
+ description = "ZFS auto-snapshotting every month";
+ after = [ "zpool-import.service" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${zfsAutoSnap} monthly ${toString cfgSnapshots.monthly}";
+ };
+ restartIfChanged = false;
+ startAt = "monthly";
+ };
+ })
+ ];
}
diff --git a/nixos/modules/tasks/kbd.nix b/nixos/modules/tasks/kbd.nix
index 1083fb784fc06d34736a54bcd3ae1a71072ce0ba..03c42404e5d55540ac406f3eb8b4f667f8f493c6 100644
--- a/nixos/modules/tasks/kbd.nix
+++ b/nixos/modules/tasks/kbd.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -52,19 +52,7 @@ in
# /dev/tty0 to prevent putting the X server in non-raw mode, and
# it has a restart trigger.
systemd.services."systemd-vconsole-setup" =
- { description = "Setup Virtual Console";
- wantedBy = [ "sysinit.target" "multi-user.target" ];
- before = [ "sysinit.target" "shutdown.target" ];
- conflicts = [ "shutdown.target" ];
- unitConfig =
- { DefaultDependencies = "no";
- ConditionPathExists = "/dev/tty1";
- };
- serviceConfig =
- { Type = "oneshot";
- RemainAfterExit = true;
- ExecStart = "${config.systemd.package}/lib/systemd/systemd-vconsole-setup /dev/tty1";
- };
+ { wantedBy = [ "multi-user.target" ];
restartTriggers = [ vconsoleConf ];
};
diff --git a/nixos/modules/tasks/lvm.nix b/nixos/modules/tasks/lvm.nix
index 0e0272388c76a714f044a8077353a032f7890fc2..d56a8a2f63a8d437fd9050f2a59fbea1497c4497 100644
--- a/nixos/modules/tasks/lvm.nix
+++ b/nixos/modules/tasks/lvm.nix
@@ -1,10 +1,12 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
+
+with lib;
{
###### implementation
- config = {
+ config = mkIf (!config.boot.isContainer) {
environment.systemPackages = [ pkgs.lvm2 ];
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index 9619f0f5ebe794fdcb7a419c750706750fcbe6db..9cc8b154324f8acdb7e1b32e311b0d43a5d6f0e0 100644
--- a/nixos/modules/tasks/network-interfaces.nix
+++ b/nixos/modules/tasks/network-interfaces.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -50,6 +50,26 @@ let
'';
};
+ ipv6Address = mkOption {
+ default = null;
+ example = "2001:1470:fffd:2098::e006";
+ type = types.nullOr types.string;
+ description = ''
+ IPv6 address of the interface. Leave empty to configure the
+ interface using NDP.
+ '';
+ };
+
+ ipv6prefixLength = mkOption {
+ default = 64;
+ example = 64;
+ type = types.int;
+ description = ''
+ Subnet mask of the interface, specified as the number of
+ bits in the prefix (64).
+ '';
+ };
+
macAddress = mkOption {
default = null;
example = "00:11:22:33:44:55";
@@ -171,6 +191,15 @@ in
'';
};
+ networking.useHostResolvConf = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ In containers, whether to use the
+ resolv.conf supplied by the host.
+ '';
+ };
+
networking.localCommands = mkOption {
default = "";
example = "text=anything; echo You can put $text here.";
@@ -401,9 +430,11 @@ in
EOF
# Disable or enable IPv6.
- if [ -e /proc/sys/net/ipv6/conf/all/disable_ipv6 ]; then
- echo ${if cfg.enableIPv6 then "0" else "1"} > /proc/sys/net/ipv6/conf/all/disable_ipv6
- fi
+ ${optionalString (!config.boot.isContainer) ''
+ if [ -e /proc/sys/net/ipv6/conf/all/disable_ipv6 ]; then
+ echo ${if cfg.enableIPv6 then "0" else "1"} > /proc/sys/net/ipv6/conf/all/disable_ipv6
+ fi
+ ''}
# Set the default gateway.
${optionalString (cfg.defaultGateway != "") ''
@@ -435,6 +466,7 @@ in
(let mask =
if i.prefixLength != null then toString i.prefixLength else
if i.subnetMask != "" then i.subnetMask else "32";
+ staticIPv6 = cfg.enableIPv6 && i.ipv6Address != null;
in
{ description = "Configuration of ${i.name}";
wantedBy = [ "network-interfaces.target" ];
@@ -468,11 +500,31 @@ in
echo "configuring interface..."
ip -4 addr flush dev "${i.name}"
ip -4 addr add "${i.ipAddress}/${mask}" dev "${i.name}"
+ restart_network_setup=true
+ else
+ echo "skipping configuring interface"
+ fi
+ ''
+ + optionalString (staticIPv6)
+ ''
+ # Only do a flush/add if it's necessary. This is
+ # useful when the Nix store is accessed via this
+ # interface (e.g. in a QEMU VM test).
+ if ! ip -6 -o a show dev "${i.name}" | grep "${i.ipv6Address}/${toString i.ipv6prefixLength}"; then
+ echo "configuring interface..."
+ ip -6 addr flush dev "${i.name}"
+ ip -6 addr add "${i.ipv6Address}/${toString i.ipv6prefixLength}" dev "${i.name}"
+ restart_network_setup=true
+ else
+ echo "skipping configuring interface"
+ fi
+ ''
+ + optionalString (i.ipAddress != null || staticIPv6)
+ ''
+ if [ restart_network_setup = true ]; then
# Ensure that the default gateway remains set.
# (Flushing this interface may have removed it.)
${config.systemd.package}/bin/systemctl try-restart --no-block network-setup.service
- else
- echo "skipping configuring interface"
fi
${config.systemd.package}/bin/systemctl start ip-up.target
''
diff --git a/nixos/modules/tasks/scsi-link-power-management.nix b/nixos/modules/tasks/scsi-link-power-management.nix
index 071a80865983549db24bd213d65c6c317764ea47..a74023dec21a95e123b66966634a14ec369b9a31 100644
--- a/nixos/modules/tasks/scsi-link-power-management.nix
+++ b/nixos/modules/tasks/scsi-link-power-management.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
###### interface
diff --git a/nixos/modules/testing/minimal-kernel.nix b/nixos/modules/testing/minimal-kernel.nix
index 0418de800c8d3d81d95ee8a79eebbb9835230282..0cbca71e132605066573ab51cae91935c4c71a37 100644
--- a/nixos/modules/testing/minimal-kernel.nix
+++ b/nixos/modules/testing/minimal-kernel.nix
@@ -5,7 +5,7 @@ let
(map (builtins.getAttr "configLine") config.system.requiredKernelConfig))
);
- origKernel = pkgs.linuxManualConfig {
+ origKernel = pkgs.buildLinux {
inherit (pkgs.linux) src version;
inherit configfile;
allowImportFromDerivation = true;
diff --git a/nixos/modules/testing/service-runner.nix b/nixos/modules/testing/service-runner.nix
index 6f17ed77dad98e3d5041aee89f449521c4c833a7..dfe8b430e04588f1ede9e177f117c8d6ee85da5f 100644
--- a/nixos/modules/testing/service-runner.nix
+++ b/nixos/modules/testing/service-runner.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/testing/test-instrumentation.nix b/nixos/modules/testing/test-instrumentation.nix
index 28494e1c7b2a8d16e7d3c25135486208a876b0e7..9100a433cd63269f6e1fe8d5f9fbe5f576026a4b 100644
--- a/nixos/modules/testing/test-instrumentation.nix
+++ b/nixos/modules/testing/test-instrumentation.nix
@@ -1,9 +1,9 @@
# This module allows the test driver to connect to the virtual machine
# via a root shell attached to port 514.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let kernel = config.boot.kernelPackages.kernel; in
@@ -86,6 +86,8 @@ let kernel = config.boot.kernelPackages.kernel; in
(isEnabled "VIRTIO_CONSOLE")
];
+ networking.usePredictableInterfaceNames = false;
+
};
}
diff --git a/nixos/modules/virtualisation/amazon-image.nix b/nixos/modules/virtualisation/amazon-image.nix
index abd2a1084bd9fa43113941bbab6050e77f10a383..18b18dd4b2309784eaad164087760020bebc1e15 100644
--- a/nixos/modules/virtualisation/amazon-image.nix
+++ b/nixos/modules/virtualisation/amazon-image.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
imports = [ ../profiles/headless.nix ./ec2-data.nix ];
@@ -164,5 +164,5 @@ with pkgs.lib;
# Prevent logging in as root without a password. This doesn't really matter,
# since the only PAM services that allow logging in with a null
# password are local ones that are inaccessible on EC2 machines.
- security.initialRootPassword = "!";
+ security.initialRootPassword = mkDefault "!";
}
diff --git a/nixos/modules/virtualisation/container-config.nix b/nixos/modules/virtualisation/container-config.nix
new file mode 100644
index 0000000000000000000000000000000000000000..195a8056bf82667c30400d159ce45d944ff51f95
--- /dev/null
+++ b/nixos/modules/virtualisation/container-config.nix
@@ -0,0 +1,91 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+{
+
+ config = mkIf config.boot.isContainer {
+
+ # Disable some features that are not useful in a container.
+ sound.enable = mkDefault false;
+ services.udisks2.enable = mkDefault false;
+
+ networking.useHostResolvConf = true;
+
+ # Shut up warnings about not having a boot loader.
+ system.build.installBootLoader = "${pkgs.coreutils}/bin/true";
+
+ # Provide a root login prompt on /var/lib/root-login.socket that
+ # doesn't ask for a password. This socket can only be used by root
+ # on the host.
+ systemd.sockets.root-login =
+ { description = "Root Login Socket";
+ wantedBy = [ "sockets.target" ];
+ socketConfig =
+ { ListenStream = "/var/lib/root-login.socket";
+ SocketMode = "0600";
+ Accept = true;
+ };
+ };
+
+ systemd.services."root-login@" =
+ { description = "Root Login %i";
+ environment.TERM = "linux";
+ serviceConfig =
+ { Type = "simple";
+ StandardInput = "socket";
+ ExecStart = "${pkgs.socat}/bin/socat -t0 - \"exec:${pkgs.shadow}/bin/login -f root,pty,setsid,setpgid,stderr,ctty\"";
+ TimeoutStopSec = 1; # FIXME
+ };
+ restartIfChanged = false;
+ };
+
+ # Provide a daemon on /var/lib/run-command.socket that reads a
+ # command from stdin and executes it.
+ systemd.sockets.run-command =
+ { description = "Run Command Socket";
+ wantedBy = [ "sockets.target" ];
+ socketConfig =
+ { ListenStream = "/var/lib/run-command.socket";
+ SocketMode = "0600"; # only root can connect
+ Accept = true;
+ };
+ };
+
+ systemd.services."run-command@" =
+ { description = "Run Command %i";
+ environment.TERM = "linux";
+ serviceConfig =
+ { Type = "simple";
+ StandardInput = "socket";
+ TimeoutStopSec = 1; # FIXME
+ };
+ script =
+ ''
+ #! ${pkgs.stdenv.shell} -e
+ source /etc/bashrc
+ read c
+ eval "command=($c)"
+ exec "''${command[@]}"
+ '';
+ restartIfChanged = false;
+ };
+
+ systemd.services.container-startup-done =
+ { description = "Container Startup Notification";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "multi-user.target" ];
+ script =
+ ''
+ if [ -p /var/lib/startup-done ]; then
+ echo done > /var/lib/startup-done
+ fi
+ '';
+ serviceConfig.Type = "oneshot";
+ serviceConfig.RemainAfterExit = true;
+ restartIfChanged = false;
+ };
+
+ };
+
+}
diff --git a/nixos/modules/virtualisation/containers.nix b/nixos/modules/virtualisation/containers.nix
index bcbfaacd703f6fcaa8fa052c0ed9f726c7c7a9e4..4fca872d72ebb5f48bed746167494d8a89d73100 100644
--- a/nixos/modules/virtualisation/containers.nix
+++ b/nixos/modules/virtualisation/containers.nix
@@ -1,6 +1,31 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
+
+let
+
+ runInNetns = pkgs.stdenv.mkDerivation {
+ name = "run-in-netns";
+ unpackPhase = "true";
+ buildPhase = ''
+ mkdir -p $out/bin
+ gcc ${./run-in-netns.c} -o $out/bin/run-in-netns
+ '';
+ installPhase = "true";
+ };
+
+ nixos-container = pkgs.substituteAll {
+ name = "nixos-container";
+ dir = "bin";
+ isExecutable = true;
+ src = ./nixos-container.pl;
+ perl = "${pkgs.perl}/bin/perl -I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl";
+ inherit (pkgs) socat;
+ };
+
+ system = config.nixpkgs.system;
+
+in
{
options = {
@@ -14,19 +39,12 @@ with pkgs.lib;
'';
};
- systemd.containers = mkOption {
+ containers = mkOption {
type = types.attrsOf (types.submodule (
{ config, options, name, ... }:
{
options = {
- root = mkOption {
- type = types.path;
- description = ''
- The root directory of the container.
- '';
- };
-
config = mkOption {
description = ''
A specification of the desired configuration of this
@@ -45,21 +63,54 @@ with pkgs.lib;
'';
};
+ privateNetwork = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to give the container its own private virtual
+ Ethernet interface. The interface is called
+ eth0, and is hooked up to the interface
+ c-container-name
+ on the host. If this option is not set, then the
+ container shares the network interfaces of the host,
+ and can bind to any port on any interface.
+ '';
+ };
+
+ hostAddress = mkOption {
+ type = types.nullOr types.string;
+ default = null;
+ example = "10.231.136.1";
+ description = ''
+ The IPv4 address assigned to the host interface.
+ '';
+ };
+
+ localAddress = mkOption {
+ type = types.nullOr types.string;
+ default = null;
+ example = "10.231.136.2";
+ description = ''
+ The IPv4 address assigned to eth0
+ in the container.
+ '';
+ };
+
};
config = mkMerge
- [ { root = mkDefault "/var/lib/containers/${name}";
- }
- (mkIf options.config.isDefined {
+ [ (mkIf options.config.isDefined {
path = (import ../../lib/eval-config.nix {
+ inherit system;
modules =
let extraConfig =
{ boot.isContainer = true;
- security.initialRootPassword = "!";
+ security.initialRootPassword = mkDefault "!";
networking.hostName = mkDefault name;
+ networking.useDHCP = false;
};
in [ extraConfig config.config ];
- prefix = [ "systemd" "containers" name ];
+ prefix = [ "containers" name ];
}).config.system.build.toplevel;
})
];
@@ -69,12 +120,10 @@ with pkgs.lib;
example = literalExample
''
{ webserver =
- { root = "/containers/webserver";
- path = "/nix/var/nix/profiles/webserver";
+ { path = "/nix/var/nix/profiles/webserver";
};
database =
- { root = "/containers/database";
- config =
+ { config =
{ config, pkgs, ... }:
{ services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql92;
@@ -94,44 +143,151 @@ with pkgs.lib;
};
- config = {
+ config = mkIf (!config.boot.isContainer) {
+
+ systemd.services."container@" =
+ { description = "Container '%i'";
- systemd.services = mapAttrs' (name: container: nameValuePair "container-${name}"
- { description = "Container '${name}'";
+ unitConfig.RequiresMountsFor = [ "/var/lib/containers/%i" ];
- wantedBy = [ "multi-user.target" ];
+ path = [ pkgs.iproute ];
- unitConfig.RequiresMountsFor = [ container.root ];
+ environment.INSTANCE = "%i";
+ environment.root = "/var/lib/containers/%i";
preStart =
''
- mkdir -p -m 0755 ${container.root}/etc
- if ! [ -e ${container.root}/etc/os-release ]; then
- touch ${container.root}/etc/os-release
+ mkdir -p -m 0755 $root/var/lib
+
+ # Create a named pipe to get a signal when the container
+ # has finished booting.
+ rm -f $root/var/lib/startup-done
+ mkfifo -m 0600 $root/var/lib/startup-done
+ '';
+
+ script =
+ ''
+ mkdir -p -m 0755 "$root/etc" "$root/var/lib"
+ if ! [ -e "$root/etc/os-release" ]; then
+ touch "$root/etc/os-release"
+ fi
+
+ mkdir -p -m 0755 \
+ "/nix/var/nix/profiles/per-container/$INSTANCE" \
+ "/nix/var/nix/gcroots/per-container/$INSTANCE"
+
+ if [ -f "/etc/containers/$INSTANCE.conf" ]; then
+ . "/etc/containers/$INSTANCE.conf"
fi
+
+ # Cleanup from last time.
+ ifaceHost=c-$INSTANCE
+ ifaceCont=ctmp-$INSTANCE
+ ns=net-$INSTANCE
+ ip netns del $ns 2> /dev/null || true
+ ip link del $ifaceHost 2> /dev/null || true
+ ip link del $ifaceCont 2> /dev/null || true
+
+ if [ "$PRIVATE_NETWORK" = 1 ]; then
+ # Create a pair of virtual ethernet devices. On the host,
+ # we get ‘c- /dev/null; then break; fi
- sleep 1
- done
+ machinectl poweroff "$INSTANCE"
+ '';
+
+ restartIfChanged = false;
+ #reloadIfChanged = true; # FIXME
+
+ serviceConfig.ExecReload = pkgs.writeScript "reload-container"
+ ''
+ #! ${pkgs.stdenv.shell} -e
+ SYSTEM_PATH=/nix/var/nix/profiles/system
+ if [ -f "/etc/containers/$INSTANCE.conf" ]; then
+ . "/etc/containers/$INSTANCE.conf"
fi
+ echo $SYSTEM_PATH/bin/switch-to-configuration test | \
+ ${pkgs.socat}/bin/socat unix:$root/var/lib/run-command.socket -
+ '';
+
+ serviceConfig.SyslogIdentifier = "container %i";
+ };
+
+ # Generate a configuration file in /etc/containers for each
+ # container so that container@.target can get the container
+ # configuration.
+ environment.etc = mapAttrs' (name: cfg: nameValuePair "containers/${name}.conf"
+ { text =
+ ''
+ SYSTEM_PATH=${cfg.path}
+ ${optionalString cfg.privateNetwork ''
+ PRIVATE_NETWORK=1
+ ${optionalString (cfg.hostAddress != null) ''
+ HOST_ADDRESS=${cfg.hostAddress}
+ ''}
+ ${optionalString (cfg.localAddress != null) ''
+ LOCAL_ADDRESS=${cfg.localAddress}
+ ''}
+ ''}
'';
- }) config.systemd.containers;
+ }) config.containers;
+
+ # FIXME: auto-start containers.
+
+ # Generate /etc/hosts entries for the containers.
+ networking.extraHosts = concatStrings (mapAttrsToList (name: cfg: optionalString (cfg.localAddress != null)
+ ''
+ ${cfg.localAddress} ${name}.containers
+ '') config.containers);
+
+ environment.systemPackages = [ nixos-container ];
};
-}
\ No newline at end of file
+}
diff --git a/nixos/modules/virtualisation/ec2-data.nix b/nixos/modules/virtualisation/ec2-data.nix
index 5133a98cd962893ecc66a25ccb0fa2c786c04c80..246d3506531720814f11d25a13e1197c9dd530a7 100644
--- a/nixos/modules/virtualisation/ec2-data.nix
+++ b/nixos/modules/virtualisation/ec2-data.nix
@@ -2,9 +2,9 @@
# host name of virtual machines running on Amazon EC2, Eucalyptus and
# OpenStack Compute (Nova).
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
options = {
diff --git a/nixos/modules/virtualisation/google-compute-image.nix b/nixos/modules/virtualisation/google-compute-image.nix
index 098c9ede853312107eb785d448e17eeae7895643..34b8b0e9c1caeb8e78aa4f39bb191df54a3b39cc 100644
--- a/nixos/modules/virtualisation/google-compute-image.nix
+++ b/nixos/modules/virtualisation/google-compute-image.nix
@@ -1,7 +1,9 @@
-{ config, pkgs, ... }:
-
-with pkgs.lib;
+{ config, lib, pkgs, ... }:
+with lib;
+let
+ diskSize = "100G";
+in
{
imports = [ ../profiles/headless.nix ../profiles/qemu-guest.nix ];
@@ -12,7 +14,7 @@ with pkgs.lib;
''
mkdir $out
diskImage=$out/$diskImageBase
- truncate $diskImage --size 10G
+ truncate $diskImage --size ${diskSize}
mv closure xchg/
'';
@@ -20,8 +22,9 @@ with pkgs.lib;
''
PATH=$PATH:${pkgs.gnutar}/bin:${pkgs.gzip}/bin
pushd $out
- tar -Szcf $diskImageBase.tar.gz $diskImageBase
- rm $out/$diskImageBase
+ mv $diskImageBase disk.raw
+ tar -Szcf $diskImageBase.tar.gz disk.raw
+ rm $out/disk.raw
popd
'';
diskImageBase = "nixos-${config.system.nixosVersion}-${pkgs.stdenv.system}.raw";
@@ -32,7 +35,7 @@ with pkgs.lib;
''
# Create partition table
${pkgs.parted}/sbin/parted /dev/vda mklabel msdos
- ${pkgs.parted}/sbin/parted /dev/vda mkpart primary ext4 1 10G
+ ${pkgs.parted}/sbin/parted /dev/vda mkpart primary ext4 1 ${diskSize}
${pkgs.parted}/sbin/parted /dev/vda print
. /sys/class/block/vda1/uevent
mknod /dev/vda1 b $MAJOR $MINOR
@@ -114,7 +117,7 @@ with pkgs.lib;
# Prevent logging in as root without a password. This doesn't really matter,
# since the only PAM services that allow logging in with a null
# password are local ones that are inaccessible on Google Compute machines.
- security.initialRootPassword = "!";
+ security.initialRootPassword = mkDefault "!";
# Configure default metadata hostnames
networking.extraHosts = ''
diff --git a/nixos/modules/virtualisation/libvirtd.nix b/nixos/modules/virtualisation/libvirtd.nix
index 583b09192e33d8265988ff73e92a0d676d329870..d7d700d88412d841cab51dee5d78365925b824f2 100644
--- a/nixos/modules/virtualisation/libvirtd.nix
+++ b/nixos/modules/virtualisation/libvirtd.nix
@@ -1,8 +1,8 @@
# Systemd services for libvirtd.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -24,6 +24,7 @@ in
virtualisation.libvirtd.enable =
mkOption {
+ type = types.bool;
default = false;
description =
''
@@ -36,6 +37,7 @@ in
virtualisation.libvirtd.enableKVM =
mkOption {
+ type = types.bool;
default = true;
description =
''
@@ -45,6 +47,7 @@ in
virtualisation.libvirtd.extraConfig =
mkOption {
+ type = types.lines;
default = "";
description =
''
diff --git a/nixos/modules/virtualisation/nixos-container.pl b/nixos/modules/virtualisation/nixos-container.pl
new file mode 100644
index 0000000000000000000000000000000000000000..2fd41a3409620df51d214ca4dbbc031b21e716e8
--- /dev/null
+++ b/nixos/modules/virtualisation/nixos-container.pl
@@ -0,0 +1,238 @@
+#! @perl@
+
+use strict;
+use POSIX;
+use File::Path;
+use File::Slurp;
+use Fcntl ':flock';
+use Getopt::Long qw(:config gnu_getopt);
+
+my $socat = '@socat@/bin/socat';
+
+# Parse the command line.
+
+sub showHelp {
+ print < [--config ] [--ensure-unique-name]
+ nixos-container destroy
+ nixos-container start
+ nixos-container stop
+ nixos-container login
+ nixos-container root-login
+ nixos-container run -- args...
+ nixos-container set-root-password
+ nixos-container show-ip
+EOF
+ exit 0;
+}
+
+my $ensureUniqueName = 0;
+my $extraConfig = "";
+
+GetOptions(
+ "help" => sub { showHelp() },
+ "ensure-unique-name" => \$ensureUniqueName,
+ "config=s" => \$extraConfig
+ ) or exit 1;
+
+my $action = $ARGV[0] or die "$0: no action specified\n";
+
+
+# Execute the selected action.
+
+mkpath("/etc/containers", 0, 0755);
+mkpath("/var/lib/containers", 0, 0700);
+
+if ($action eq "list") {
+ foreach my $confFile (glob "/etc/containers/*.conf") {
+ $confFile =~ /\/([^\/]+).conf$/ or next;
+ print "$1\n";
+ }
+ exit 0;
+}
+
+my $containerName = $ARGV[1] or die "$0: no container name specified\n";
+$containerName =~ /^[a-zA-Z0-9\-]+$/ or die "$0: invalid container name\n";
+
+sub writeNixOSConfig {
+ my ($nixosConfigFile) = @_;
+
+ my $nixosConfig = <>', $lockFN) or die "$0: opening $lockFN: $!";
+ flock($lock, LOCK_EX) or die "$0: could not lock $lockFN: $!";
+
+ my $confFile = "/etc/containers/$containerName.conf";
+ my $root = "/var/lib/containers/$containerName";
+
+ # Maybe generate a unique name.
+ if ($ensureUniqueName) {
+ my $base = $containerName;
+ for (my $nr = 0; ; $nr++) {
+ $containerName = "$base-$nr";
+ $confFile = "/etc/containers/$containerName.conf";
+ $root = "/var/lib/containers/$containerName";
+ last unless -e $confFile || -e $root;
+ }
+ }
+
+ die "$0: container ‘$containerName’ already exists\n" if -e $confFile;
+
+ # Get an unused IP address.
+ my %usedIPs;
+ foreach my $confFile2 (glob "/etc/containers/*.conf") {
+ my $s = read_file($confFile2) or die;
+ $usedIPs{$1} = 1 if $s =~ /^HOST_ADDRESS=([0-9\.]+)$/m;
+ $usedIPs{$1} = 1 if $s =~ /^LOCAL_ADDRESS=([0-9\.]+)$/m;
+ }
+
+ my ($ipPrefix, $hostAddress, $localAddress);
+ for (my $nr = 1; $nr < 255; $nr++) {
+ $ipPrefix = "10.233.$nr";
+ $hostAddress = "$ipPrefix.1";
+ $localAddress = "$ipPrefix.2";
+ last unless $usedIPs{$hostAddress} || $usedIPs{$localAddress};
+ $ipPrefix = undef;
+ }
+
+ die "$0: out of IP addresses\n" unless defined $ipPrefix;
+
+ my @conf;
+ push @conf, "PRIVATE_NETWORK=1\n";
+ push @conf, "HOST_ADDRESS=$hostAddress\n";
+ push @conf, "LOCAL_ADDRESS=$localAddress\n";
+ write_file($confFile, \@conf);
+
+ close($lock);
+
+ print STDERR "host IP is $hostAddress, container IP is $localAddress\n";
+
+ mkpath("$root/etc/nixos", 0, 0755);
+
+ my $nixosConfigFile = "$root/etc/nixos/configuration.nix";
+ writeNixOSConfig $nixosConfigFile;
+
+ # The per-container directory is restricted to prevent users on
+ # the host from messing with guest users who happen to have the
+ # same uid.
+ my $profileDir = "/nix/var/nix/profiles/per-container";
+ mkpath($profileDir, 0, 0700);
+ $profileDir = "$profileDir/$containerName";
+ mkpath($profileDir, 0, 0755);
+
+ system("nix-env", "-p", "$profileDir/system",
+ "-I", "nixos-config=$nixosConfigFile", "-f", "",
+ "--set", "-A", "system") == 0
+ or die "$0: failed to build initial container configuration\n";
+
+ print "$containerName\n" if $ensureUniqueName;
+ exit 0;
+}
+
+my $root = "/var/lib/containers/$containerName";
+my $profileDir = "/nix/var/nix/profiles/per-container/$containerName";
+my $confFile = "/etc/containers/$containerName.conf";
+die "$0: container ‘$containerName’ does not exist\n" if !-e $confFile;
+
+sub isContainerRunning {
+ my $status = `systemctl show 'container\@$containerName'`;
+ return $status =~ /ActiveState=active/;
+}
+
+sub stopContainer {
+ system("systemctl", "stop", "container\@$containerName") == 0
+ or die "$0: failed to stop container\n";
+}
+
+if ($action eq "destroy") {
+ die "$0: cannot destroy declarative container (remove it from your configuration.nix instead)\n"
+ unless POSIX::access($confFile, &POSIX::W_OK);
+
+ stopContainer if isContainerRunning;
+
+ rmtree($profileDir) if -e $profileDir;
+ rmtree($root) if -e $root;
+ unlink($confFile) or die;
+}
+
+elsif ($action eq "start") {
+ system("systemctl", "start", "container\@$containerName") == 0
+ or die "$0: failed to start container\n";
+}
+
+elsif ($action eq "stop") {
+ stopContainer;
+}
+
+elsif ($action eq "update") {
+ my $nixosConfigFile = "$root/etc/nixos/configuration.nix";
+
+ # FIXME: may want to be more careful about clobbering the existing
+ # configuration.nix.
+ writeNixOSConfig $nixosConfigFile if defined $extraConfig;
+
+ system("nix-env", "-p", "$profileDir/system",
+ "-I", "nixos-config=$nixosConfigFile", "-f", "",
+ "--set", "-A", "system") == 0
+ or die "$0: failed to build container configuration\n";
+
+ if (isContainerRunning) {
+ print STDERR "reloading container...\n";
+ system("systemctl", "reload", "container\@$containerName") == 0
+ or die "$0: failed to reload container\n";
+ }
+}
+
+elsif ($action eq "login") {
+ exec("machinectl", "login", "--", $containerName);
+}
+
+elsif ($action eq "root-login") {
+ exec($socat, "unix:$root/var/lib/root-login.socket", "-,echo=0,raw");
+}
+
+elsif ($action eq "run") {
+ shift @ARGV; shift @ARGV;
+ open(SOCAT, "|-", $socat, "unix:$root/var/lib/run-command.socket", "-");
+ print SOCAT join(' ', map { "'$_'" } @ARGV), "\n";
+ close(SOCAT);
+}
+
+elsif ($action eq "set-root-password") {
+ # FIXME: don't get password from the command line.
+ my $password = $ARGV[2] or die "$0: no password given\n";
+ open(SOCAT, "|-", $socat, "unix:$root/var/lib/run-command.socket", "-");
+ print SOCAT "passwd\n";
+ print SOCAT "$password\n";
+ print SOCAT "$password\n";
+ close(SOCAT);
+}
+
+elsif ($action eq "show-ip") {
+ my $s = read_file($confFile) or die;
+ $s =~ /^LOCAL_ADDRESS=([0-9\.]+)$/m or die "$0: cannot get IP address\n";
+ print "$1\n";
+}
+
+else {
+ die "$0: unknown action ‘$action’\n";
+}
diff --git a/nixos/modules/virtualisation/nova-image.nix b/nixos/modules/virtualisation/nova-image.nix
index 5c9481b71278d25221df6b0657b8853a9f8b7b03..2523dacc0b563e17424907be0aaa57111fea899c 100644
--- a/nixos/modules/virtualisation/nova-image.nix
+++ b/nixos/modules/virtualisation/nova-image.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
imports = [ ../profiles/qemu-guest.nix ../profiles/headless.nix ./ec2-data.nix ];
diff --git a/nixos/modules/virtualisation/nova.nix b/nixos/modules/virtualisation/nova.nix
index e0d25183574e2c4d49567f4e9c302a02f7446332..8795b5b52d5a49047342e3bde403eaf1be30b7f6 100644
--- a/nixos/modules/virtualisation/nova.nix
+++ b/nixos/modules/virtualisation/nova.nix
@@ -1,8 +1,8 @@
# Module for Nova, a.k.a. OpenStack Compute.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/modules/virtualisation/qemu-vm.nix b/nixos/modules/virtualisation/qemu-vm.nix
index 2218e1045eb8e35320af3c128377b3447bb0f8f3..6605b94439bccba81c6b3c53a85cfe2e9873d118 100644
--- a/nixos/modules/virtualisation/qemu-vm.nix
+++ b/nixos/modules/virtualisation/qemu-vm.nix
@@ -7,9 +7,9 @@
# the VM in the host. On the other hand, the root filesystem is a
# read/writable disk image persistent across VM reboots.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -386,8 +386,7 @@ in
# When building a regular system configuration, override whatever
# video driver the host uses.
- services.xserver.videoDriver = mkVMOverride null;
- services.xserver.videoDrivers = mkVMOverride [ "vesa" ];
+ hardware.opengl.videoDrivers = mkVMOverride [ "vesa" ];
services.xserver.defaultDepth = mkVMOverride 0;
services.xserver.resolutions = mkVMOverride [ { x = 1024; y = 768; } ];
services.xserver.monitorSection =
@@ -400,6 +399,11 @@ in
# Wireless won't work in the VM.
networking.wireless.enable = mkVMOverride false;
+ # Speed up booting by not waiting for ARP.
+ networking.dhcpcd.extraConfig = "noarp";
+
+ networking.usePredictableInterfaceNames = false;
+
system.requiredKernelConfig = with config.lib.kernelConfig;
[ (isEnabled "VIRTIO_BLK")
(isEnabled "VIRTIO_PCI")
diff --git a/nixos/modules/virtualisation/run-in-netns.c b/nixos/modules/virtualisation/run-in-netns.c
new file mode 100644
index 0000000000000000000000000000000000000000..d375bddf2e6b9e29e11f4c4570ae9abfd49aa3bf
--- /dev/null
+++ b/nixos/modules/virtualisation/run-in-netns.c
@@ -0,0 +1,50 @@
+#define _GNU_SOURCE
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+int main(int argc, char * * argv)
+{
+ if (argc < 3) {
+ fprintf(stderr, "%s: missing arguments\n", argv[0]);
+ return 1;
+ }
+
+ char nsPath[PATH_MAX];
+
+ sprintf(nsPath, "/run/netns/%s", argv[1]);
+
+ int fd = open(nsPath, O_RDONLY);
+ if (fd == -1) {
+ fprintf(stderr, "%s: opening network namespace: %s\n", argv[0], strerror(errno));
+ return 1;
+ }
+
+ if (setns(fd, CLONE_NEWNET) == -1) {
+ fprintf(stderr, "%s: setting network namespace: %s\n", argv[0], strerror(errno));
+ return 1;
+ }
+
+ umount2(nsPath, MNT_DETACH);
+ if (unlink(nsPath) == -1) {
+ fprintf(stderr, "%s: unlinking network namespace: %s\n", argv[0], strerror(errno));
+ return 1;
+ }
+
+ /* FIXME: Remount /sys so that /sys/class/net reflects the
+ interfaces visible in the network namespace. This requires
+ bind-mounting /sys/fs/cgroups etc. */
+
+ execv(argv[2], argv + 2);
+ fprintf(stderr, "%s: running command: %s\n", argv[0], strerror(errno));
+ return 1;
+}
diff --git a/nixos/modules/virtualisation/virtualbox-guest.nix b/nixos/modules/virtualisation/virtualbox-guest.nix
index 664fd21781cd0a0d63eb59e737dba5e92a6b07b5..96354f1d81d0958c5ec90821ddbedad486b40bfb 100644
--- a/nixos/modules/virtualisation/virtualbox-guest.nix
+++ b/nixos/modules/virtualisation/virtualbox-guest.nix
@@ -1,8 +1,8 @@
# Module for VirtualBox guests.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
@@ -38,6 +38,8 @@ optionalAttrs (pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) # ugly...
boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ];
+ boot.kernelModules = [ "vboxsf" ];
+
users.extraGroups.vboxsf.gid = config.ids.gids.vboxsf;
systemd.services.virtualbox =
@@ -52,7 +54,7 @@ optionalAttrs (pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) # ugly...
serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/sbin/VBoxService VBoxService --foreground";
};
- services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" ];
+ hardware.opengl.videoDrivers = mkOverride 50 [ "virtualbox" ];
services.xserver.config =
''
diff --git a/nixos/modules/virtualisation/virtualbox-image.nix b/nixos/modules/virtualisation/virtualbox-image.nix
index 71bdf31a98d293ad0376b6a28270568f18949635..3247881784e458f8870ff298dbff31e00b71177b 100644
--- a/nixos/modules/virtualisation/virtualbox-image.nix
+++ b/nixos/modules/virtualisation/virtualbox-image.nix
@@ -1,6 +1,6 @@
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
{
system.build.virtualBoxImage =
@@ -92,7 +92,7 @@ with pkgs.lib;
--audiocontroller ac97 --audio alsa \
--rtcuseutc on \
--usb on --mouse usbtablet
- VBoxManage storagectl "$vmName" --name SATA --add sata --sataportcount 4 --bootable on --hostiocache on
+ VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \
--medium ${config.system.build.virtualBoxImage}/disk.vdi
@@ -111,5 +111,5 @@ with pkgs.lib;
# Prevent logging in as root without a password. For NixOps, we
# don't need this because the user can login via SSH, and for the
# demo images, there is a demo user account that can sudo to root.
- security.initialRootPassword = "!";
+ security.initialRootPassword = mkDefault "!";
}
diff --git a/nixos/modules/virtualisation/xen-dom0.nix b/nixos/modules/virtualisation/xen-dom0.nix
index 40f6929be4f0cd48a2efc87e956264fc0ebbef6d..566059472c9f214fc7f129b393aa34efed16ff89 100644
--- a/nixos/modules/virtualisation/xen-dom0.nix
+++ b/nixos/modules/virtualisation/xen-dom0.nix
@@ -1,8 +1,8 @@
# Xen hypervisor (Dom0) support.
-{ config, pkgs, ... }:
+{ config, lib, pkgs, ... }:
-with pkgs.lib;
+with lib;
let
diff --git a/nixos/release-combined.nix b/nixos/release-combined.nix
index dccc3acbf4642e5bedf3802561aa94dab4f5161e..32f523750004f7b1268b595fdac3e9f06b811535 100644
--- a/nixos/release-combined.nix
+++ b/nixos/release-combined.nix
@@ -44,7 +44,7 @@ in rec {
(all nixos.iso_graphical)
(all nixos.ova)
- #(all nixos.tests.efi-installer.simple)
+ # (all nixos.tests.efi-installer.simple)
(all nixos.tests.firefox)
(all nixos.tests.firewall)
(all nixos.tests.installer.grub1)
@@ -60,6 +60,8 @@ in rec {
(all nixos.tests.openssh)
(all nixos.tests.printing)
(all nixos.tests.proxy)
+ (all nixos.tests.udisks)
+ (all nixos.tests.udisks2)
(all nixos.tests.xfce)
nixpkgs.tarball
diff --git a/nixos/release.nix b/nixos/release.nix
index ff094cce05fae7d092d737a3a3b87c7a28491ec4..4a10ff39ed0c529ad5ae111ba6bc1825dd958860 100644
--- a/nixos/release.nix
+++ b/nixos/release.nix
@@ -14,6 +14,8 @@ let
forAllSystems = pkgs.lib.genAttrs systems;
+ callTest = fn: args: forAllSystems (system: import fn ({ inherit system; } // args));
+
pkgs = import nixpkgs { system = "x86_64-linux"; };
lib = pkgs.lib;
@@ -207,13 +209,43 @@ in rec {
*/
- # Run the tests in ./tests/default.nix for each platform. You can
- # run a test by doing e.g. "nix-build -A tests.login.x86_64-linux".
- tests =
- with lib;
- let
- testsFor = system:
- mapAttrsRecursiveCond (x: !x ? test) (n: v: listToAttrs [(nameValuePair system v.test)])
- (import ./tests { inherit nixpkgs system; });
- in fold recursiveUpdate {} (map testsFor systems);
+ # Run the tests for each platform. You can run a test by doing
+ # e.g. ‘nix-build -A tests.login.x86_64-linux’, or equivalently,
+ # ‘nix-build tests/login.nix -A result’.
+ tests.avahi = callTest tests/avahi.nix {};
+ tests.bittorrent = callTest tests/bittorrent.nix {};
+ tests.containers = callTest tests/containers.nix {};
+ tests.firefox = callTest tests/firefox.nix {};
+ tests.firewall = callTest tests/firewall.nix {};
+ tests.gnome3 = callTest tests/gnome3.nix {};
+ tests.installer.grub1 = forAllSystems (system: (import tests/installer.nix { inherit system; }).grub1.test);
+ tests.installer.lvm = forAllSystems (system: (import tests/installer.nix { inherit system; }).lvm.test);
+ tests.installer.rebuildCD = forAllSystems (system: (import tests/installer.nix { inherit system; }).rebuildCD.test);
+ tests.installer.separateBoot = forAllSystems (system: (import tests/installer.nix { inherit system; }).separateBoot.test);
+ tests.installer.simple = forAllSystems (system: (import tests/installer.nix { inherit system; }).simple.test);
+ tests.ipv6 = callTest tests/ipv6.nix {};
+ tests.jenkins = callTest tests/jenkins.nix {};
+ tests.kde4 = callTest tests/kde4.nix {};
+ tests.latestKernel.login = callTest tests/login.nix { latestKernel = true; };
+ tests.login = callTest tests/login.nix {};
+ tests.logstash = callTest tests/logstash.nix {};
+ tests.misc = callTest tests/misc.nix {};
+ tests.mumble = callTest tests/mumble.nix {};
+ tests.munin = callTest tests/munin.nix {};
+ tests.mysql = callTest tests/mysql.nix {};
+ tests.mysqlReplication = callTest tests/mysql-replication.nix {};
+ tests.nat = callTest tests/nat.nix {};
+ tests.nfs3 = callTest tests/nfs.nix { version = 3; };
+ tests.openssh = callTest tests/openssh.nix {};
+ tests.printing = callTest tests/printing.nix {};
+ tests.proxy = callTest tests/proxy.nix {};
+ tests.quake3 = callTest tests/quake3.nix {};
+ tests.rabbitmq = callTest tests/rabbitmq.nix {};
+ tests.runInMachine = callTest tests/run-in-machine.nix {};
+ tests.simple = callTest tests/simple.nix {};
+ tests.tomcat = callTest tests/tomcat.nix {};
+ tests.udisks = callTest tests/udisks.nix {};
+ tests.udisks2 = callTest tests/udisks2.nix {};
+ tests.xfce = callTest tests/xfce.nix {};
+
}
diff --git a/nixos/tests/avahi.nix b/nixos/tests/avahi.nix
index d95361dcd83d4249890e438ac5da03e25b851df7..4091e7ece50185fcb9a6a4068805ae1f979eceb0 100644
--- a/nixos/tests/avahi.nix
+++ b/nixos/tests/avahi.nix
@@ -1,8 +1,7 @@
-{ pkgs, ... }:
+# Test whether `avahi-daemon' and `libnss-mdns' work as expected.
-with pkgs;
+import ./make-test.nix {
-{
nodes = {
one =
{ config, pkgs, ... }: {
@@ -17,7 +16,6 @@ with pkgs;
};
};
- # Test whether `avahi-daemon' and `libnss-mdns' work as expected.
testScript =
'' startAll;
diff --git a/nixos/tests/bittorrent.nix b/nixos/tests/bittorrent.nix
index 6e67edb0b820d4b96529644e5c038775dc902e85..b58657a5ecdb59804aacceb19c9177d9a88f24f6 100644
--- a/nixos/tests/bittorrent.nix
+++ b/nixos/tests/bittorrent.nix
@@ -6,7 +6,7 @@
# which only works if the first client successfully uses the UPnP-IGD
# protocol to poke a hole in the NAT.
-{ pkgs, ... }:
+import ./make-test.nix ({ pkgs, ... }:
let
@@ -33,6 +33,8 @@ in
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
services.httpd.documentRoot = "/tmp";
+
+ networking.firewall.enable = false; # FIXME: figure out what ports we actually need
};
router =
@@ -40,8 +42,9 @@ in
{ environment.systemPackages = [ pkgs.miniupnpd ];
virtualisation.vlans = [ 1 2 ];
networking.nat.enable = true;
- networking.nat.internalIPs = [ "192.168.2.0/24" ];
+ networking.nat.internalInterfaces = [ "eth2" ];
networking.nat.externalInterface = "eth1";
+ networking.firewall.enable = false;
};
client1 =
@@ -50,11 +53,13 @@ in
virtualisation.vlans = [ 2 ];
networking.defaultGateway =
nodes.router.config.networking.interfaces.eth2.ipAddress;
+ networking.firewall.enable = false;
};
client2 =
{ config, pkgs, ... }:
{ environment.systemPackages = [ pkgs.transmission ];
+ networking.firewall.enable = false;
};
};
@@ -66,8 +71,8 @@ in
# Enable NAT on the router and start miniupnpd.
$router->waitForUnit("nat");
$router->succeed(
- "iptables -t nat -N MINIUPNPD",
- "iptables -t nat -A PREROUTING -i eth1 -j MINIUPNPD",
+ "iptables -w -t nat -N MINIUPNPD",
+ "iptables -w -t nat -A PREROUTING -i eth1 -j MINIUPNPD",
"echo 1 > /proc/sys/net/ipv4/ip_forward",
"miniupnpd -f ${miniupnpdConf nodes}"
);
@@ -75,7 +80,7 @@ in
# Create the torrent.
$tracker->succeed("mkdir /tmp/data");
$tracker->succeed("cp ${file} /tmp/data/test.tar.bz2");
- $tracker->succeed("transmission-create /tmp/data/test.tar.bz2 -t http://tracker:6969/announce -o /tmp/test.torrent");
+ $tracker->succeed("transmission-create /tmp/data/test.tar.bz2 -t http://${nodes.tracker.config.networking.interfaces.eth1.ipAddress}:6969/announce -o /tmp/test.torrent");
$tracker->succeed("chmod 644 /tmp/test.torrent");
# Start the tracker. !!! use a less crappy tracker
@@ -104,4 +109,4 @@ in
$client2->succeed("cmp /tmp/test.tar.bz2 ${file}");
'';
-}
+})
diff --git a/nixos/tests/common/user-account.nix b/nixos/tests/common/user-account.nix
index 8157cf8d263e836bea1ec374c2f3a6102517ce31..0239a3c4d08a0b02e0826c017153fb73a7229f6d 100644
--- a/nixos/tests/common/user-account.nix
+++ b/nixos/tests/common/user-account.nix
@@ -7,5 +7,6 @@
createHome = true;
useDefaultShell = true;
password = "foobar";
+ uid = 1000;
};
}
diff --git a/nixos/tests/containers.nix b/nixos/tests/containers.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8ad9cd6e0d791396919e687df0f90c4a3ff9ad41
--- /dev/null
+++ b/nixos/tests/containers.nix
@@ -0,0 +1,79 @@
+# Test for NixOS' container support.
+
+import ./make-test.nix {
+
+ machine =
+ { config, pkgs, ... }:
+ { imports = [ ../modules/installer/cd-dvd/channel.nix ];
+ virtualisation.writableStore = true;
+ virtualisation.memorySize = 768;
+
+ containers.webserver =
+ { privateNetwork = true;
+ hostAddress = "10.231.136.1";
+ localAddress = "10.231.136.2";
+ config =
+ { services.httpd.enable = true;
+ services.httpd.adminAddr = "foo@example.org";
+ networking.firewall.allowedTCPPorts = [ 80 ];
+ networking.firewall.allowPing = true;
+ };
+ };
+
+ virtualisation.pathsInNixDB = [ pkgs.stdenv ];
+ };
+
+ testScript =
+ ''
+ $machine->succeed("nixos-container list") =~ /webserver/ or die;
+
+ # Start the webserver container.
+ $machine->succeed("nixos-container start webserver");
+
+ # Since "start" returns after the container has reached
+ # multi-user.target, we should now be able to access it.
+ my $ip = $machine->succeed("nixos-container show-ip webserver");
+ chomp $ip;
+ $machine->succeed("ping -c1 $ip");
+ $machine->succeed("curl --fail http://$ip/ > /dev/null");
+
+ # Stop the container.
+ $machine->succeed("nixos-container stop webserver");
+ $machine->fail("curl --fail --connect-timeout 2 http://$ip/ > /dev/null");
+
+ # Make sure we have a NixOS tree (required by ‘nixos-container create’).
+ $machine->succeed("nix-env -qa -A nixos.pkgs.hello >&2");
+
+ # Create some containers imperatively.
+ my $id1 = $machine->succeed("nixos-container create foo --ensure-unique-name");
+ chomp $id1;
+ $machine->log("created container $id1");
+
+ my $id2 = $machine->succeed("nixos-container create foo --ensure-unique-name");
+ chomp $id2;
+ $machine->log("created container $id2");
+
+ die if $id1 eq $id2;
+
+ my $ip1 = $machine->succeed("nixos-container show-ip $id1");
+ chomp $ip1;
+ my $ip2 = $machine->succeed("nixos-container show-ip $id2");
+ chomp $ip2;
+ die if $ip1 eq $ip2;
+
+ # Start one of them.
+ $machine->succeed("nixos-container start $id1");
+
+ # Execute commands via the root shell.
+ $machine->succeed("nixos-container run $id1 -- uname") =~ /Linux/ or die;
+ $machine->succeed("nixos-container set-root-password $id1 foobar");
+
+ # Destroy the containers.
+ $machine->succeed("nixos-container destroy $id1");
+ $machine->succeed("nixos-container destroy $id2");
+
+ # Destroying a declarative container should fail.
+ $machine->fail("nixos-container destroy webserver");
+ '';
+
+}
diff --git a/nixos/tests/default.nix b/nixos/tests/default.nix
deleted file mode 100644
index 574e1dd2f8b8636f76cfec560948f79455494439..0000000000000000000000000000000000000000
--- a/nixos/tests/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{ nixpkgs ?
-, system ? builtins.currentSystem
-, minimal ? false
-}:
-
-with import ../lib/testing.nix { inherit system minimal; };
-
-{
- avahi = makeTest (import ./avahi.nix);
- bittorrent = makeTest (import ./bittorrent.nix);
- firefox = makeTest (import ./firefox.nix);
- firewall = makeTest (import ./firewall.nix);
- installer = makeTests (import ./installer.nix);
- efi-installer = makeTests (import ./efi-installer.nix);
- ipv6 = makeTest (import ./ipv6.nix);
- kde4 = makeTest (import ./kde4.nix);
- #kexec = makeTest (import ./kexec.nix);
- login = makeTest (import ./login.nix {});
- logstash = makeTest (import ./logstash.nix);
- latestKernel.login = makeTest (import ./login.nix ({ config, pkgs, ... }: { boot.kernelPackages = pkgs.linuxPackages_latest; }));
- misc = makeTest (import ./misc.nix);
- #mpich = makeTest (import ./mpich.nix);
- mysql = makeTest (import ./mysql.nix);
- mysql_replication = makeTest (import ./mysql-replication.nix);
- munin = makeTest (import ./munin.nix);
- nat = makeTest (import ./nat.nix);
- nfs3 = makeTest (import ./nfs.nix { version = 3; });
- #nfs4 = makeTest (import ./nfs.nix { version = 4; });
- openssh = makeTest (import ./openssh.nix);
- #partition = makeTest (import ./partition.nix);
- printing = makeTest (import ./printing.nix);
- proxy = makeTest (import ./proxy.nix);
- quake3 = makeTest (import ./quake3.nix);
- simple = makeTest (import ./simple.nix);
- #subversion = makeTest (import ./subversion.nix);
- tomcat = makeTest (import ./tomcat.nix);
- #trac = makeTest (import ./trac.nix);
- xfce = makeTest (import ./xfce.nix);
- runInMachine.test = import ./run-in-machine.nix { inherit system; };
-}
diff --git a/nixos/tests/firefox.nix b/nixos/tests/firefox.nix
index ca634ffcf1e0921d2a3462ab6d29a1dd9dfb2057..b42d473b8025f8503946cce3aec9701458657446 100644
--- a/nixos/tests/firefox.nix
+++ b/nixos/tests/firefox.nix
@@ -1,6 +1,4 @@
-{ pkgs, ... }:
-
-{
+import ./make-test.nix ({ pkgs, ... }: {
machine =
{ config, pkgs, ... }:
@@ -16,7 +14,6 @@
$machine->waitForWindow(qr/Valgrind/);
$machine->sleep(40); # wait until Firefox has finished loading the page
$machine->screenshot("screen");
-
'';
-}
+})
diff --git a/nixos/tests/firewall.nix b/nixos/tests/firewall.nix
index de32b98e5d2f71ad7a503497c7825db1e4c61f4d..d10e10b1d91ccc5b00348d42d13b866038e424e1 100644
--- a/nixos/tests/firewall.nix
+++ b/nixos/tests/firewall.nix
@@ -1,8 +1,6 @@
# Test the firewall module.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
nodes =
{ walled =
@@ -17,6 +15,7 @@
{ config, pkgs, ... }:
{ services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
+ networking.firewall.enable = false;
};
};
@@ -33,7 +32,7 @@
$walled->succeed("curl -v http://localhost/ >&2");
# Connections to the firewalled machine should fail.
- $attacker->fail("curl -v http://walled/ >&2");
+ $attacker->fail("curl --fail --connect-timeout 2 http://walled/ >&2");
$attacker->fail("ping -c 1 walled >&2");
# Outgoing connections/pings should still work.
diff --git a/nixos/tests/gnome3.nix b/nixos/tests/gnome3.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f1a6ce6333137ada435c64cb0df26909144ffb7d
--- /dev/null
+++ b/nixos/tests/gnome3.nix
@@ -0,0 +1,29 @@
+import ./make-test.nix {
+
+ 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;
+ };
+
+ 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->waitForWindow(qr/Terminal/);
+ $machine->sleep(10);
+ $machine->screenshot("screen");
+ '';
+
+}
diff --git a/nixos/tests/installer.nix b/nixos/tests/installer.nix
index 7581c10a01d0a6c85f73df238e0f827ff7466d62..43bea22d852e91a890eec59b8374327532b4ab75 100644
--- a/nixos/tests/installer.nix
+++ b/nixos/tests/installer.nix
@@ -1,7 +1,8 @@
-{ pkgs, system, ... }:
+{ system ? builtins.currentSystem }:
-with pkgs.lib;
+with import ../lib/testing.nix { inherit system; };
with import ../lib/qemu-flags.nix;
+with pkgs.lib;
let
@@ -39,7 +40,7 @@ let
{ imports =
[ ./hardware-configuration.nix
- "''${modulesPath}/testing/test-instrumentation.nix"
+
];
boot.loader.grub.version = ${toString grubVersion};
@@ -48,7 +49,6 @@ let
''}
boot.loader.grub.device = "${grubDevice}";
boot.loader.grub.extraConfig = "serial; terminal_output.serial";
- boot.initrd.kernelModules = [ "virtio_console" ];
environment.systemPackages = [ ${optionalString testChannel "pkgs.rlwrap"} ];
}
@@ -80,6 +80,8 @@ let
virtualisation.writableStore = true;
virtualisation.pathsInNixDB = channelContents ++ [ pkgs.hello.src ];
virtualisation.memorySize = 768;
+
+ networking.firewall.allowedTCPPorts = [ 80 ];
};
channelContents = [ pkgs.rlwrap ];
@@ -98,7 +100,7 @@ let
my $machine = createMachine({ hda => "harddisk",
hdaInterface => "${iface}",
cdrom => glob("${iso}/iso/*.iso"),
- qemuFlags => '${optionalString testChannel (toString (qemuNICFlags 1 1 2))} ${optionalString (pkgs.stdenv.system == "x86_64-linux") "-cpu kvm64"}'});
+ qemuFlags => '${optionalString testChannel (toString (qemuNICFlags 1 1 2))} ${optionalString (iso.system == "x86_64-linux") "-cpu kvm64"}'});
$machine->start;
${optionalString testChannel ''
@@ -177,7 +179,7 @@ let
# Test nixos-option.
$machine->succeed("nixos-option boot.initrd.kernelModules | grep virtio_console");
$machine->succeed("nixos-option -d boot.initrd.kernelModules | grep 'List of modules'");
- $machine->succeed("nixos-option -l boot.initrd.kernelModules | grep /etc/nixos/configuration.nix");
+ $machine->succeed("nixos-option -l boot.initrd.kernelModules | grep qemu-guest.nix");
$machine->shutdown;
@@ -189,8 +191,10 @@ let
'';
- makeTest = { createPartitions, fileSystems, testChannel ? false, grubVersion ? 2, grubDevice ? "/dev/vda" }:
- { inherit iso;
+ makeInstallerTest =
+ { createPartitions, fileSystems, testChannel ? false, grubVersion ? 2, grubDevice ? "/dev/vda" }:
+ makeTest {
+ inherit iso;
nodes = if testChannel then { inherit webserver; } else { };
testScript = testScriptFun {
inherit createPartitions fileSystems testChannel grubVersion grubDevice;
@@ -205,7 +209,7 @@ in {
# The (almost) simplest partitioning scheme: a swap partition and
# one big filesystem partition.
- simple = makeTest
+ simple = makeInstallerTest
{ createPartitions =
''
$machine->succeed(
@@ -224,7 +228,7 @@ in {
};
# Same as the previous, but now with a separate /boot partition.
- separateBoot = makeTest
+ separateBoot = makeInstallerTest
{ createPartitions =
''
$machine->succeed(
@@ -238,7 +242,7 @@ in {
"mkfs.ext3 -L nixos /dev/vda3",
"mount LABEL=nixos /mnt",
"mkfs.ext3 -L boot /dev/vda1",
- "mkdir /mnt/boot",
+ "mkdir -p /mnt/boot",
"mount LABEL=boot /mnt/boot",
);
'';
@@ -247,14 +251,14 @@ in {
# Create two physical LVM partitions combined into one volume group
# that contains the logical swap and root partitions.
- lvm = makeTest
+ lvm = makeInstallerTest
{ createPartitions =
''
$machine->succeed(
"parted /dev/vda mklabel msdos",
- "parted /dev/vda -- mkpart primary 1M 2048M", # first PV
+ "parted /dev/vda -- mkpart primary 1M 2048M", # PV1
"parted /dev/vda -- set 1 lvm on",
- "parted /dev/vda -- mkpart primary 2048M -1s", # second PV
+ "parted /dev/vda -- mkpart primary 2048M -1s", # PV2
"parted /dev/vda -- set 2 lvm on",
"udevadm settle",
"pvcreate /dev/vda1 /dev/vda2",
@@ -270,8 +274,7 @@ in {
fileSystems = rootFS;
};
- /*
- swraid = makeTest
+ swraid = makeInstallerTest
{ createPartitions =
''
$machine->succeed(
@@ -303,10 +306,9 @@ in {
'';
fileSystems = rootFS + bootFS;
};
- */
# Test a basic install using GRUB 1.
- grub1 = makeTest
+ grub1 = makeInstallerTest
{ createPartitions =
''
$machine->succeed(
@@ -327,7 +329,7 @@ in {
};
# Rebuild the CD configuration with a little modification.
- rebuildCD =
+ rebuildCD = makeTest
{ inherit iso;
nodes = { };
testScript =
diff --git a/nixos/tests/ipv6.nix b/nixos/tests/ipv6.nix
index 29d675e180a3f691363f70a90908554284e7fd0f..eb15363d3c32d72d164020f2ecfb640ca6e57fb4 100644
--- a/nixos/tests/ipv6.nix
+++ b/nixos/tests/ipv6.nix
@@ -1,9 +1,7 @@
# Test of IPv6 functionality in NixOS, including whether router
# solicication/advertisement using radvd works.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
nodes =
{ client = { config, pkgs, ... }: { };
@@ -12,6 +10,7 @@
{ config, pkgs, ... }:
{ services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
+ networking.firewall.allowedTCPPorts = [ 80 ];
};
router =
diff --git a/nixos/tests/jenkins.nix b/nixos/tests/jenkins.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9d3f76ca3e155bb77447e0a155c21d14c3bff820
--- /dev/null
+++ b/nixos/tests/jenkins.nix
@@ -0,0 +1,41 @@
+# verifies:
+# 1. jenkins service starts on master node
+# 2. jenkins user can be extended on both master and slave
+# 3. jenkins service not started on slave node
+
+import ./make-test.nix {
+
+ nodes = {
+
+ master =
+ { config, pkgs, ... }:
+ { services.jenkins.enable = true;
+
+ # should have no effect
+ services.jenkinsSlave.enable = true;
+
+ users.extraUsers.jenkins.extraGroups = [ "users" ];
+ };
+
+ slave =
+ { config, pkgs, ... }:
+ { services.jenkinsSlave.enable = true;
+
+ users.extraUsers.jenkins.extraGroups = [ "users" ];
+ };
+
+ };
+
+ testScript = ''
+ startAll;
+
+ $master->waitForUnit("jenkins");
+ print $master->execute("sudo -u jenkins groups");
+ $master->mustSucceed("sudo -u jenkins groups | grep jenkins | grep users");
+
+ print $slave->execute("sudo -u jenkins groups");
+ $slave->mustSucceed("sudo -u jenkins groups | grep jenkins | grep users");
+
+ $slave->mustFail("systemctl status jenkins.service");
+ '';
+}
diff --git a/nixos/tests/kde4.nix b/nixos/tests/kde4.nix
index 3fb35bbab09850213bf7a11c7f15aab7aa8c1e2d..725759ab758a89e73d772cec5d0324d80edb2a54 100644
--- a/nixos/tests/kde4.nix
+++ b/nixos/tests/kde4.nix
@@ -1,6 +1,4 @@
-{ pkgs, ... }:
-
-{
+import ./make-test.nix ({ pkgs, ... }: {
machine =
{ config, pkgs, ... }:
@@ -64,4 +62,4 @@
$machine->screenshot("screen");
'';
-}
+})
diff --git a/nixos/tests/kexec.nix b/nixos/tests/kexec.nix
index b8da332b919b453c9f12a5a5b4f2f9568200a82e..b09287682c01c66192e727c20bc7954305e3dd58 100644
--- a/nixos/tests/kexec.nix
+++ b/nixos/tests/kexec.nix
@@ -1,8 +1,6 @@
# Test whether fast reboots via kexec work.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
machine = { config, pkgs, ... }:
{ virtualisation.vlans = [ ]; };
diff --git a/nixos/tests/login.nix b/nixos/tests/login.nix
index ed7d978671798b10e04603d7152010988fd1d480..44c53c231c81249d753bf141cdb573799952b0a8 100644
--- a/nixos/tests/login.nix
+++ b/nixos/tests/login.nix
@@ -1,12 +1,16 @@
-config: { pkgs, ... }:
+import ./make-test.nix ({ pkgs, latestKernel ? false, ... }:
{
- machine = config;
+ machine =
+ { config, pkgs, lib, ... }:
+ { boot.kernelPackages = lib.mkIf latestKernel pkgs.linuxPackages_latest;
+ };
testScript =
''
- $machine->waitForUnit("default.target");
+ $machine->waitForUnit('multi-user.target');
+ $machine->waitUntilSucceeds("pgrep -f 'agetty.*tty1'");
$machine->screenshot("postboot");
subtest "create user", sub {
@@ -16,9 +20,11 @@ config: { pkgs, ... }:
# Check whether switching VTs works.
subtest "virtual console switching", sub {
+ $machine->fail("pgrep -f 'agetty.*tty2'");
$machine->sendKeys("alt-f2");
$machine->waitUntilSucceeds("[ \$(fgconsole) = 2 ]");
$machine->waitForUnit('getty@tty2.service');
+ $machine->waitUntilSucceeds("pgrep -f 'agetty.*tty2'");
};
# Log in as alice on a virtual console.
@@ -58,4 +64,4 @@ config: { pkgs, ... }:
};
'';
-}
+})
diff --git a/nixos/tests/logstash.nix b/nixos/tests/logstash.nix
index ee309d39f8725b5f61e65614d09d7878677ca1ee..e6aba7a10126545a5c8faeb88a6e6b02ac7a0460 100644
--- a/nixos/tests/logstash.nix
+++ b/nixos/tests/logstash.nix
@@ -1,9 +1,8 @@
-{ pkgs, ... }:
+# This test runs logstash and checks if messages flows and
+# elasticsearch is started.
-# This test runs logstash and checks if messages flows and elasticsearch is
-# started
+import ./make-test.nix {
-{
nodes = {
one =
{ config, pkgs, ... }:
@@ -28,10 +27,10 @@
};
};
};
-
+
testScript = ''
startAll;
-
+
$one->waitForUnit("logstash.service");
$one->waitUntilSucceeds("journalctl -n 20 _SYSTEMD_UNIT=logstash.service | grep flowers");
$one->fail("journalctl -n 20 _SYSTEMD_UNIT=logstash.service | grep dragons");
diff --git a/nixos/tests/make-test.nix b/nixos/tests/make-test.nix
new file mode 100644
index 0000000000000000000000000000000000000000..285ca5b71d6eef446f58ca3b9c2179294df6904c
--- /dev/null
+++ b/nixos/tests/make-test.nix
@@ -0,0 +1,5 @@
+f: { system ? builtins.currentSystem, ... } @ args:
+
+with import ../lib/testing.nix { inherit system; };
+
+makeTest (if builtins.isFunction f then f (args // { inherit pkgs; }) else f)
diff --git a/nixos/tests/misc.nix b/nixos/tests/misc.nix
index d355d705a24ca193f3ac163f13b437cafda92f52..363be2cbb35718da21dce149ad7f2f690bf95fea 100644
--- a/nixos/tests/misc.nix
+++ b/nixos/tests/misc.nix
@@ -1,8 +1,6 @@
# Miscellaneous small tests that don't warrant their own VM run.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
machine =
{ config, pkgs, ... }:
@@ -10,6 +8,7 @@
[ { device = "/root/swapfile"; size = 128; } ];
environment.variables.EDITOR = pkgs.lib.mkOverride 0 "emacs";
services.nixosManual.enable = pkgs.lib.mkOverride 0 true;
+ systemd.tmpfiles.rules = [ "d /tmp 1777 root root 10d" ];
};
testScript =
@@ -65,6 +64,22 @@
$machine->succeed('[ "`hostname`" = machine ]');
$machine->succeed('[ "`hostname -s`" = machine ]');
};
+
+ # Test whether systemd-udevd automatically loads modules for our hardware.
+ subtest "udev-auto-load", sub {
+ $machine->waitForUnit('systemd-udev-settle.service');
+ $machine->succeed('lsmod | grep psmouse');
+ };
+
+ # Test whether systemd-tmpfiles-clean works.
+ subtest "tmpfiles", sub {
+ $machine->succeed('touch /tmp/foo');
+ $machine->succeed('systemctl start systemd-tmpfiles-clean');
+ $machine->succeed('[ -e /tmp/foo ]');
+ $machine->succeed('date -s "@$(($(date +%s) + 1000000))"'); # move into the future
+ $machine->succeed('systemctl start systemd-tmpfiles-clean');
+ $machine->fail('[ -e /tmp/foo ]');
+ };
'';
}
diff --git a/nixos/tests/mpich.nix b/nixos/tests/mpich.nix
index d57512ebdfedd4b113a5159e3e09c6038cecb76f..13cd0960d07cc2d180ad0aad9806b84c9d7dbf9a 100644
--- a/nixos/tests/mpich.nix
+++ b/nixos/tests/mpich.nix
@@ -1,10 +1,6 @@
# Simple example to showcase distributed tests using NixOS VMs.
-{ pkgs, ... }:
-
-with pkgs;
-
-{
+import ./make-test.nix {
nodes = {
master =
{ config, pkgs, ... }: {
diff --git a/nixos/tests/mumble.nix b/nixos/tests/mumble.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8896830b0c22acc22b3077f394d7af6496a07a79
--- /dev/null
+++ b/nixos/tests/mumble.nix
@@ -0,0 +1,55 @@
+import ./make-test.nix (
+
+let
+ client = { config, pkgs, ... }: {
+ imports = [ ./common/x11.nix ];
+ environment.systemPackages = [ pkgs.mumble ];
+ };
+in
+{
+ nodes = {
+ server = { config, pkgs, ... }: {
+ services.murmur.enable = true;
+ services.murmur.registerName = "NixOS tests";
+ networking.firewall.allowedTCPPorts = [ config.services.murmur.port ];
+ };
+
+ client1 = client;
+ client2 = client;
+ };
+
+ testScript = ''
+ startAll;
+
+ $server->waitForUnit("murmur.service");
+ $client1->waitForX;
+ $client2->waitForX;
+
+ $client1->execute("mumble mumble://client1\@server/test &");
+ $client2->execute("mumble mumble://client2\@server/test &");
+
+ $server->sleep(10); # Wait for Mumble UI to pop up
+
+ # cancel client audio configuration
+ $client1->sendKeys("esc");
+ $client2->sendKeys("esc");
+ $server->sleep(1);
+
+ # cancel client cert configuration
+ $client1->sendKeys("esc");
+ $client2->sendKeys("esc");
+ $server->sleep(1);
+
+ # accept server certificate
+ $client1->sendChars("y");
+ $client2->sendChars("y");
+
+ # Find clients in logs
+ $server->waitUntilSucceeds("grep -q 'client1' /var/log/murmur/murmurd.log");
+ $server->waitUntilSucceeds("grep -q 'client2' /var/log/murmur/murmurd.log");
+
+ $server->sleep(5); # wait to get screenshot
+ $client1->screenshot("screen1");
+ $client2->screenshot("screen2");
+ '';
+})
diff --git a/nixos/tests/munin.nix b/nixos/tests/munin.nix
index 66ae1c0d87f7022ba8c724f3805747692a246c97..acc4b949ab57ac2e3c3170d17704463086f2acc5 100644
--- a/nixos/tests/munin.nix
+++ b/nixos/tests/munin.nix
@@ -1,13 +1,12 @@
-{ pkgs, ... }:
-
# This test runs basic munin setup with node and cron job running on the same
# machine.
-{
- nodes = {
+import ./make-test.nix {
+
+ nodes = {
one =
{ config, pkgs, ... }:
- {
+ {
services = {
munin-node.enable = true;
munin-cron = {
@@ -20,10 +19,10 @@
};
};
};
-
+
testScript = ''
startAll;
-
+
$one->waitForUnit("munin-node.service");
$one->waitForFile("/var/lib/munin/one/one-uptime-uptime-g.rrd");
$one->waitForFile("/var/www/munin/one/index.html");
diff --git a/nixos/tests/mysql-replication.nix b/nixos/tests/mysql-replication.nix
index 28a1187dd184c431310cf88071e5c2076c3d1342..7d0cf6d85a1ae0a2bb9d9954486ef0d721d2faf3 100644
--- a/nixos/tests/mysql-replication.nix
+++ b/nixos/tests/mysql-replication.nix
@@ -1,9 +1,10 @@
-{ pkgs, ... }:
+import ./make-test.nix (
let
replicateUser = "replicate";
replicatePassword = "secret";
in
+
{
nodes = {
master =
@@ -11,13 +12,15 @@ in
{
services.mysql.enable = true;
- services.mysql.replication.role = "master";
- services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
- services.mysql.initialScript = pkgs.writeText "initmysql"
- ''
- create user '${replicateUser}'@'%' identified by '${replicatePassword}';
- grant replication slave on *.* to '${replicateUser}'@'%';
- '';
+ services.mysql.package = pkgs.mysql;
+ services.mysql.replication.role = "master";
+ services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
+ services.mysql.initialScript = pkgs.writeText "initmysql"
+ ''
+ create user '${replicateUser}'@'%' identified by '${replicatePassword}';
+ grant replication slave on *.* to '${replicateUser}'@'%';
+ '';
+ networking.firewall.allowedTCPPorts = [ 3306 ];
};
slave1 =
@@ -25,11 +28,12 @@ in
{
services.mysql.enable = true;
- services.mysql.replication.role = "slave";
- services.mysql.replication.serverId = 2;
- services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
- services.mysql.replication.masterUser = replicateUser;
- services.mysql.replication.masterPassword = replicatePassword;
+ services.mysql.package = pkgs.mysql;
+ services.mysql.replication.role = "slave";
+ services.mysql.replication.serverId = 2;
+ services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
+ services.mysql.replication.masterUser = replicateUser;
+ services.mysql.replication.masterPassword = replicatePassword;
};
slave2 =
@@ -37,11 +41,12 @@ in
{
services.mysql.enable = true;
- services.mysql.replication.role = "slave";
- services.mysql.replication.serverId = 3;
- services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
- services.mysql.replication.masterUser = replicateUser;
- services.mysql.replication.masterPassword = replicatePassword;
+ services.mysql.package = pkgs.mysql;
+ services.mysql.replication.role = "slave";
+ services.mysql.replication.serverId = 3;
+ services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
+ services.mysql.replication.masterUser = replicateUser;
+ services.mysql.replication.masterPassword = replicatePassword;
};
};
@@ -54,4 +59,4 @@ in
$slave2->sleep(100); # Hopefully this is long enough!!
$slave2->succeed("echo 'use testdb; select * from tests' | mysql -u root -N | grep 4");
'';
-}
+})
diff --git a/nixos/tests/mysql.nix b/nixos/tests/mysql.nix
index b48850738b72250cae6bfbd3f4e39e9162368b53..566d03baf3671e2bf12ec2367ff6db043eef84e0 100644
--- a/nixos/tests/mysql.nix
+++ b/nixos/tests/mysql.nix
@@ -1,14 +1,14 @@
-{ pkgs, ... }:
+import ./make-test.nix {
-{
nodes = {
master =
{ pkgs, config, ... }:
{
services.mysql.enable = true;
- services.mysql.replication.role = "master";
- services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
+ services.mysql.replication.role = "master";
+ services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
+ services.mysql.package = pkgs.mysql;
};
};
diff --git a/nixos/tests/nat.nix b/nixos/tests/nat.nix
index a13714d60a948c44bcea823587b661042e0b4137..02981469e1066ffa491d13e706f9807942278e52 100644
--- a/nixos/tests/nat.nix
+++ b/nixos/tests/nat.nix
@@ -4,14 +4,13 @@
# router connected to both that performs Network Address Translation
# for the client.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
nodes =
{ client =
{ config, pkgs, nodes, ... }:
{ virtualisation.vlans = [ 1 ];
+ networking.firewall.allowPing = true;
networking.defaultGateway =
nodes.router.config.networking.interfaces.eth2.ipAddress;
};
@@ -19,6 +18,7 @@
router =
{ config, pkgs, ... }:
{ virtualisation.vlans = [ 2 1 ];
+ networking.firewall.allowPing = true;
networking.nat.enable = true;
networking.nat.internalIPs = [ "192.168.1.0/24" ];
networking.nat.externalInterface = "eth1";
@@ -27,6 +27,7 @@
server =
{ config, pkgs, ... }:
{ virtualisation.vlans = [ 2 ];
+ networking.firewall.enable = false;
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
services.vsftpd.enable = true;
diff --git a/nixos/tests/nfs.nix b/nixos/tests/nfs.nix
index 51abf57e1b7568b4da7433e388b14214e98289e4..864d05626b6737cdf76d5cff2db676220d1bbba4 100644
--- a/nixos/tests/nfs.nix
+++ b/nixos/tests/nfs.nix
@@ -1,6 +1,4 @@
-{ version }:
-
-{ pkgs, ... }:
+import ./make-test.nix ({ version, ... }:
let
@@ -13,6 +11,7 @@ let
options = "vers=${toString version}";
}
];
+ networking.firewall.enable = false; # FIXME: only open statd
};
in
@@ -31,6 +30,7 @@ in
/data 192.168.1.0/255.255.255.0(rw,no_root_squash,no_subtree_check,fsid=0)
'';
services.nfs.server.createMountPoints = true;
+ networking.firewall.enable = false; # FIXME: figure out what ports need to be allowed
};
};
@@ -82,4 +82,4 @@ in
die "shutdown took too long ($duration seconds)" if $duration > 30;
'';
-}
+})
diff --git a/nixos/tests/openssh.nix b/nixos/tests/openssh.nix
index 49d92fbde908e052a388b588765855746a05b681..0b9714c275da3fef85e95f12afef2c1af3c59d91 100644
--- a/nixos/tests/openssh.nix
+++ b/nixos/tests/openssh.nix
@@ -1,6 +1,5 @@
-{ pkgs, ... }:
+import ./make-test.nix ({ pkgs, ... }: {
-{
nodes = {
server =
@@ -35,4 +34,4 @@
$client->succeed("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'echo hello world' >&2");
$client->succeed("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no server 'ulimit -l' | grep 1024");
'';
-}
+})
diff --git a/nixos/tests/partition.nix b/nixos/tests/partition.nix
index 7126e7255ef45e22dda6f19e39f59e9d94ea1c64..309afa4ce9d028b7e18a079783792918ff4c64b7 100644
--- a/nixos/tests/partition.nix
+++ b/nixos/tests/partition.nix
@@ -1,4 +1,4 @@
-{ pkgs, system, ... }:
+import ./make-test.nix ({ pkgs, ... }:
with pkgs.lib;
@@ -224,4 +224,4 @@ in {
ensureMountPoint("/mnt/boot");
};
'';
-}
+})
diff --git a/nixos/tests/printing.nix b/nixos/tests/printing.nix
index 13cc3115d50e6af0b2105a5e266561c2e0f4e576..9b96e3d7b20c2aceb12354f8fb066d4a716905c6 100644
--- a/nixos/tests/printing.nix
+++ b/nixos/tests/printing.nix
@@ -1,8 +1,6 @@
# Test printing via CUPS.
-{ pkgs, ... }:
-
-{
+import ./make-test.nix ({pkgs, ... }: {
nodes = {
@@ -17,6 +15,7 @@
Allow from all
'';
+ networking.firewall.allowedTCPPorts = [ 631 ];
};
client =
@@ -32,12 +31,14 @@
# Make sure that cups is up on both sides.
$server->waitForUnit("cupsd.service");
+ $server->waitForUnit("network.target");
$client->waitForUnit("cupsd.service");
+ $client->waitForUnit("network.target");
$client->succeed("lpstat -r") =~ /scheduler is running/ or die;
$client->succeed("lpstat -H") =~ "/var/run/cups/cups.sock" or die;
$client->succeed("curl --fail http://localhost:631/");
$client->succeed("curl --fail http://server:631/");
- $server->fail("curl --fail http://client:631/");
+ $server->fail("curl --fail --connect-timeout 2 http://client:631/");
# Add a HP Deskjet printer connected via USB to the server.
$server->succeed("lpadmin -p DeskjetLocal -v usb://HP/Deskjet%205400%20series?serial=TH93I152S123XY -m 'drv:///sample.drv/deskjet.ppd' -E");
@@ -87,4 +88,4 @@
}
'';
-}
+})
diff --git a/nixos/tests/proxy.nix b/nixos/tests/proxy.nix
index 3b79c16ea2c4271fe10fe0e0f2a09381275d6906..88dbdb2720fbe7228a53b28c5432748bbbf13a4b 100644
--- a/nixos/tests/proxy.nix
+++ b/nixos/tests/proxy.nix
@@ -1,16 +1,14 @@
-{ pkgs, ... }:
+import ./make-test.nix (
let
backend =
{ config, pkgs, ... }:
- {
- services.openssh.enable = true;
-
- services.httpd.enable = true;
+ { services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
services.httpd.documentRoot = "${pkgs.valgrind}/share/doc/valgrind/html";
+ networking.firewall.allowedTCPPorts = [ 80 ];
};
in
@@ -21,8 +19,7 @@ in
{ proxy =
{ config, pkgs, nodes, ... }:
- {
- services.httpd.enable = true;
+ { services.httpd.enable = true;
services.httpd.adminAddr = "bar@example.org";
services.httpd.extraModules = ["proxy_balancer"];
@@ -50,6 +47,8 @@ in
# For testing; don't want to wait forever for dead backend servers.
ProxyTimeout 5
'';
+
+ networking.firewall.allowedTCPPorts = [ 80 ];
};
backend1 = backend;
@@ -91,4 +90,4 @@ in
$client->succeed("curl --fail http://proxy/");
'';
-}
+})
diff --git a/nixos/tests/quake3.nix b/nixos/tests/quake3.nix
index 925011077805b0ac3e839e1992704f3d273bbbc7..3ff12fd57c06683f79afb63862b07ecc723780f3 100644
--- a/nixos/tests/quake3.nix
+++ b/nixos/tests/quake3.nix
@@ -1,4 +1,4 @@
-{ pkgs, ... }:
+import ./make-test.nix (
let
@@ -14,11 +14,13 @@ in
rec {
+ makeCoverageReport = true;
+
client =
{ config, pkgs, ... }:
{ imports = [ ./common/x11.nix ];
- services.xserver.driSupport = true;
+ hardware.opengl.driSupport = true;
services.xserver.defaultDepth = pkgs.lib.mkOverride 0 16;
environment.systemPackages = [ pkgs.quake3demo ];
nixpkgs.config.packageOverrides = overrides;
@@ -35,6 +37,7 @@ rec {
"'+map q3dm7' '+addbot grunt' '+addbot daemia' 2> /tmp/log";
};
nixpkgs.config.packageOverrides = overrides;
+ networking.firewall.allowedUDPPorts = [ 27960 ];
};
client1 = client;
@@ -76,4 +79,4 @@ rec {
$server->stopJob("quake3-server");
'';
-}
+})
diff --git a/nixos/tests/rabbitmq.nix b/nixos/tests/rabbitmq.nix
new file mode 100644
index 0000000000000000000000000000000000000000..ffcdde9d87f22c07175629060334be9919340e37
--- /dev/null
+++ b/nixos/tests/rabbitmq.nix
@@ -0,0 +1,17 @@
+# This test runs rabbitmq and checks if rabbitmq is up and running.
+
+import ./make-test.nix ({ pkgs, ... }: {
+
+ nodes = {
+ one = { config, pkgs, ... }: {
+ services.rabbitmq.enable = true;
+ };
+ };
+
+ testScript = ''
+ startAll;
+
+ $one->waitForUnit("rabbitmq.service");
+ $one->waitUntilSucceeds("su -s ${pkgs.stdenv.shell} rabbitmq -c \"rabbitmqctl status\"");
+ '';
+})
diff --git a/nixos/tests/run-in-machine.nix b/nixos/tests/run-in-machine.nix
index 8efe26c170826eea66f04d5159624447b54c2f9a..7f6e6a6dc573747f602eaa44070379d2d52bb302 100644
--- a/nixos/tests/run-in-machine.nix
+++ b/nixos/tests/run-in-machine.nix
@@ -2,7 +2,9 @@
with import ../lib/testing.nix { inherit system; };
-runInMachine {
- drv = pkgs.patchelf;
- machine = { config, pkgs, ... }: { services.sshd.enable = true; };
+{
+ test = runInMachine {
+ drv = pkgs.hello;
+ machine = { config, pkgs, ... }: { /* services.sshd.enable = true; */ };
+ };
}
diff --git a/nixos/tests/simple.nix b/nixos/tests/simple.nix
index eee13a10133458c65702e22af8ce6df58cff4478..e21b919cdf8065af1cd0c350ec84b85e848fe9bb 100644
--- a/nixos/tests/simple.nix
+++ b/nixos/tests/simple.nix
@@ -1,11 +1,11 @@
-{ pkgs, ... }:
+import ./make-test.nix {
-{
machine = { config, pkgs, ... }: { };
testScript =
''
startAll;
+ $machine->waitForUnit("multi-user.target");
$machine->shutdown;
'';
}
diff --git a/nixos/tests/subversion.nix b/nixos/tests/subversion.nix
index 309da90c5df133482c9bbb827188f445b42072b5..e6746dc08287d5f3978273754a73ae62fc1c8d9e 100644
--- a/nixos/tests/subversion.nix
+++ b/nixos/tests/subversion.nix
@@ -1,4 +1,4 @@
-{ pkgs, ... }:
+import ./make-test.nix (
let
@@ -20,7 +20,7 @@ let
# To build the kernel with coverage instrumentation, we need a
# special patch to make coverage data available under /proc.
linux = pkgs.linux.override (orig: {
- stdenv = cleanupBuildTree (keepBuildTree orig.stdenv);
+ stdenv = overrideInStdenv pkgs.stdenv [ pkgs.keepBuildTree ];
extraConfig =
''
GCOV_KERNEL y
@@ -114,4 +114,4 @@ in
$webserver->stopJob("httpd");
'';
-}
+})
diff --git a/nixos/tests/tomcat.nix b/nixos/tests/tomcat.nix
index 6bc88ec82fa270e357455da8073190d0bc9cf774..3b0b1bb79117c8c3d7af88e34986a8b464dd6068 100644
--- a/nixos/tests/tomcat.nix
+++ b/nixos/tests/tomcat.nix
@@ -1,17 +1,15 @@
-{ pkgs, ... }:
+import ./make-test.nix {
-{
nodes = {
server =
{ pkgs, config, ... }:
- {
- services.tomcat.enable = true;
+ { services.tomcat.enable = true;
services.httpd.enable = true;
services.httpd.adminAddr = "foo@bar.com";
- services.httpd.extraSubservices = [
- { serviceType = "tomcat-connector"; }
- ];
+ services.httpd.extraSubservices =
+ [ { serviceType = "tomcat-connector"; } ];
+ networking.firewall.allowedTCPPorts = [ 80 ];
};
client = { };
@@ -26,4 +24,5 @@
$client->succeed("curl --fail http://server/examples/servlets/servlet/HelloWorldExample");
$client->succeed("curl --fail http://server/examples/jsp/jsp2/simpletag/hello.jsp");
'';
+
}
diff --git a/nixos/tests/trac.nix b/nixos/tests/trac.nix
index e0d256f57019a114f1f60d132b4cd3c51be9b7ac..3f17dafaca1557e536488d4fca7574da4289c8d1 100644
--- a/nixos/tests/trac.nix
+++ b/nixos/tests/trac.nix
@@ -1,6 +1,5 @@
-{ pkgs, ... }:
+import ./make-test.nix ({ pkgs, ... }: {
-{
nodes = {
storage =
{ config, pkgs, ... }:
@@ -68,4 +67,4 @@
$client->screenshot("screen");
'';
-}
+})
diff --git a/nixos/tests/udisks.nix b/nixos/tests/udisks.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b7f2e2c00315db4fd01cbc474c55d0ddb99a6b70
--- /dev/null
+++ b/nixos/tests/udisks.nix
@@ -0,0 +1,56 @@
+import ./make-test.nix ({ pkgs, ... }:
+
+let
+
+ stick = pkgs.fetchurl {
+ url = http://nixos.org/~eelco/nix/udisks-test.img.xz;
+ sha256 = "0was1xgjkjad91nipzclaz5biv3m4b2nk029ga6nk7iklwi19l8b";
+ };
+
+in
+
+{
+
+ machine =
+ { config, pkgs, ... }:
+ { services.udisks.enable = true;
+ imports = [ ./common/user-account.nix ];
+
+ security.polkit.extraConfig =
+ ''
+ polkit.addRule(function(action, subject) {
+ if (subject.user == "alice") return "yes";
+ });
+ '';
+ };
+
+ testScript =
+ ''
+ my $stick = $machine->stateDir . "/usbstick.img";
+ system("xz -d < ${stick} > $stick") == 0 or die;
+
+ $machine->succeed("udisks --enumerate | grep /org/freedesktop/UDisks/devices/vda");
+ $machine->fail("udisks --enumerate | grep /org/freedesktop/UDisks/devices/sda1");
+
+ # Attach a USB stick and wait for it to show up.
+ $machine->sendMonitorCommand("usb_add disk:$stick");
+ $machine->waitUntilSucceeds("udisks --enumerate | grep /org/freedesktop/UDisks/devices/sda1");
+ $machine->succeed("udisks --show-info /dev/sda1 | grep 'label:.*USBSTICK'");
+
+ # Mount the stick as a non-root user and do some stuff with it.
+ $machine->succeed("su - alice -c 'udisks --enumerate | grep /org/freedesktop/UDisks/devices/sda1'");
+ $machine->succeed("su - alice -c 'udisks --mount /dev/sda1'");
+ $machine->succeed("su - alice -c 'cat /media/USBSTICK/test.txt'") =~ /Hello World/ or die;
+ $machine->succeed("su - alice -c 'echo foo > /media/USBSTICK/bar.txt'");
+
+ # Unmounting the stick should make the mountpoint disappear.
+ $machine->succeed("su - alice -c 'udisks --unmount /dev/sda1'");
+ $machine->fail("[ -d /media/USBSTICK ]");
+
+ # Remove the USB stick.
+ $machine->sendMonitorCommand("usb_del 0.3"); # FIXME
+ $machine->waitUntilFails("udisks --enumerate | grep /org/freedesktop/UDisks/devices/sda1");
+ $machine->fail("[ -e /dev/sda ]");
+ '';
+
+})
diff --git a/nixos/tests/udisks2.nix b/nixos/tests/udisks2.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e0c57d7c34d6abd8918ee293f7e3d8d4f905d11f
--- /dev/null
+++ b/nixos/tests/udisks2.nix
@@ -0,0 +1,56 @@
+import ./make-test.nix ({ pkgs, ... }:
+
+let
+
+ stick = pkgs.fetchurl {
+ url = http://nixos.org/~eelco/nix/udisks-test.img.xz;
+ sha256 = "0was1xgjkjad91nipzclaz5biv3m4b2nk029ga6nk7iklwi19l8b";
+ };
+
+in
+
+{
+
+ machine =
+ { config, pkgs, ... }:
+ { services.udisks2.enable = true;
+ imports = [ ./common/user-account.nix ];
+
+ security.polkit.extraConfig =
+ ''
+ polkit.addRule(function(action, subject) {
+ if (subject.user == "alice") return "yes";
+ });
+ '';
+ };
+
+ testScript =
+ ''
+ my $stick = $machine->stateDir . "/usbstick.img";
+ system("xz -d < ${stick} > $stick") == 0 or die;
+
+ $machine->succeed("udisksctl info -b /dev/vda >&2");
+ $machine->fail("udisksctl info -b /dev/sda1");
+
+ # Attach a USB stick and wait for it to show up.
+ $machine->sendMonitorCommand("usb_add disk:$stick");
+ $machine->waitUntilSucceeds("udisksctl info -b /dev/sda1");
+ $machine->succeed("udisksctl info -b /dev/sda1 | grep 'IdLabel:.*USBSTICK'");
+
+ # Mount the stick as a non-root user and do some stuff with it.
+ $machine->succeed("su - alice -c 'udisksctl info -b /dev/sda1'");
+ $machine->succeed("su - alice -c 'udisksctl mount -b /dev/sda1'");
+ $machine->succeed("su - alice -c 'cat /run/media/alice/USBSTICK/test.txt'") =~ /Hello World/ or die;
+ $machine->succeed("su - alice -c 'echo foo > /run/media/alice/USBSTICK/bar.txt'");
+
+ # Unmounting the stick should make the mountpoint disappear.
+ $machine->succeed("su - alice -c 'udisksctl unmount -b /dev/sda1'");
+ $machine->fail("[ -d /run/media/alice/USBSTICK ]");
+
+ # Remove the USB stick.
+ $machine->sendMonitorCommand("usb_del 0.3"); # FIXME
+ $machine->waitUntilFails("udisksctl info -b /dev/sda1");
+ $machine->fail("[ -e /dev/sda ]");
+ '';
+
+})
diff --git a/nixos/tests/xfce.nix b/nixos/tests/xfce.nix
index 9f9692f8a014d115a29456ad6bb09dc3429e8aad..ded37943e51df7cbbdfbba9c413421b1c718d358 100644
--- a/nixos/tests/xfce.nix
+++ b/nixos/tests/xfce.nix
@@ -1,6 +1,4 @@
-{ pkgs, ... }:
-
-{
+import ./make-test.nix {
machine =
{ config, pkgs, ... }:
@@ -17,6 +15,7 @@
testScript =
''
+ $machine->waitForX;
$machine->waitForWindow(qr/xfce4-panel/);
$machine->sleep(10);
diff --git a/pkgs/applications/audio/a2jmidid/default.nix b/pkgs/applications/audio/a2jmidid/default.nix
index 9dbdada07d494000f576a3f599195dd8618a1606..c5e35d8867c867988db76f463b914d0d43e04f75 100644
--- a/pkgs/applications/audio/a2jmidid/default.nix
+++ b/pkgs/applications/audio/a2jmidid/default.nix
@@ -22,6 +22,6 @@ stdenv.mkDerivation rec {
description = "Daemon for exposing legacy ALSA sequencer applications in JACK MIDI system";
license = licenses.gpl2;
maintainers = [ maintainers.goibhniu ];
-
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/amarok/default.nix b/pkgs/applications/audio/amarok/default.nix
index 1dac3f6b853aac7c2841966cc12e992f09403f1e..b1bcfe869f78184e1e2c7866e610a7fd4385c616 100644
--- a/pkgs/applications/audio/amarok/default.nix
+++ b/pkgs/applications/audio/amarok/default.nix
@@ -22,12 +22,10 @@ stdenv.mkDerivation rec {
cmakeFlags = "-DKDE4_BUILD_TESTS=OFF";
- postInstall = ''
- mkdir -p $out/nix-support
- echo ${qtscriptgenerator} > $out/nix-support/propagated-user-env-packages
- '';
+ propagatedUserEnvPkgs = [ qtscriptgenerator ];
meta = {
+ repositories.git = git://anongit.kde.org/amarok.git;
description = "Popular music player for KDE";
license = "GPL";
homepage = http://amarok.kde.org;
diff --git a/pkgs/applications/audio/ams-lv2/default.nix b/pkgs/applications/audio/ams-lv2/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..dd23504d3fad8246082dfb8bbfb18db7e68161c8
--- /dev/null
+++ b/pkgs/applications/audio/ams-lv2/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, cairo, gtk, gtkmm, lv2, lvtk, pkgconfig, python }:
+
+stdenv.mkDerivation rec {
+ name = "ams-lv2-${version}";
+ version = "1.0.2";
+
+ src = fetchurl {
+ url = "https://github.com/blablack/ams-lv2/archive/v${version}.tar.gz";
+ sha256 = "0fa1ghf6qahbhj9j1ciyw0hr6nngwksa37hbs651mlz0fn7lz4xm";
+ };
+
+ buildInputs = [ cairo gtk gtkmm lv2 lvtk pkgconfig python ];
+
+ configurePhase = "python waf configure --prefix=$out";
+
+ buildPhase = "python waf";
+
+ installPhase = "python waf install";
+
+ meta = with stdenv.lib; {
+ description = "An LV2 port of the internal modules found in Alsa Modular Synth";
+ homepage = http://objectivewave.wordpress.com/ams-lv2;
+ license = licenses.gpl3;
+ maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/audio/ardour/ardour3.nix b/pkgs/applications/audio/ardour/ardour3.nix
deleted file mode 100644
index bf2ee04cbce98d702c3c5b055bed2b66d7d25444..0000000000000000000000000000000000000000
--- a/pkgs/applications/audio/ardour/ardour3.nix
+++ /dev/null
@@ -1,60 +0,0 @@
-{ stdenv, fetchgit, alsaLib, aubio, boost, cairomm, curl, fftw
-, fftwSinglePrec, flac, glibc, glibmm, gtk, gtkmm, jackaudio
-, libgnomecanvas, libgnomecanvasmm, liblo, libmad, libogg, librdf
-, librdf_raptor, librdf_rasqal, libsamplerate, libsigcxx, libsndfile
-, libusb, libuuid, libxml2, libxslt, lilv, lv2, makeWrapper, pango
-, perl, pkgconfig, python, serd, sord, sratom, suil }:
-
-let
- # Ardour 3.0 tag
- rev = "79db9422";
-in
-
-stdenv.mkDerivation {
- name = "ardour-3.0";
-
- src = fetchgit {
- url = git://git.ardour.org/ardour/ardour.git;
- inherit rev;
- sha256 = "cdbe4ca6d4b639fcd66a3d1cf9c2816b4755655c9d81bdd2417263f413aa7096";
- };
-
- buildInputs =
- [ alsaLib aubio boost cairomm curl fftw fftwSinglePrec flac glibc
- glibmm gtk gtkmm jackaudio libgnomecanvas libgnomecanvasmm liblo
- libmad libogg librdf librdf_raptor librdf_rasqal libsamplerate
- libsigcxx libsndfile libusb libuuid libxml2 libxslt lilv lv2
- makeWrapper pango perl pkgconfig python serd sord sratom suil
- ];
-
- patchPhase = ''
- printf '#include "ardour/svn_revision.h"\nnamespace ARDOUR { const char* svn_revision = \"${rev}\"; }\n' > libs/ardour/svn_revision.cc
- sed -e 's|^#!/usr/bin/perl.*$|#!${perl}/bin/perl|g' -i tools/fmt-bindings
- sed -e 's|^#!/usr/bin/env.*$|#!${perl}/bin/perl|g' -i tools/*.pl
- sed 's|/usr/include/libintl.h|${glibc}/include/libintl.h|' -i wscript
- '';
-
- configurePhase = "python waf configure --prefix=$out";
-
- buildPhase = "python waf";
-
- # For the custom ardour clearlooks gtk-engine to work, it must be
- # moved to a directory called "engines" and added to GTK_PATH
- installPhase = ''
- python waf install
- mkdir -pv $out/gtk2/engines
- mv $out/lib/ardour3/libclearlooks.so $out/gtk2/engines/
- wrapProgram $out/bin/ardour3 --prefix GTK_PATH : $out/gtk2
- '';
-
- meta = with stdenv.lib; {
- description = "Multi-track hard disk recording software";
- longDescription = ''
- Also read "The importance of Paying Something" on their homepage, please!
- '';
- homepage = http://ardour.org/;
- license = licenses.gpl2;
- platforms = platforms.linux;
- maintainers = [ maintainers.goibhniu ];
- };
-}
diff --git a/pkgs/applications/audio/ardour/default.nix b/pkgs/applications/audio/ardour/default.nix
index 3ed650d4ae73c5295cb938ccd2d1e413eab0f4cf..4315a5a7547efb0640042db71c0ccdd5beba6485 100644
--- a/pkgs/applications/audio/ardour/default.nix
+++ b/pkgs/applications/audio/ardour/default.nix
@@ -1,50 +1,62 @@
-{ stdenv, fetchurl, scons, boost, pkgconfig, fftw, librdf_raptor2
-, librdf_rasqal, jackaudio, flac, libsamplerate, alsaLib, libxml2
-, lilv, lv2, serd, sord, sratom, suil # these are probably optional
-, libxslt, libsndfile, libsigcxx, libusb, cairomm, glib, pango
-, gtk, glibmm, gtkmm, libgnomecanvas, libgnomecanvasmm, liblo, aubio
-, fftwSinglePrec, libmad, automake, autoconf, libtool, liblrdf, curl }:
+{ stdenv, fetchgit, alsaLib, aubio, boost, cairomm, curl, fftw
+, fftwSinglePrec, flac, glibc, glibmm, gtk, gtkmm, jackaudio
+, libgnomecanvas, libgnomecanvasmm, liblo, libmad, libogg, librdf
+, librdf_raptor, librdf_rasqal, libsamplerate, libsigcxx, libsndfile
+, libusb, libuuid, libxml2, libxslt, lilv, lv2, makeWrapper, pango
+, perl, pkgconfig, python, serd, sord, sratom, suil }:
+
+let
+ tag = "3.5.357";
+in
stdenv.mkDerivation rec {
- name = "ardour-${version}";
- version = "2.8.16";
+ name = "ardour-${tag}";
- src = fetchurl {
- url = "mirror://gentoo/distfiles/${name}.tar.bz2";
- sha256 = "0h2y0x4yznalllja53anjil2gmgcb26f39zshc4gl1d1kc8k5vip";
+ src = fetchgit {
+ url = git://git.ardour.org/ardour/ardour.git;
+ rev = "refs/tags/${tag}";
+ sha256 = "1e026fb9a6ad4179d52c4b578cc3861bdfd3629b9e7b7a7341d431c7d3692c42";
};
- postPatch = ''
- #sed -e "s#/usr/bin/which#type -P#" -i libs/glibmm2/autogen.sh
- echo '#include "ardour/svn_revision.h"' > libs/ardour/svn_revision.cc
- echo -e 'namespace ARDOUR {\n extern const char* svn_revision = "2.8.12";\n }\n' >> libs/ardour/svn_revision.cc
- '';
+ buildInputs =
+ [ alsaLib aubio boost cairomm curl fftw fftwSinglePrec flac glibc
+ glibmm gtk gtkmm jackaudio libgnomecanvas libgnomecanvasmm liblo
+ libmad libogg librdf librdf_raptor librdf_rasqal libsamplerate
+ libsigcxx libsndfile libusb libuuid libxml2 libxslt lilv lv2
+ makeWrapper pango perl pkgconfig python serd sord sratom suil
+ ];
- buildInputs = [
- scons boost pkgconfig fftw librdf_raptor2 librdf_rasqal jackaudio
- flac libsamplerate alsaLib libxml2 libxslt libsndfile libsigcxx
- #lilv lv2 serd sord sratom suil
- libusb cairomm glib pango gtk glibmm gtkmm libgnomecanvas libgnomecanvasmm liblrdf
- liblo aubio fftwSinglePrec libmad autoconf automake libtool curl
- ];
-
- buildPhase = ''
- mkdir -p $out
- export CXX=g++
- scons PREFIX=$out SYSLIBS=1 install
+ patchPhase = ''
+ # The funny revision number is from `git describe rev`
+ printf '#include "libs/ardour/ardour/revision.h"\nnamespace ARDOUR { const char* revision = \"${tag}-gce4d125\"; }\n' > libs/ardour/revision.cc
+ # Note the different version number
+ sed -i '33i rev = \"3.5-357-gce4d125\"' wscript
+ sed 's|/usr/include/libintl.h|${glibc}/include/libintl.h|' -i wscript
+ sed -e 's|^#!/usr/bin/perl.*$|#!${perl}/bin/perl|g' -i tools/fmt-bindings
+ sed -e 's|^#!/usr/bin/env.*$|#!${perl}/bin/perl|g' -i tools/*.pl
'';
- installPhase = ":";
+ configurePhase = "python waf configure --optimize --prefix=$out";
+
+ buildPhase = "python waf";
+
+ # For the custom ardour clearlooks gtk-engine to work, it must be
+ # moved to a directory called "engines" and added to GTK_PATH
+ installPhase = ''
+ python waf install
+ mkdir -pv $out/gtk2/engines
+ cp build/libs/clearlooks-newer/libclearlooks.so $out/gtk2/engines/
+ wrapProgram $out/bin/ardour3 --prefix GTK_PATH : $out/gtk2
+ '';
- meta = {
+ meta = with stdenv.lib; {
description = "Multi-track hard disk recording software";
longDescription = ''
- Broken: use ardour3-svn instead
Also read "The importance of Paying Something" on their homepage, please!
'';
homepage = http://ardour.org/;
- license = "GPLv2";
- maintainers = [ stdenv.lib.maintainers.marcweber ];
- platforms = stdenv.lib.platforms.linux;
+ license = licenses.gpl2;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.goibhniu ];
};
}
diff --git a/pkgs/applications/audio/audacious/default.nix b/pkgs/applications/audio/audacious/default.nix
index d838d29e8be1bc1942e038cfffb555bc70a747c0..409a831727bb399a0e760b651ca1fc02808d354e 100644
--- a/pkgs/applications/audio/audacious/default.nix
+++ b/pkgs/applications/audio/audacious/default.nix
@@ -49,7 +49,7 @@ stdenv.mkDerivation {
source $stdenv/setup
# gsettings schemas for file dialogues
for file in "$out/bin/"*; do
- wrapProgram "$file" --prefix XDG_DATA_DIRS : "$XDG_ADD"
+ wrapProgram "$file" --prefix XDG_DATA_DIRS : "$XDG_ADD:$GSETTINGS_SCHEMAS_PATH"
done
)
'';
diff --git a/pkgs/applications/audio/clementine/default.nix b/pkgs/applications/audio/clementine/default.nix
index cf554f83c8b071bb1883442f2591a08b10232661..4352e2e133a66a288a17fa2e3ac3f1afb1ee8c19 100644
--- a/pkgs/applications/audio/clementine/default.nix
+++ b/pkgs/applications/audio/clementine/default.nix
@@ -44,5 +44,6 @@ stdenv.mkDerivation {
description = "A multiplatform music player";
license = licenses.gpl3Plus;
platforms = platforms.linux;
+ maintainers = [ maintainers.ttuegel ];
};
}
diff --git a/pkgs/applications/audio/drumkv1/default.nix b/pkgs/applications/audio/drumkv1/default.nix
index fc2453869e55007572bc04c5ad12fdc87e730d25..39f6ae0ded4e1b9e906875219ad709bb9707c99b 100644
--- a/pkgs/applications/audio/drumkv1/default.nix
+++ b/pkgs/applications/audio/drumkv1/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "drumkv1-${version}";
- version = "0.3.6";
+ version = "0.4.1";
src = fetchurl {
url = "mirror://sourceforge/drumkv1/${name}.tar.gz";
- sha256 = "13prman3jlh3xz56675vnnnghnmmbxpq8gqdhv5llgd8ggzhmyjn";
+ sha256 = "0wxbn5qm3dn9spwbm618flgrwvls7bipg0nhgn0lv4za2g823g56";
};
buildInputs = [ jackaudio libsndfile lv2 qt4 ];
diff --git a/pkgs/applications/audio/ekho/default.nix b/pkgs/applications/audio/ekho/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..dd9b830be841bd4dee5158b3e8ea73d55c5461da
--- /dev/null
+++ b/pkgs/applications/audio/ekho/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig
+, libsndfile, pulseaudio
+}:
+
+let
+ version = "5.8.2";
+in stdenv.mkDerivation rec {
+ name = "ekho-${version}";
+
+ meta = with stdenv.lib; {
+ description = "Chinese text-to-speech software";
+ homepage = "http://www.eguidedog.net/ekho.php";
+ longDescription = ''
+ Ekho (余音) is a free, open source and multilingual text-to-speech (TTS)
+ software. It supports Cantonese (Chinese dialect spoken in Hong Kong and
+ part of Guangdong province), Mandarin (standard Chinese), Zhaoan Hakka
+ (a dialect in Taiwan), Tibetan, Ngangien (an ancient Chinese before
+ Yuan Dynasty) and Korean (in trial).
+ '';
+ license = licenses.gpl2Plus;
+ platforms = platforms.linux;
+ hydraPlatforms = [];
+ maintainers = with maintainers; [ iyzsong ];
+ };
+
+ src = fetchurl {
+ url = "mirror://sourceforge/e-guidedog/Ekho/${version}/${name}.tar.xz";
+ sha256 = "0ym6lpcpsvwvsiwlzkl1509a2hljwcw7synngrmqjq1n49ww00nj";
+ };
+
+ preConfigure = with stdenv.lib; ''
+ NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE ${optionalString stdenv.is64bit "-D_x86_64"}"
+ NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -DEKHO_DATA_PATH=\"$out/share/ekho-data\""
+ '';
+
+ nativeBuildInputs = [ pkgconfig ];
+
+ buildInputs = [ libsndfile pulseaudio ];
+}
diff --git a/pkgs/applications/audio/flac/default.nix b/pkgs/applications/audio/flac/default.nix
index 0383a1ce0ad56ed0c3f63147035eccd47f3e2c69..1c8dc56de61c3f372637589c169e76cae3f430cb 100644
--- a/pkgs/applications/audio/flac/default.nix
+++ b/pkgs/applications/audio/flac/default.nix
@@ -12,9 +12,10 @@ stdenv.mkDerivation rec {
doCheck = true; # takes lots of time but will be run rarely (small build-time closure)
- meta = {
+ meta = with stdenv.lib; {
homepage = http://xiph.org/flac/;
description = "Library and tools for encoding and decoding the FLAC lossless audio file format";
- platforms = stdenv.lib.platforms.all;
+ platforms = platforms.all;
+ maintainers = maintainers.mornfall;
};
}
diff --git a/pkgs/applications/audio/gigedit/default.nix b/pkgs/applications/audio/gigedit/default.nix
index be6970f01e16091f239ca18cecf2cc3d99e3c89e..269b48aebb8f20b8354cf6c8479d61a018f8f451 100644
--- a/pkgs/applications/audio/gigedit/default.nix
+++ b/pkgs/applications/audio/gigedit/default.nix
@@ -26,5 +26,6 @@ stdenv.mkDerivation rec {
description = "Gigasampler file access library";
license = licenses.gpl2;
maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/guitarix/default.nix b/pkgs/applications/audio/guitarix/default.nix
index 17d53a621ca6193ab228ac893eade52b439a5521..44b0e9ef0d796436115ccebad7c85b3b21aff599 100644
--- a/pkgs/applications/audio/guitarix/default.nix
+++ b/pkgs/applications/audio/guitarix/default.nix
@@ -1,19 +1,20 @@
-{ stdenv, fetchurl, python, gettext, intltool, pkgconfig, jackaudio, libsndfile
-, glib, gtk, glibmm, gtkmm, fftw, librdf, ladspaH, boost }:
+{ stdenv, fetchurl, avahi, boost, fftw, gettext, glib, glibmm, gtk
+, gtkmm, intltool, jackaudio, ladspaH, librdf, libsndfile, lv2
+, pkgconfig, python }:
stdenv.mkDerivation rec {
name = "guitarix-${version}";
- version = "0.25.2";
+ version = "0.28.3";
src = fetchurl {
url = "mirror://sourceforge/guitarix/guitarix2-${version}.tar.bz2";
- sha256 = "1wcg3yc2iy72hj6z9l88393f00by0iwhhn8xrc3q55p4rj0mnrga";
+ sha256 = "0ks5avylyicqfj9l1wf4gj62i8m6is2jmp0h11h5l2wbg3xiwxjd";
};
- buildInputs =
- [ python gettext intltool pkgconfig jackaudio libsndfile glib gtk glibmm
- gtkmm fftw librdf ladspaH boost
- ];
+ buildInputs = [
+ avahi boost fftw gettext glib glibmm gtk gtkmm intltool jackaudio
+ ladspaH librdf libsndfile lv2 pkgconfig python
+ ];
configurePhase = "python waf configure --prefix=$out";
@@ -21,7 +22,7 @@ stdenv.mkDerivation rec {
installPhase = "python waf install";
- meta = {
+ meta = with stdenv.lib; {
description = "A virtual guitar amplifier for Linux running with JACK";
longDescription = ''
guitarix is a virtual guitar amplifier for Linux running with
@@ -46,8 +47,8 @@ stdenv.mkDerivation rec {
crazy sounds never heard before.
'';
homepage = http://guitarix.sourceforge.net/;
- license = stdenv.lib.licenses.gpl3Plus;
- maintainers = [ stdenv.lib.maintainers.astsmtl ];
- platforms = stdenv.lib.platforms.linux;
+ license = licenses.gpl3Plus;
+ maintainers = with maintainers; [ astsmtl goibhniu ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/ingen/default.nix b/pkgs/applications/audio/ingen/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..73138cc269d0428ea127df38ba5bb9059b14400e
--- /dev/null
+++ b/pkgs/applications/audio/ingen/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchsvn, boost, ganv, glibmm, gtk, gtkmm, jackaudio, lilv
+, lv2, pkgconfig, python, raul, serd, sord, sratom, suil
+}:
+
+stdenv.mkDerivation rec {
+ name = "ingen-svn-${rev}";
+ rev = "5317";
+
+ src = fetchsvn {
+ url = "http://svn.drobilla.net/lad/trunk/ingen";
+ rev = rev;
+ sha256 = "0zm3wbv9qsingjyr95nwin3khmnf3wq3fz2xa6p420dpcy6qnl4x";
+ };
+
+ buildInputs = [
+ boost ganv glibmm gtk gtkmm jackaudio lilv lv2 pkgconfig python
+ raul serd sord sratom suil
+ ];
+
+ configurePhase = "python waf configure --prefix=$out";
+
+ buildPhase = "python waf";
+
+ installPhase = "python waf install";
+
+ meta = with stdenv.lib; {
+ description = "A modular audio processing system using JACK and LV2 or LADSPA plugins";
+ homepage = http://drobilla.net/software/ingen;
+ license = licenses.gpl3;
+ maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/audio/jalv/default.nix b/pkgs/applications/audio/jalv/default.nix
index 6b15052769beb51035507d182f7be46993f51ba2..2baf69cef4fdf89133ebc6ce1c4f166f634bcdeb 100644
--- a/pkgs/applications/audio/jalv/default.nix
+++ b/pkgs/applications/audio/jalv/default.nix
@@ -25,5 +25,6 @@ stdenv.mkDerivation rec {
homepage = http://drobilla.net/software/jalv;
license = licenses.isc;
maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/lash/default.nix b/pkgs/applications/audio/lash/default.nix
index 72087c76b05d59d98cdff3ca21bd505e08cc4208..ad52e7b2d85c5d737b7650a399d6a0a785a84028 100644
--- a/pkgs/applications/audio/lash/default.nix
+++ b/pkgs/applications/audio/lash/default.nix
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
'';
meta = with stdenv.lib; {
- description = "LASH Audio Session Handler";
+ description = "A Linux Audio Session Handler";
longDescription = ''
Session management system for GNU/Linux audio applications.
'';
diff --git a/pkgs/applications/audio/lastwatch/default.nix b/pkgs/applications/audio/lastwatch/default.nix
index 324a0b0bebcbfb2f27be82ab850d71cda8b66b03..c09d397eefa38a946bee4289a7d8b5669f118de8 100644
--- a/pkgs/applications/audio/lastwatch/default.nix
+++ b/pkgs/applications/audio/lastwatch/default.nix
@@ -19,8 +19,6 @@ pythonPackages.buildPythonPackage rec {
propagatedBuildInputs = pythonPath;
- installCommand = "python setup.py install --prefix=$out";
-
meta = {
homepage = "https://github.com/aszlig/LastWatch";
description = "An inotify-based last.fm audio scrobbler";
diff --git a/pkgs/applications/audio/mid2key/default.nix b/pkgs/applications/audio/mid2key/default.nix
index 1e163391a3973aef207f7988f76188762b4d09bc..26ea2c7b0b2cf0488c308084d3b4164fe1532522 100644
--- a/pkgs/applications/audio/mid2key/default.nix
+++ b/pkgs/applications/audio/mid2key/default.nix
@@ -21,5 +21,6 @@ stdenv.mkDerivation rec {
description = "A simple tool which maps midi notes to simulated keystrokes";
license = licenses.gpl3;
maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/moc/default.nix b/pkgs/applications/audio/moc/default.nix
index 74ae3dcf22bb39c0dd4bcda914cdebfe4a15ac96..5356d4ce298a8f7dba6508964351a728dafd037c 100644
--- a/pkgs/applications/audio/moc/default.nix
+++ b/pkgs/applications/audio/moc/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, ncurses, pkgconfig, alsaLib, flac, libmad, speex, ffmpeg_0_10, libvorbis, mpc, libsndfile, jackaudio, db4, libmodplug, timidity, libid3tag, libtool }:
+{ stdenv, fetchurl, ncurses, pkgconfig, alsaLib, flac, libmad, speex, ffmpeg_0_10, libvorbis, mpc, libsndfile, jackaudio, db, libmodplug, timidity, libid3tag, libtool }:
stdenv.mkDerivation rec {
name = "moc-${version}";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
configurePhase = "./configure prefix=$out";
- buildInputs = [ ncurses pkgconfig alsaLib flac libmad speex ffmpeg_0_10 libvorbis mpc libsndfile jackaudio db4 libmodplug timidity libid3tag libtool ];
+ buildInputs = [ ncurses pkgconfig alsaLib flac libmad speex ffmpeg_0_10 libvorbis mpc libsndfile jackaudio db libmodplug timidity libid3tag libtool ];
meta = {
description = "MOC (music on console) is a console audio player for LINUX/UNIX designed to be powerful and easy to use.";
diff --git a/pkgs/applications/audio/monkeys-audio/default.nix b/pkgs/applications/audio/monkeys-audio/default.nix
index 48b0b52c5ea7db8465ecb444b7a28685968f3e59..08aa7e017b21372499d331303f9435d2b0af4bb8 100644
--- a/pkgs/applications/audio/monkeys-audio/default.nix
+++ b/pkgs/applications/audio/monkeys-audio/default.nix
@@ -11,4 +11,9 @@ stdenv.mkDerivation rec {
url = "http://deb-multimedia.org/pool/main/m/${pname}/${pname}_${version}.orig.tar.gz";
sha256 = "0kjfwzfxfx7f958b2b1kf8yj655lp0ppmn0sh57gbkjvj8lml7nz";
};
+
+ meta = with stdenv.lib; {
+ platforms = platforms.linux;
+ maintainers = maintainers.mornfall;
+ };
}
diff --git a/pkgs/applications/audio/mopidy/default.nix b/pkgs/applications/audio/mopidy/default.nix
index b684fee37d56c8b9946e622da1a1b0b9eb8afa97..04393372cf30f50633651bcd3e5a0da1863b1fd3 100644
--- a/pkgs/applications/audio/mopidy/default.nix
+++ b/pkgs/applications/audio/mopidy/default.nix
@@ -13,7 +13,7 @@ pythonPackages.buildPythonPackage rec {
};
propagatedBuildInputs = with pythonPackages; [
- gst_python pygobject pykka pyspotify pylast cherrypy ws4py
+ gst_python pygobject pykka pyspotify pylast cherrypy ws4py gst_plugins_base gst_plugins_good
];
# python zip complains about old timestamps
@@ -27,8 +27,7 @@ pythonPackages.buildPythonPackage rec {
postInstall = ''
for p in $out/bin/mopidy $out/bin/mopidy-scan; do
wrapProgram $p \
- --prefix GST_PLUGIN_PATH : ${gst_plugins_good}/lib/gstreamer-0.10 \
- --prefix GST_PLUGIN_PATH : ${gst_plugins_base}/lib/gstreamer-0.10
+ --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH"
done
'';
diff --git a/pkgs/applications/audio/mpc/default.nix b/pkgs/applications/audio/mpc/default.nix
index bd21550a64cf59f283fb0558fcbfcca6d8872beb..ae6d9e0c7e6041acb4d821970041d61419ffe419 100755
--- a/pkgs/applications/audio/mpc/default.nix
+++ b/pkgs/applications/audio/mpc/default.nix
@@ -1,12 +1,12 @@
{ stdenv, fetchurl, mpd_clientlib }:
stdenv.mkDerivation rec {
- version = "0.23";
+ version = "0.25";
name = "mpc-${version}";
src = fetchurl {
- url = "http://www.musicpd.org/download/mpc/0/${name}.tar.bz2";
- sha256 = "1ir96wfgq5qfdd2s06zfycv38g3bhn3bpndwx9hwf1w507rvifi9";
+ url = "http://www.musicpd.org/download/mpc/0/${name}.tar.xz";
+ sha256 = "095gmik5vrnab5a1g92qiznn48w7499fr0gldp3s6xd26kvs9kvh";
};
buildInputs = [ mpd_clientlib ];
@@ -24,4 +24,4 @@ stdenv.mkDerivation rec {
maintainers = [ stdenv.lib.maintainers.algorith ];
platforms = stdenv.lib.platforms.linux;
};
-}
\ No newline at end of file
+}
diff --git a/pkgs/applications/audio/mpg123/default.nix b/pkgs/applications/audio/mpg123/default.nix
index f14e2764211eb0cce08dc88cab1a594212757b73..3edb7ae6793ba779e6d52575bd4aadf8518fc0a0 100644
--- a/pkgs/applications/audio/mpg123/default.nix
+++ b/pkgs/applications/audio/mpg123/default.nix
@@ -1,11 +1,11 @@
{stdenv, fetchurl, alsaLib }:
stdenv.mkDerivation {
- name = "mpg123-1.16.0";
+ name = "mpg123-1.19.0";
src = fetchurl {
- url = mirror://sourceforge/mpg123/mpg123-1.16.0.tar.bz2;
- sha256 = "1lznnfdvg69a9qbbhvhfc9i86hxdmdqx67lvbkqbh8mmhpip43zh";
+ url = mirror://sourceforge/mpg123/mpg123-1.19.0.tar.bz2;
+ sha256 = "06xhd68mj9yp0r6l771aq0d7xgnl402a3wm2mvhxmd3w3ph29446";
};
buildInputs = stdenv.lib.optional (!stdenv.isDarwin) alsaLib;
diff --git a/pkgs/applications/audio/ncmpc/default.nix b/pkgs/applications/audio/ncmpc/default.nix
new file mode 100755
index 0000000000000000000000000000000000000000..6db80f39e2cfdfa4c2943b59077a5bc1e294453f
--- /dev/null
+++ b/pkgs/applications/audio/ncmpc/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchurl, pkgconfig, glib, ncurses, mpd_clientlib }:
+
+stdenv.mkDerivation rec {
+ version = "0.21";
+ name = "ncmpc-${version}";
+
+ src = fetchurl {
+ url = "http://www.musicpd.org/download/ncmpc/0/ncmpc-${version}.tar.bz2";
+ sha256 = "648e846e305c867cb937dcb467393c2f5a30bf460bdf77b63de7af69fba1fd07";
+ };
+
+ buildInputs = [ pkgconfig glib ncurses mpd_clientlib ];
+
+ meta = with stdenv.lib; {
+ description = "Curses-based interface for MPD (music player daemon)";
+ homepage = http://www.musicpd.org/clients/ncmpc/;
+ license = licenses.gpl2Plus;
+ maintainers = with maintainers; [ _1126 ];
+ platforms = platforms.all;
+ };
+}
+
diff --git a/pkgs/applications/audio/pamixer/default.nix b/pkgs/applications/audio/pamixer/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..acdda1799d03c59fdcdfa094be845dfabe7557b8
--- /dev/null
+++ b/pkgs/applications/audio/pamixer/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchgit, pulseaudio, boost }:
+
+let
+ tag = "1.1";
+in
+
+stdenv.mkDerivation rec {
+
+ name = "pamixer-${tag}";
+
+ src = fetchgit {
+ url = git://github.com/cdemoulins/pamixer;
+ rev = "refs/tags/${tag}";
+ sha256 = "03r0sbfj85wp6yxa87pjg69ivmk0mxxa2nykr8gf2c607igmb034";
+ };
+
+ buildInputs = [ pulseaudio boost ];
+
+ installPhase = ''
+ mkdir -p $out/bin
+ cp pamixer $out/bin
+ '';
+
+ meta = with stdenv.lib; {
+ description = "pamixer is like amixer but for pulseaudio.";
+ longDescription = "Features:
+ - Get the current volume of the default sink, the default source or a selected one by his id
+ - Set the volume for the default sink, the default source or any other device
+ - List the sinks
+ - List the sources
+ - Increase / Decrease the volume for a device
+ - Mute or unmute a device";
+ homepage = https://github.com/cdemoulins/pamixer;
+ license = licenses.gpl3;
+ platforms = platforms.linux;
+ maintainers = [ maintainers._1126 ];
+ };
+}
diff --git a/pkgs/applications/audio/pianobooster/default.nix b/pkgs/applications/audio/pianobooster/default.nix
index d5cdffbed952f29aabb79c308fa5d3898a6e14e5..67848cdc804b9d58ec006fc7975f8ca121109441 100644
--- a/pkgs/applications/audio/pianobooster/default.nix
+++ b/pkgs/applications/audio/pianobooster/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, alsaLib, cmake, qt4 }:
+{ stdenv, fetchurl, alsaLib, cmake, mesa, makeWrapper, qt4 }:
stdenv.mkDerivation rec {
name = "pianobooster-${version}";
@@ -9,14 +9,25 @@ stdenv.mkDerivation rec {
sha256 = "1xwyap0288xcl0ihjv52vv4ijsjl0yq67scc509aia4plmlm6l35";
};
+ patches = [
+ ./pianobooster-0.6.4b-cmake.patch
+ ./pianobooster-0.6.4b-cmake-gcc4.7.patch
+ ];
+
preConfigure = "cd src";
- buildInputs = [ alsaLib cmake qt4 ];
+ buildInputs = [ alsaLib cmake makeWrapper mesa qt4 ];
+
+ postInstall = ''
+ wrapProgram $out/bin/pianobooster \
+ --prefix LD_LIBRARY_PATH : ${mesa}/lib
+ '';
meta = with stdenv.lib; {
description = "A MIDI file player that teaches you how to play the piano";
homepage = http://pianobooster.sourceforge.net;
license = licenses.gpl3;
+ platforms = platforms.linux;
maintainers = [ maintainers.goibhniu ];
};
}
diff --git a/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake-gcc4.7.patch b/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake-gcc4.7.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2b1b28c5a849bdaff08340ee87baef88b00834a9
--- /dev/null
+++ b/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake-gcc4.7.patch
@@ -0,0 +1,11 @@
+--- pianobooster-src-0.6.4b/src/CMakeLists.txt.orig 2013-04-06 10:48:02.469532914 -0700
++++ pianobooster-src-0.6.4b/src/CMakeLists.txt 2013-04-06 10:48:12.989532445 -0700
+@@ -203,8 +203,6 @@
+ ${PIANOBOOSTER_UI_HDRS} )
+ ENDIF(WIN32)
+
+-SET_TARGET_PROPERTIES(pianobooster PROPERTIES LINK_FLAGS "-mwindows")
+-
+ IF (USE_PCH)
+ ADD_PRECOMPILED_HEADER( pianobooster ${CMAKE_CURRENT_SOURCE_DIR}/precompile/precompile.h )
+ ENDIF (USE_PCH)
diff --git a/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake.patch b/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8cdd8738e2b302b54cf29f13defea7e0aca3375a
--- /dev/null
+++ b/pkgs/applications/audio/pianobooster/pianobooster-0.6.4b-cmake.patch
@@ -0,0 +1,44 @@
+--- pianobooster-src-0.6.4b/src/CMakeLists.txt.orig
++++ pianobooster-src-0.6.4b/src/CMakeLists.txt
+@@ -2,12 +2,6 @@
+ # for the debug build type cmake -DCMAKE_BUILD_TYPE=Debug
+ SET(CMAKE_BUILD_TYPE Release)
+ SET(CMAKE_VERBOSE_MAKEFILE OFF)
+-SET(USE_FLUIDSYNTH OFF)
+-
+-# The inplace directory is mainly for windows builds
+-# SET(FLUIDSYNTH_INPLACE_DIR C:/download/misc/ljb/fluidsynth-1.0.9)
+-SET(FLUIDSYNTH_INPLACE_DIR /home/louis/build/fluidsynth-1.0.9)
+-
+
+ # Testing precompiled headers it does not work -- leave as OFF.
+ SET(USE_PCH OFF)
+@@ -78,18 +72,7 @@
+ ADD_DEFINITIONS(-DPB_USE_FLUIDSYNTH)
+ MESSAGE("Building using fluidsynth")
+ SET( PB_BASE_SRCS MidiDeviceFluidSynth.cpp )
+-
+- IF(FLUIDSYNTH_INPLACE_DIR)
+- INCLUDE_DIRECTORIES(${FLUIDSYNTH_INPLACE_DIR}/include/)
+- IF(WIN32)
+- LINK_LIBRARIES( ${FLUIDSYNTH_INPLACE_DIR}/src/.libs/libfluidsynth.dll.a)
+- ENDIF(WIN32)
+- IF(UNIX)
+- LINK_LIBRARIES(${FLUIDSYNTH_INPLACE_DIR}/src/.libs/libfluidsynth.so)
+- ENDIF(UNIX)
+- ELSEIF(FLUIDSYNTH_INPLACE_DIR)
+- LINK_LIBRARIES( fluidsynth)
+- ENDIF(FLUIDSYNTH_INPLACE_DIR)
++ LINK_LIBRARIES(fluidsynth)
+ ENDIF(USE_FLUIDSYNTH)
+
+
+@@ -214,8 +197,6 @@
+ INSTALL(TARGETS pianobooster RUNTIME DESTINATION bin)
+ #INSTALL( index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR kmidimon )
+
+-INSTALL( FILES ../README.txt DESTINATION share/doc/pianobooster )
+-
+ INSTALL ( FILES images/pianobooster.png DESTINATION share/pixmaps )
+
+
diff --git a/pkgs/applications/audio/praat/default.nix b/pkgs/applications/audio/praat/default.nix
index f2f196acdd851dd8f81bc0a1511db2806fb6aa5f..b8a283125fc468ec79168df251ee4d1e30cd020f 100644
--- a/pkgs/applications/audio/praat/default.nix
+++ b/pkgs/applications/audio/praat/default.nix
@@ -1,14 +1,15 @@
-{stdenv, fetchurl, alsaLib, gtk, pkgconfig }:
+{ stdenv, fetchurl, alsaLib, gtk, pkgconfig }:
stdenv.mkDerivation {
- name = "praat-5323";
+ name = "praat-5365";
+
src = fetchurl {
- url = http://www.fon.hum.uva.nl/praat/praat5323_sources.tar.gz;
- sha256 = "1m0m5165h74mw5xhmnnyzh5ans3cn78w5rs9572sa1512cams203";
+ url = http://www.fon.hum.uva.nl/praat/praat5365_sources.tar.gz;
+ sha256 = "1w3mcq0mipx88i7ckhvzhmdj0p67nhppnn7kbkp21d01yyyz5rgq";
};
configurePhase = ''
- cp makefiles/makefile.defs.linux makefile.defs
+ cp makefiles/makefile.defs.linux.alsa makefile.defs
'';
installPhase = ''
@@ -22,5 +23,6 @@ stdenv.mkDerivation {
description = "Doing phonetics by computer";
homepage = http://www.fon.hum.uva.nl/praat/;
license = "GPLv2+"; # Has some 3rd-party code in it though
+ platforms = stdenv.lib.platforms.linux;
};
}
diff --git a/pkgs/applications/audio/puredata/default.nix b/pkgs/applications/audio/puredata/default.nix
index b1df008398db68e0981b460c6bd905d990bc5352..d0394b72eddc8ea7cbaf1532025d89b59a8f61e6 100644
--- a/pkgs/applications/audio/puredata/default.nix
+++ b/pkgs/applications/audio/puredata/default.nix
@@ -1,23 +1,28 @@
-{ stdenv, fetchurl, alsaLib, autoconf, automake, fftw, gettext, glib
-, jackaudio, libX11, libtool, makeWrapper, pkgconfig, tcl, tk
+{ stdenv, fetchurl, autoreconfHook, gettext, makeWrapper
+, alsaLib, jackaudio, tk
}:
stdenv.mkDerivation rec {
name = "puredata-${version}";
- version = "0.44-0";
+ version = "0.45-4";
src = fetchurl {
url = "mirror://sourceforge/pure-data/pd-${version}.src.tar.gz";
- sha256 = "031bvqfnlpfx0y5n0l5rmslziqc6jgmk99x1prgh1rmhjhjdnijw";
+ sha256 = "1ls2ap5yi2zxvmr247621g4jx0hhfds4j5704a050bn2n3l0va2p";
};
- buildInputs = [
- alsaLib autoconf automake fftw gettext glib jackaudio libX11
- libtool makeWrapper pkgconfig tcl tk
- ];
+ patchPhase = ''
+ rm portaudio/configure.in
+ '';
+
+ nativeBuildInputs = [ autoreconfHook gettext makeWrapper ];
+
+ buildInputs = [ alsaLib jackaudio ];
- preConfigure = ''
- ./autogen.sh
+ configureFlags = ''
+ --enable-alsa
+ --enable-jack
+ --disable-portaudio
'';
postInstall = ''
diff --git a/pkgs/applications/audio/qmmp/default.nix b/pkgs/applications/audio/qmmp/default.nix
index 255c63a5d6d2b39853f1ea32c23ff15f8839b1b0..a18ef97dd60a229d4f8d244159c13031a50bf959 100644
--- a/pkgs/applications/audio/qmmp/default.nix
+++ b/pkgs/applications/audio/qmmp/default.nix
@@ -28,11 +28,11 @@
# handle that.
stdenv.mkDerivation rec {
- name = "qmmp-0.7.3";
+ name = "qmmp-0.7.6";
src = fetchurl {
url = "http://qmmp.ylsoftware.com/files/${name}.tar.bz2";
- sha256 = "0qjmnyq3qmrm510g3lsa6vd80nmbz0859pwhnaaa19ah0jhf3r2p";
+ sha256 = "1hq08ii06lyfg516jrvxdfcjj509gvglvdlsr96aqi1fh8v4k5p9";
};
buildInputs =
diff --git a/pkgs/applications/audio/qsampler/default.nix b/pkgs/applications/audio/qsampler/default.nix
index 7cfe73c9c750705d5a987f6a05e76561dbed90c3..b851517b8724b0432e48edeb8b095c4a877c05f9 100644
--- a/pkgs/applications/audio/qsampler/default.nix
+++ b/pkgs/applications/audio/qsampler/default.nix
@@ -20,5 +20,6 @@ stdenv.mkDerivation rec {
description = "graphical frontend to LinuxSampler";
license = licenses.gpl2;
maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/qtractor/default.nix b/pkgs/applications/audio/qtractor/default.nix
index e04ad9ddd14c9115357ab5bf4d37573e9abbd913..c70842c399ad6c11b742089907b8f2b4d26bacfa 100644
--- a/pkgs/applications/audio/qtractor/default.nix
+++ b/pkgs/applications/audio/qtractor/default.nix
@@ -3,12 +3,12 @@
, libtool, libvorbis, pkgconfig, qt4, rubberband, stdenv }:
stdenv.mkDerivation rec {
- version = "0.5.12";
+ version = "0.6.0";
name = "qtractor-${version}";
src = fetchurl {
url = "mirror://sourceforge/qtractor/${name}.tar.gz";
- sha256 = "0yf2p9l3hj8pd550v3rbbjqkvxnvn8p6nsnm4aj2v5q4mgg2c8cc";
+ sha256 = "0aw6g0biqzysnsk5vd6wx3q1khyav6krhjz7bzk0v7d2160bn40r";
};
buildInputs =
diff --git a/pkgs/applications/audio/quodlibet/default.nix b/pkgs/applications/audio/quodlibet/default.nix
index c865314cb175ae49690bd6cf2d4ca357de57232c..ea8ae88f022e0fd2dce11d3c3d3d87a09418b6f2 100644
--- a/pkgs/applications/audio/quodlibet/default.nix
+++ b/pkgs/applications/audio/quodlibet/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, python, buildPythonPackage, mutagen, pygtk, pygobject
+{ stdenv, fetchurl, python, buildPythonPackage, mutagen, pygtk, pygobject, intltool
, pythonDBus, gst_python, withGstPlugins ? false, gst_plugins_base ? null
, gst_plugins_good ? null, gst_plugins_ugly ? null, gst_plugins_bad ? null }:
@@ -18,7 +18,7 @@ buildPythonPackage {
# XXX, tests fail
doCheck = false;
- src = [
+ srcs = [
(fetchurl {
url = "https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-${version}.tar.gz";
sha256 = "0ilasi4b0ay8r6v6ba209wsm80fq2nmzigzc5kvphrk71jwypx6z";
@@ -27,14 +27,21 @@ buildPythonPackage {
url = "https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-plugins-${version}.tar.gz";
sha256 = "1rv08rhdjad8sjhplqsspcf4vkazgkxyshsqmbfbrrk5kvv57ybc";
})
- ];
+ ];
+
+ preConfigure = ''
+ # TODO: for now don't a apply gdist overrides, will be needed for shipping icons, gtk, etc
+ sed -i /distclass/d setup.py
+ '';
sourceRoot = "quodlibet-${version}";
+
postUnpack = ''
# the patch searches for plugins in directory ../plugins
# so link the appropriate directory there
ln -sf quodlibet-plugins-${version} plugins
'';
+
patches = [ ./quodlibet-package-plugins.patch ];
buildInputs = stdenv.lib.optionals withGstPlugins [
@@ -42,18 +49,13 @@ buildPythonPackage {
];
propagatedBuildInputs = [
- mutagen pygtk pygobject pythonDBus gst_python
+ mutagen pygtk pygobject pythonDBus gst_python intltool
];
postInstall = stdenv.lib.optionalString withGstPlugins ''
# Wrap quodlibet so it finds the GStreamer plug-ins
- wrapProgram "$out/bin/quodlibet" --prefix \
- GST_PLUGIN_PATH ":" \
- ${ stdenv.lib.concatStringsSep ":"
- (map (s: s+"/lib/gstreamer-0.10")
- (stdenv.lib.filter (s: s != null) [
- gst_plugins_base gst_plugins_good gst_plugins_ugly gst_plugins_bad
- ])) }
+ wrapProgram "$out/bin/quodlibet" --prefix \
+ GST_PLUGIN_SYSTEM_PATH ":" "$GST_PLUGIN_SYSTEM_PATH" \
'';
meta = {
diff --git a/pkgs/applications/audio/samplv1/default.nix b/pkgs/applications/audio/samplv1/default.nix
index 8c73928c79a421191c8cb47210a2adf4415a9b09..f1d3be317d178a557b144488ad186d9d0d8e3074 100644
--- a/pkgs/applications/audio/samplv1/default.nix
+++ b/pkgs/applications/audio/samplv1/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "samplv1-${version}";
- version = "0.3.6";
+ version = "0.4.1";
src = fetchurl {
url = "mirror://sourceforge/samplv1/${name}.tar.gz";
- sha256 = "1fgy9w3mp0p8i1v41a7gmpzzk268k7bp75d4sgzfprikjihc6ary";
+ sha256 = "1cx3qs9vrdwmym2qsghqq53bshnjqgpqypsilr1m2i1cpfnfrr6x";
};
buildInputs = [ jackaudio libsndfile lv2 qt4 ];
diff --git a/pkgs/applications/audio/sonic-visualiser/default.nix b/pkgs/applications/audio/sonic-visualiser/default.nix
index aeb90c09455bce7cc07ec5c101fdee6dd72450b6..7704397e6d0a7622a75dbd0c4fb3b311eadc495f 100644
--- a/pkgs/applications/audio/sonic-visualiser/default.nix
+++ b/pkgs/applications/audio/sonic-visualiser/default.nix
@@ -2,22 +2,25 @@
{ stdenv, fetchurl, alsaLib, bzip2, fftw, jackaudio, libX11, liblo
, libmad, libogg, librdf, librdf_raptor, librdf_rasqal, libsamplerate
-, libsndfile, makeWrapper, pkgconfig, pulseaudio, qt4, redland
-, rubberband, vampSDK
+, libsndfile, pkgconfig, pulseaudio, qt5, redland
+, rubberband, serd, sord, vampSDK
}:
stdenv.mkDerivation rec {
name = "sonic-visualiser-${version}";
- version = "1.9";
+ version = "2.3";
src = fetchurl {
- url = "http://code.soundsoftware.ac.uk/attachments/download/194/${name}.tar.gz";
- sha256 = "00igf7j6s8xfyxnlkbqma0yby9pknxqzy8cmh0aw95ix80cw56fq";
+
+ url = "http://code.soundsoftware.ac.uk/attachments/download/918/${name}.tar.gz";
+ sha256 = "1f06w2rin4r2mbi00bg3nmqdi2xdy9vq4jcmfanxzj3ld66ik40c";
};
buildInputs =
- [ libsndfile qt4 fftw /* should be fftw3f ??*/ bzip2 librdf rubberband
+ [ libsndfile qt5 fftw /* should be fftw3f ??*/ bzip2 librdf rubberband
libsamplerate vampSDK alsaLib librdf_raptor librdf_rasqal redland
+ serd
+ sord
pkgconfig
# optional
jackaudio
@@ -28,11 +31,10 @@ stdenv.mkDerivation rec {
# fishsound
liblo
libX11
- makeWrapper
];
buildPhase = ''
- for i in sonic-visualiser svapp svcore svgui;
+ for i in sonic-visualiser svapp svcore svgui;
do cd $i && qmake -makefile PREFIX=$out && cd ..;
done
make
@@ -40,19 +42,15 @@ stdenv.mkDerivation rec {
installPhase = ''
mkdir -p $out/{bin,share/sonic-visualiser}
- cp sonic-visualiser/sonic-visualiser $out/bin
- cp -r sonic-visualiser/samples $out/share/sonic-visualiser/samples
- wrapProgram $out/bin/sonic-visualiser --prefix LD_LIBRARY_PATH : ${libX11}/lib
+ cp sonic-visualiser $out/bin/
+ cp -r samples $out/share/sonic-visualiser/
'';
- meta = {
+ meta = with stdenv.lib; {
description = "View and analyse contents of music audio files";
homepage = http://www.sonicvisualiser.org/;
- license = "GPLv2";
- maintainers =
- [ stdenv.lib.maintainers.marcweber
- stdenv.lib.maintainers.goibhniu
- ];
- platforms = stdenv.lib.platforms.linux;
+ license = licenses.gpl2Plus;
+ maintainers = [ maintainers.goibhniu maintainers.marcweber ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/audio/synthv1/default.nix b/pkgs/applications/audio/synthv1/default.nix
index c93c4c8522565b69abe855dee6d5c2418146eaa7..4037b88ecb7e1581a9cf661552c67832bd8218c8 100644
--- a/pkgs/applications/audio/synthv1/default.nix
+++ b/pkgs/applications/audio/synthv1/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "synthv1-${version}";
- version = "0.3.6";
+ version = "0.4.1";
src = fetchurl {
url = "mirror://sourceforge/synthv1/${name}.tar.gz";
- sha256 = "1xj4dk1g546f9fv2c4i7g3f1axrxfrxzk9w1nidhj3686j79nyry";
+ sha256 = "1j1x8n3rlwrh373wqmm6mj3cgyk3apvnpqygx1700fl4cf249agl";
};
buildInputs = [ qt4 jackaudio lv2 ];
diff --git a/pkgs/applications/audio/vmpk/default.nix b/pkgs/applications/audio/vmpk/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7fffa77b5a399d19833c69c687df120d67933feb
--- /dev/null
+++ b/pkgs/applications/audio/vmpk/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, cmake, pkgconfig
+, qt4, jackaudio
+}:
+
+let
+ version = "0.5.1";
+in stdenv.mkDerivation rec {
+ name = "vmpk-${version}";
+
+ meta = with stdenv.lib; {
+ description = "Virtual MIDI Piano Keyboard";
+ homepage = "http://vmpk.sourceforge.net/";
+ license = licenses.gpl3Plus;
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ iyzsong ];
+ };
+
+ src = fetchurl {
+ url = "mirror://sourceforge/vmpk/${version}/${name}.tar.bz2";
+ sha256 = "11fqnxgs9hr9255d93n7lazxzjwn8jpmn23nywdksh0pb1ffvfrc";
+ };
+
+ nativeBuildInputs = [ cmake pkgconfig ];
+
+ buildInputs = [ qt4 jackaudio ];
+}
diff --git a/pkgs/applications/audio/yoshimi/default.nix b/pkgs/applications/audio/yoshimi/default.nix
index 698c8dc0ddad2d20c9654564c74518102e295edc..df0b98cdd9e49287062ffb2857b1b00b2b785080 100644
--- a/pkgs/applications/audio/yoshimi/default.nix
+++ b/pkgs/applications/audio/yoshimi/default.nix
@@ -6,11 +6,11 @@ assert stdenv ? glibc;
stdenv.mkDerivation rec {
name = "yoshimi-${version}";
- version = "1.1.0";
+ version = "1.2.0";
src = fetchurl {
url = "mirror://sourceforge/yoshimi/${name}.tar.bz2";
- sha256 = "0rb0q0bqsaaj3imdjgfaigj1kbjqkx1gm91nh2mdgy9i09rygsbv";
+ sha256 = "0p4v39kxxzzfvaazzxarx54i164ghpfxq0ljkavlgr8fnix5v3mx";
};
buildInputs = [
diff --git a/pkgs/applications/display-managers/lightdm-gtk-greeter/default.nix b/pkgs/applications/display-managers/lightdm-gtk-greeter/default.nix
index 0b8863752d2af947e05e45fdd0bf33611148ec8d..69f1eef9cecbcea9d4e2f891c173d86be24fb473 100644
--- a/pkgs/applications/display-managers/lightdm-gtk-greeter/default.nix
+++ b/pkgs/applications/display-managers/lightdm-gtk-greeter/default.nix
@@ -10,18 +10,24 @@
let
ver_branch = "1.6";
- version = "1.5.1"; # 1.5.2 and 1.6.0 result into infinite cycling of X in restarts
+ version = "1.6.1";
in
stdenv.mkDerivation rec {
name = "lightdm-gtk-greeter-${version}";
src = fetchurl {
url = "${meta.homepage}/${ver_branch}/${version}/+download/${name}.tar.gz";
- sha256 = "08fnsbnay5jhd7ps8n91i6c227zq6xizpyn34qhqzykrga8pxkpc";
+ sha256 = "1nb8ljrbrp1zga083g3b633xi3izxxm4jipw1qgial1x16mqc0hz";
};
- patches = [ ./lightdm-gtk-greeter.patch ];
- patchFlags = "-p0";
+ patches = [
+ ./lightdm-gtk-greeter.patch
+ (fetchurl { # CVE-2014-0979, https://bugs.launchpad.net/lightdm-gtk-greeter/+bug/1266449
+ url = "https://launchpadlibrarian.net/161796033/07_fix-NULL-username.patch";
+ sha256 = "1sqkhsz1z10k6vlmlrqrfx452lznv30885fmnzc73p2zxdlw9q1a";
+ })
+ ];
+ patchFlags = "-p1";
buildInputs = [ pkgconfig lightdm intltool ]
++ (if useGTK2 then [ gtk2 makeWrapper ] else [ gtk3 ]);
@@ -39,5 +45,6 @@ stdenv.mkDerivation rec {
meta = {
homepage = http://launchpad.net/lightdm-gtk-greeter;
platforms = stdenv.lib.platforms.linux;
+ maintainers = [ stdenv.lib.maintainers.ocharles ];
};
}
diff --git a/pkgs/applications/display-managers/lightdm-gtk-greeter/lightdm-gtk-greeter.patch b/pkgs/applications/display-managers/lightdm-gtk-greeter/lightdm-gtk-greeter.patch
index 5ae5603b4dd604e22c33c4fe6a66d5760b775ec9..ea9e0eaec936f8d3dd8fa2ae2e8c69f5fddf82aa 100644
--- a/pkgs/applications/display-managers/lightdm-gtk-greeter/lightdm-gtk-greeter.patch
+++ b/pkgs/applications/display-managers/lightdm-gtk-greeter/lightdm-gtk-greeter.patch
@@ -1,13 +1,13 @@
-=== modified file 'src/lightdm-gtk-greeter.c'
---- src/lightdm-gtk-greeter.c 2013-02-09 23:20:39 +0000
-+++ src/lightdm-gtk-greeter.c 2013-03-29 12:21:34 +0000
-@@ -1273,7 +1273,7 @@
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (session_combo), renderer, "text", 0);
- model = gtk_combo_box_get_model (session_combo);
+diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c
+index cc5f9e1..d615dc1 100644
+--- a/src/lightdm-gtk-greeter.c
++++ b/src/lightdm-gtk-greeter.c
+@@ -1716,7 +1716,7 @@ main (int argc, char **argv)
+ gtk_container_add (GTK_CONTAINER (menuitem), image);
+ gtk_widget_show (GTK_WIDGET (menuitem));
+
- items = lightdm_get_sessions ();
+ items = lightdm_get_sessions (greeter);
+ GSList *sessions = NULL;
for (item = items; item; item = item->next)
{
- LightDMSession *session = item->data;
-
diff --git a/pkgs/applications/display-managers/lightdm/default.nix b/pkgs/applications/display-managers/lightdm/default.nix
index 598c42199bec9511c88c74ce319f5f0f5ed23091..d4c6f24d69a38abe7a2c95a5f4428d6a4dc66e20 100644
--- a/pkgs/applications/display-managers/lightdm/default.nix
+++ b/pkgs/applications/display-managers/lightdm/default.nix
@@ -3,18 +3,18 @@
let
ver_branch = "1.8";
- version = "1.7.0";
+ version = "1.8.6";
in
stdenv.mkDerivation rec {
name = "lightdm-${version}";
src = fetchurl {
url = "${meta.homepage}/${ver_branch}/${version}/+download/${name}.tar.xz";
- sha256 = "0nwwjgc9xvwili6714ag88wsrf0lr5hv1i6z9f0xvin4ym18cbs5";
+ sha256 = "17ivc0c4dbnc0fzd581j53cn6hdav34zz2hswjzy8aczbpk605qi";
};
patches = [ ./lightdm.patch ];
- patchFlags = "-p0";
+ patchFlags = "-p1";
buildInputs = [
pkgconfig pam libxcb glib libXdmcp itstool libxml2 intltool libxklavier libgcrypt
@@ -27,5 +27,6 @@ stdenv.mkDerivation rec {
meta = {
homepage = http://launchpad.net/lightdm;
platforms = stdenv.lib.platforms.linux;
+ maintainers = [ stdenv.lib.maintainers.ocharles ];
};
}
diff --git a/pkgs/applications/display-managers/lightdm/lightdm.patch b/pkgs/applications/display-managers/lightdm/lightdm.patch
index a6e53bafcc79032d04959ce8c9c730c2a9b93afb..d81e0aae56d525c84279ef5787b86128ec70f0c0 100644
--- a/pkgs/applications/display-managers/lightdm/lightdm.patch
+++ b/pkgs/applications/display-managers/lightdm/lightdm.patch
@@ -1,7 +1,8 @@
-=== modified file 'liblightdm-gobject/greeter.c'
---- liblightdm-gobject/greeter.c 2013-01-31 20:56:09 +0000
-+++ liblightdm-gobject/greeter.c 2013-03-29 14:15:58 +0000
-@@ -567,6 +567,21 @@
+diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
+index 9387118..635cea0 100644
+--- a/liblightdm-gobject/greeter.c
++++ b/liblightdm-gobject/greeter.c
+@@ -567,6 +567,21 @@ lightdm_greeter_get_default_session_hint (LightDMGreeter *greeter)
}
/**
@@ -23,11 +24,11 @@
* lightdm_greeter_get_hide_users_hint:
* @greeter: A #LightDMGreeter
*
-
-=== modified file 'liblightdm-gobject/lightdm/greeter.h'
---- liblightdm-gobject/lightdm/greeter.h 2013-01-31 20:56:09 +0000
-+++ liblightdm-gobject/lightdm/greeter.h 2013-03-29 11:56:11 +0000
-@@ -93,6 +93,8 @@
+diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h
+index 7d8988f..2b54909 100644
+--- a/liblightdm-gobject/lightdm/greeter.h
++++ b/liblightdm-gobject/lightdm/greeter.h
+@@ -93,6 +93,8 @@ gboolean lightdm_greeter_get_select_guest_hint (LightDMGreeter *greeter);
const gchar *lightdm_greeter_get_autologin_user_hint (LightDMGreeter *greeter);
@@ -36,19 +37,19 @@
gboolean lightdm_greeter_get_autologin_guest_hint (LightDMGreeter *greeter);
gint lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter);
-
-=== modified file 'liblightdm-gobject/lightdm/session.h'
---- liblightdm-gobject/lightdm/session.h 2013-01-31 20:56:09 +0000
-+++ liblightdm-gobject/lightdm/session.h 2013-03-29 11:59:16 +0000
+diff --git a/liblightdm-gobject/lightdm/session.h b/liblightdm-gobject/lightdm/session.h
+index 13ddcd9..cdb2fd6 100644
+--- a/liblightdm-gobject/lightdm/session.h
++++ b/liblightdm-gobject/lightdm/session.h
@@ -12,6 +12,7 @@
- #define _LIGHTDM_SESSION_H_
+ #define LIGHTDM_SESSION_H_
#include
+#include "greeter.h"
G_BEGIN_DECLS
-@@ -42,9 +43,9 @@
+@@ -42,9 +43,9 @@ typedef struct
GType lightdm_session_get_type (void);
@@ -60,10 +61,10 @@
const gchar *lightdm_session_get_key (LightDMSession *session);
-
-=== modified file 'liblightdm-gobject/session.c'
---- liblightdm-gobject/session.c 2013-01-31 20:56:09 +0000
-+++ liblightdm-gobject/session.c 2013-03-29 14:16:48 +0000
+diff --git a/liblightdm-gobject/session.c b/liblightdm-gobject/session.c
+index 949778f..db5e18a 100644
+--- a/liblightdm-gobject/session.c
++++ b/liblightdm-gobject/session.c
@@ -11,6 +11,7 @@
#include
#include
@@ -72,7 +73,7 @@
#include "lightdm/session.h"
enum {
-@@ -167,7 +168,7 @@
+@@ -189,7 +190,7 @@ load_sessions (const gchar *sessions_dir)
}
static void
@@ -81,18 +82,17 @@
{
GKeyFile *config_key_file = NULL;
gchar *config_path = NULL;
-@@ -183,8 +184,8 @@
+@@ -205,8 +206,7 @@ update_sessions (void)
remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
/* Use session directory from configuration */
- /* FIXME: This should be sent in the greeter connection */
- config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
+ config_path = g_strdup (lightdm_greeter_get_config_path (greeter));
-+
config_key_file = g_key_file_new ();
result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
- if (error)
-@@ -228,9 +229,9 @@
+ if (error && !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
+@@ -250,9 +250,9 @@ update_sessions (void)
* Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
**/
GList *
@@ -104,7 +104,7 @@
return local_sessions;
}
-@@ -242,9 +243,9 @@
+@@ -264,9 +264,9 @@ lightdm_get_sessions (void)
* Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
**/
GList *
@@ -116,78 +116,29 @@
return remote_sessions;
}
-
-=== modified file 'src/display.c'
---- src/display.c 2013-03-26 22:22:49 +0000
-+++ src/display.c 2013-03-29 12:12:43 +0000
-@@ -62,6 +62,9 @@
- /* Program to run sessions through */
- gchar *session_wrapper;
-
-+ /* Path to the configuration file that lightdm is running under */
-+ gchar *config_path;
+diff --git a/src/lightdm.c b/src/lightdm.c
+index 7d35034..910164c 100644
+--- a/src/lightdm.c
++++ b/src/lightdm.c
+@@ -1142,6 +1142,9 @@ main (int argc, char **argv)
+ }
+ }
+ g_clear_error (&error);
+
- /* TRUE if in a user session */
- gboolean in_user_session;
-
-@@ -213,6 +216,14 @@
- }
-
- void
-+display_set_config_path (Display *display, const gchar *config_path)
-+{
-+ g_return_if_fail (display != NULL);
-+ g_free (display->priv->config_path);
-+ display->priv->config_path = g_strdup (config_path);
-+}
-+
-+void
- display_set_show_remote_login_hint (Display *display, gboolean show_remote_login)
- {
- g_return_if_fail (display != NULL);
-@@ -436,6 +447,7 @@
- greeter_set_hint (display->priv->greeter, "show-remote-login", display->priv->greeter_show_remote_login ? "true" : "false");
- if (display->priv->greeter_is_lock)
- greeter_set_hint (display->priv->greeter, "lock-screen", "true");
-+ greeter_set_hint (display->priv->greeter, "config-path", display->priv->config_path);
-
- /* Run greeter as unprivileged user */
- if (getuid () != 0)
-
-=== modified file 'src/display.h'
---- src/display.h 2013-03-26 22:22:49 +0000
-+++ src/display.h 2013-03-29 12:12:37 +0000
-@@ -80,6 +80,8 @@
-
- void display_set_user_session (Display *display, SessionType type, const gchar *session_name);
-
-+void display_set_config_path (Display *display, const gchar *config_path);
++ config_set_string (config_get_instance (), "SeatDefaults", "config-path", config_path);
+
- gboolean display_start (Display *display);
-
- gboolean display_get_is_ready (Display *display);
-
-=== modified file 'src/lightdm.c'
---- src/lightdm.c 2013-03-07 21:40:31 +0000
-+++ src/lightdm.c 2013-03-29 11:48:45 +0000
-@@ -1050,6 +1050,7 @@
- g_debug ("Starting Light Display Manager %s, UID=%i PID=%i", VERSION, getuid (), getpid ());
-
- g_debug ("Loaded configuration from %s", config_path);
-+ config_set_string (config_get_instance (), "LightDM", "config-path", config_path);
g_free (config_path);
- g_debug ("Using D-Bus name %s", LIGHTDM_BUS_NAME);
-
-=== modified file 'src/seat.c'
---- src/seat.c 2013-03-26 22:22:49 +0000
-+++ src/seat.c 2013-03-29 12:13:00 +0000
-@@ -536,6 +536,7 @@
- if (!session_name)
- session_name = seat_get_string_property (seat, "user-session");
- display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
-+ display_set_config_path (display, config_get_string (config_get_instance (), "LightDM", "config-path"));
-
- seat->priv->displays = g_list_append (seat->priv->displays, display);
- g_signal_emit (seat, signals[DISPLAY_ADDED], 0, display);
-
+ /* Set default values */
+diff --git a/src/seat.c b/src/seat.c
+index e2b9c2c..a950ea2 100644
+--- a/src/seat.c
++++ b/src/seat.c
+@@ -1137,6 +1137,7 @@ create_greeter_session (Seat *seat)
+ greeter_set_hint (greeter_session, "show-manual-login", seat_get_boolean_property (seat, "greeter-show-manual-login") ? "true" : "false");
+ greeter_set_hint (greeter_session, "show-remote-login", seat_get_boolean_property (seat, "greeter-show-remote-login") ? "true" : "false");
+ greeter_set_hint (greeter_session, "has-guest-account", seat_get_allow_guest (seat) && seat_get_boolean_property (seat, "greeter-allow-guest") ? "true" : "false");
++ greeter_set_hint (greeter_session, "config-path", seat_get_string_property (seat, "config-path"));
+
+ g_object_unref (session_config);
+
diff --git a/pkgs/applications/display-managers/slim/default.nix b/pkgs/applications/display-managers/slim/default.nix
index 0b5bcccfb21a06467fd614f31d2a41253db7dd08..bf2c34b9318e27b20d4dc0dd54917f4acab750a8 100644
--- a/pkgs/applications/display-managers/slim/default.nix
+++ b/pkgs/applications/display-managers/slim/default.nix
@@ -1,5 +1,5 @@
{ stdenv, fetchurl, cmake, pkgconfig, xorg, libjpeg, libpng
-, fontconfig, freetype, pam, dbus_libs }:
+, fontconfig, freetype, pam, dbus_libs, makeWrapper, pkgs }:
stdenv.mkDerivation rec {
name = "slim-1.3.6";
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
./run-once.patch
];
- preConfigure = "substituteInPlace CMakeLists.txt --replace /etc $out/etc --replace /lib $out/lib";
+ preConfigure = "substituteInPlace CMakeLists.txt --replace /lib $out/lib";
cmakeFlags = [ "-DUSE_PAM=1" ];
@@ -29,7 +29,7 @@ stdenv.mkDerivation rec {
buildInputs =
[ cmake pkgconfig libjpeg libpng fontconfig freetype
pam dbus_libs
- xorg.libX11 xorg.libXext xorg.libXrandr xorg.libXrender xorg.libXmu xorg.libXft
+ xorg.libX11 xorg.libXext xorg.libXrandr xorg.libXrender xorg.libXmu xorg.libXft makeWrapper
];
NIX_CFLAGS_LINK = "-lXmu";
diff --git a/pkgs/applications/display-managers/slim/runtime-paths.patch b/pkgs/applications/display-managers/slim/runtime-paths.patch
index f6811dbe668266b6ef21dce6f193adbe303fe9be..5a8e07bfbf07e3d137661bf9c10925997416c3c8 100644
--- a/pkgs/applications/display-managers/slim/runtime-paths.patch
+++ b/pkgs/applications/display-managers/slim/runtime-paths.patch
@@ -1,6 +1,6 @@
-diff -ru -x '*~' slim-1.3.6-orig/app.cpp slim-1.3.6/app.cpp
+diff -ru slim-1.3.6-orig/app.cpp slim-1.3.6/app.cpp
--- slim-1.3.6-orig/app.cpp 2013-10-02 00:38:05.000000000 +0200
-+++ slim-1.3.6/app.cpp 2013-10-15 11:02:55.629263422 +0200
++++ slim-1.3.6/app.cpp 2014-03-30 19:01:04.115414201 +0200
@@ -200,7 +200,9 @@
/* Read configuration and theme */
@@ -23,3 +23,48 @@ diff -ru -x '*~' slim-1.3.6-orig/app.cpp slim-1.3.6/app.cpp
themeName = cfg->getOption("current_theme");
string::size_type pos;
if ((pos = themeName.find(",")) != string::npos) {
+diff -ru slim-1.3.6-orig/CMakeLists.txt slim-1.3.6/CMakeLists.txt
+--- slim-1.3.6-orig/CMakeLists.txt 2013-10-02 00:38:05.000000000 +0200
++++ slim-1.3.6/CMakeLists.txt 2014-03-30 19:16:48.445069729 +0200
+@@ -23,7 +23,7 @@
+
+ set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory")
+ set(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/slim")
+-set(SYSCONFDIR "/etc")
++set(SYSCONFDIR "$ENV{out}/etc")
+ set(LIBDIR "/lib")
+ set(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man")
+
+@@ -40,7 +40,7 @@
+ set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DPACKAGE=\"slim\"")
+ set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DVERSION=\"${SLIM_VERSION}\"")
+ set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DPKGDATADIR=\"${PKGDATADIR}\"")
+-set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DSYSCONFDIR=\"${SYSCONFDIR}\"")
++set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DSYSCONFDIR=\"/etc\"")
+
+ # Flags
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g -O2")
+Only in slim-1.3.6: CMakeLists.txt~
+diff -ru slim-1.3.6-orig/slimlock.cpp slim-1.3.6/slimlock.cpp
+--- slim-1.3.6-orig/slimlock.cpp 2013-10-02 00:38:05.000000000 +0200
++++ slim-1.3.6/slimlock.cpp 2014-03-30 19:01:04.115414201 +0200
+@@ -106,13 +106,17 @@
+ unsigned int cfg_passwd_timeout;
+ // Read user's current theme
+ cfg = new Cfg;
+- cfg->readConf(CFGFILE);
++ char *cfgfile = getenv("SLIM_CFGFILE");
++ if (!cfgfile) cfgfile = CFGFILE;
++ cfg->readConf(cfgfile);
+ cfg->readConf(SLIMLOCKCFG);
+ string themebase = "";
+ string themefile = "";
+ string themedir = "";
+ themeName = "";
+- themebase = string(THEMESDIR) + "/";
++ char *themesdir = getenv("SLIM_THEMESDIR");
++ if (!themesdir) themesdir = THEMESDIR;
++ themebase = string(themesdir) + "/";
+ themeName = cfg->getOption("current_theme");
+ string::size_type pos;
+ if ((pos = themeName.find(",")) != string::npos) {
diff --git a/pkgs/applications/editors/ed/default.nix b/pkgs/applications/editors/ed/default.nix
index 3e22cfd0412d3cb45b62f1650b210df48cbaf494..88b539d29f5f000a2a3640d42da17e63914ce2e2 100644
--- a/pkgs/applications/editors/ed/default.nix
+++ b/pkgs/applications/editors/ed/default.nix
@@ -1,11 +1,11 @@
{ fetchurl, stdenv }:
stdenv.mkDerivation rec {
- name = "ed-1.7";
+ name = "ed-1.9";
src = fetchurl {
url = "mirror://gnu/ed/${name}.tar.gz";
- sha256 = "0c908wb5pm48rjrrfbm5dhrqzys8f1dbvi90dn0vgwjzk80l2hl9";
+ sha256 = "122syihsx2hwzj75mkf5a9ssiky2xby748kp4cc00wzhmp7p5cym";
};
/* FIXME: Tests currently fail on Darwin:
diff --git a/pkgs/applications/editors/emacs-24/default.nix b/pkgs/applications/editors/emacs-24/default.nix
index c558b483e97bc77f9c53dc6e9967734a5a778d50..6ecee37d21e12622dbe71b31b11763c902aeba80 100644
--- a/pkgs/applications/editors/emacs-24/default.nix
+++ b/pkgs/applications/editors/emacs-24/default.nix
@@ -2,7 +2,7 @@
, pkgconfig, gtk, libXft, dbus, libpng, libjpeg, libungif
, libtiff, librsvg, texinfo, gconf, libxml2, imagemagick, gnutls
, alsaLib, cairo
-, withX ? !stdenv.isDarwin
+, withX ? !stdenv.isDarwin, withGTK ? true
}:
assert (libXft != null) -> libpng != null; # probably a bug
@@ -27,11 +27,13 @@ stdenv.mkDerivation rec {
++ stdenv.lib.optional stdenv.isDarwin cairo;
configureFlags =
- ( if withX then
+ ( if withX && withGTK then
[ "--with-x-toolkit=gtk" "--with-xft"]
+ else (if withX then
+ [ "--with-x-toolkit=lucid" "--with-xft" ]
else
[ "--with-x=no" "--with-xpm=no" "--with-jpeg=no" "--with-png=no"
- "--with-gif=no" "--with-tiff=no" ] )
+ "--with-gif=no" "--with-tiff=no" ] ) )
# On NixOS, help Emacs find `crt*.o'.
++ stdenv.lib.optional (stdenv ? glibc)
[ "--with-crt-dir=${stdenv.glibc}/lib" ];
diff --git a/pkgs/applications/editors/emacs-modes/bbdb/default.nix b/pkgs/applications/editors/emacs-modes/bbdb/default.nix
index da92c38d0780a4659e924330ab359d0f6a945a16..ed96e689283326918bf04f374460f3f81409b52f 100644
--- a/pkgs/applications/editors/emacs-modes/bbdb/default.nix
+++ b/pkgs/applications/editors/emacs-modes/bbdb/default.nix
@@ -1,12 +1,12 @@
{stdenv, fetchurl, emacs, texinfo, ctags}:
-stdenv.mkDerivation {
- name = "bbdb-2.35";
+stdenv.mkDerivation rec {
+ name = "bbdb-2.36";
src = fetchurl {
# not using mirror:// because it produces a different file
- url = http://bbdb.sourceforge.net/bbdb-2.35.tar.gz;
- sha256 = "3fb1316e2ed74d47ca61187fada550e58797467bd9e8ad67343ed16da769f916";
+ url = "http://bbdb.sourceforge.net/${name}.tar.gz";
+ sha256 = "1rmw94l71ahfbynyy0bijfy488q9bl5ksl4zpvg7j9dbmgbh296r";
};
patches = [ ./install-infodir.patch ];
@@ -28,8 +28,8 @@ stdenv.mkDerivation {
'';
meta = {
+ homepage = "http://bbdb.sourceforge.net/";
description = "The Insidious Big Brother Database (BBDB), a contact management utility for Emacs";
- homepage = http://bbdb.sourceforge.net/;
license = "GPL";
};
}
diff --git a/pkgs/applications/editors/emacs-modes/cryptol/default.nix b/pkgs/applications/editors/emacs-modes/cryptol/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3290041178ef3c494c15dea757e43759b34a72cd
--- /dev/null
+++ b/pkgs/applications/editors/emacs-modes/cryptol/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchgit, emacs }:
+
+stdenv.mkDerivation rec {
+ name = "cryptol-mode-${version}";
+ version = "20141010";
+
+ src = fetchgit {
+ url = "https://github.com/thoughtpolice/cryptol-mode.git";
+ rev = "50075d49d7c4ec4b03ce31b634424410262c1ad4";
+ sha256 = "6ecd4904b7f3b1cd0721591ce45f16fe11cd1dd5fd7af8110d1f84b133ed4aec";
+ };
+
+ buildInputs = [ emacs ];
+
+ installPhase = ''
+ install -d $out/share/emacs/site-lisp
+ install *.el *.elc $out/share/emacs/site-lisp
+ '';
+
+ meta = {
+ description = "Emacs major mode for Cryptol";
+ homepage = "https://thoughtpolice/cryptol-mode";
+ license = stdenv.lib.licenses.gpl3Plus;
+ platforms = stdenv.lib.platforms.all;
+ maintainers = [ stdenv.lib.maintainers.thoughtpolice ];
+ };
+}
diff --git a/pkgs/applications/editors/emacs-modes/darcsum/darcs_context b/pkgs/applications/editors/emacs-modes/darcsum/darcs_context
new file mode 100644
index 0000000000000000000000000000000000000000..7e9de1ed80b5ef80e1cce9122a915e8ce9db37bf
--- /dev/null
+++ b/pkgs/applications/editors/emacs-modes/darcsum/darcs_context
@@ -0,0 +1,7 @@
+
+Context:
+
+[TAG 1.3
+Simon Michael **20131103203640
+ Ignore-this: d12bac373e4aa0e5ffe6c390e1dfe269
+]
diff --git a/pkgs/applications/editors/emacs-modes/darcsum/default.nix b/pkgs/applications/editors/emacs-modes/darcsum/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..cf2bcc6e30b955d8b9374e7325fe1ad8722e0733
--- /dev/null
+++ b/pkgs/applications/editors/emacs-modes/darcsum/default.nix
@@ -0,0 +1,34 @@
+# To automatically load darcsum when needed, add the following to your emacs init file:
+#
+# (autoload 'darcsum-changes "darcsum" nil t)
+# (autoload 'darcsum-whatsnew "darcsum" nil t)
+# (autoload 'darcsum-view "darcsum" nil t)
+#
+# (These lines were copied from 50darcsum.el in the darcsum repository.)
+
+
+{ fetchdarcs, stdenv }:
+
+stdenv.mkDerivation {
+ name = "darcsum-1.3";
+
+ src = fetchdarcs {
+ url = http://hub.darcs.net/simon/darcsum;
+ context = ./darcs_context;
+ sha256 = "18dyk2apmnjapd604a5njfqwjri1mc7lgjaajy9phicpibgdrwzh";
+ };
+
+ phases = [ "unpackPhase" "installPhase" ];
+
+ installPhase = ''
+ install -d "$out/share/emacs/site-lisp"
+ install darcsum.el "$out/share/emacs/site-lisp"
+ '';
+
+ meta = {
+ description = "A pcl-cvs like interface for managing darcs patches.";
+ homepage = "http://hub.darcs.net/simon/darcsum";
+ license = "GPLv2+";
+ maintainers = [ stdenv.lib.maintainers.falsifian ];
+ };
+}
diff --git a/pkgs/applications/editors/emacs-modes/emacs-clang-complete-async/default.nix b/pkgs/applications/editors/emacs-modes/emacs-clang-complete-async/default.nix
index 6d10244a87956dd3102daaf1ba5e34e65ccc6309..b23c6da6123c8532d17f88c02b2b839929cf0da0 100644
--- a/pkgs/applications/editors/emacs-modes/emacs-clang-complete-async/default.nix
+++ b/pkgs/applications/editors/emacs-modes/emacs-clang-complete-async/default.nix
@@ -1,4 +1,4 @@
-{ clangStdenv, fetchgit, llvmFull }:
+{ clangStdenv, fetchgit, llvm, clang }:
clangStdenv.mkDerivation {
name = "emacs-clang-complete-async-20130218";
@@ -8,7 +8,7 @@ clangStdenv.mkDerivation {
sha256 = "1c8zqi6axbsb951azz9iqx3j52j30nd9ypv396hvids3g02cirrf";
};
- buildInputs = [ llvmFull ];
+ buildInputs = [ llvm clang.clang ];
installPhase = ''
mkdir -p $out/bin
diff --git a/pkgs/applications/editors/emacs-modes/emacs-w3m/default.nix b/pkgs/applications/editors/emacs-modes/emacs-w3m/default.nix
index e0373fca5df544c88a1d85e64a4fe7a00f1a73d0..3ba848affc0deed58dd238f7781212cb18d15165 100644
--- a/pkgs/applications/editors/emacs-modes/emacs-w3m/default.nix
+++ b/pkgs/applications/editors/emacs-modes/emacs-w3m/default.nix
@@ -56,6 +56,6 @@ stdenv.mkDerivation rec {
homepage = http://emacs-w3m.namazu.org/;
- maintainers = [ ];
+ maintainers = [ stdenv.lib.maintainers.mornfall ];
};
}
diff --git a/pkgs/applications/editors/emacs-modes/flymake-cursor/default.nix b/pkgs/applications/editors/emacs-modes/flymake-cursor/default.nix
index 4b2692a5e22a402f2221eb359298a683279a7023..eae338d241de081b66fa6458894476dd76e1e4eb 100644
--- a/pkgs/applications/editors/emacs-modes/flymake-cursor/default.nix
+++ b/pkgs/applications/editors/emacs-modes/flymake-cursor/default.nix
@@ -5,7 +5,7 @@ stdenv.mkDerivation rec {
src = fetchurl {
url = "http://www.emacswiki.org/emacs/download/flymake-cursor.el";
- sha256 = "1qqppd1786w8pl1avjb01n23lwihb7m0hr23abjklsxz03gmp4qz";
+ sha256 = "10cpzrd588ya52blghxss5zkn6x8hc7bx1h0qbcdlybbmkjgpkxr";
};
phases = [ "buildPhase" "installPhase"];
@@ -26,7 +26,5 @@ stdenv.mkDerivation rec {
description = "Displays flymake error msg in minibuffer after delay";
homepage = http://www.emacswiki.org/emacs/flymake-cursor.el;
license = stdenv.lib.licenses.publicDomain;
-
- platforms = stdenv.lib.platforms.all;
};
}
diff --git a/pkgs/applications/editors/emacs-modes/idris/default.nix b/pkgs/applications/editors/emacs-modes/idris/default.nix
index 7bd39cd2b4e0ef051fd026d684e6f51b2a1deb1c..8671a926f67731fa6bc963ac5f7f15175fa1b10b 100644
--- a/pkgs/applications/editors/emacs-modes/idris/default.nix
+++ b/pkgs/applications/editors/emacs-modes/idris/default.nix
@@ -1,12 +1,12 @@
{ stdenv, fetchgit, emacs }:
stdenv.mkDerivation rec {
- name = "idris-mode-20140106";
+ name = "idris-mode-20140405";
src = fetchgit {
url = https://github.com/idris-hackers/idris-mode.git;
- rev = "47df65dd5b554c1d7cf70a07c3bd06d80867f870";
- sha256 = "55df66d1bace134bea83f0547e01daf068fc96dc080cf88ea8945ddcb2d08ea4";
+ rev = "2e2d18fb757da4b42940ebe2a57d7a117175489f";
+ sha256 = "d4b52c6c43c038c94a7464cd9c849cd40c01696c440da8b057c00a9be22f9ac0";
};
buildInputs = [ emacs ];
@@ -22,7 +22,7 @@ stdenv.mkDerivation rec {
meta = {
description = "Emacs major mode for Idris";
- homepage = https://github.com/idris-hackers/idris-modehttps://github.com/idris-hackers/idris-mode;
+ homepage = https://github.com/idris-hackers/idris-mode;
license = "GPLv3";
platforms = stdenv.lib.platforms.all;
diff --git a/pkgs/applications/editors/emacs-modes/structured-haskell-mode/default.nix b/pkgs/applications/editors/emacs-modes/structured-haskell-mode/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a832c7d5942cda5c3cb1caf1ffc262f028726f26
--- /dev/null
+++ b/pkgs/applications/editors/emacs-modes/structured-haskell-mode/default.nix
@@ -0,0 +1,22 @@
+{ cabal, emacs, haskellSrcExts }:
+
+cabal.mkDerivation (self: {
+ pname = "structured-haskell-mode";
+ version = "1.0.2";
+ sha256 = "1lwdhlr38y5hdr78nplplr3q0hrjhryw378f1857qh0lvp03gwl2";
+ isLibrary = false;
+ isExecutable = true;
+ buildDepends = [ haskellSrcExts ];
+ buildTools = [ emacs ];
+ postInstall = ''
+ emacs -L elisp --batch -f batch-byte-compile "elisp/"*.el
+ install -d $out/share/emacs/site-lisp
+ install "elisp/"*.el "elisp/"*.elc $out/share/emacs/site-lisp
+ '';
+ meta = {
+ homepage = "https://github.com/chrisdone/structured-haskell-mode";
+ description = "Structured editing Emacs mode for Haskell";
+ license = self.stdenv.lib.licenses.bsd3;
+ platforms = self.ghc.meta.platforms;
+ };
+})
diff --git a/pkgs/applications/editors/emacs-modes/writegood/default.nix b/pkgs/applications/editors/emacs-modes/writegood/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..353215a5d48573e5c14b2ab9b4f871ee81eb6409
--- /dev/null
+++ b/pkgs/applications/editors/emacs-modes/writegood/default.nix
@@ -0,0 +1,30 @@
+{stdenv, fetchurl, emacs}:
+
+let version = "1.3";
+
+in stdenv.mkDerivation {
+ name = "writegood-mode-${version}";
+ src = fetchurl {
+ url = "https://github.com/bnbeckwith/writegood-mode/archive/v${version}.tar.gz";
+ sha256 = "0p34rgawnqg94vk4lcw14x99rrvsd23dmbwkxz2vax5kq6l8y5yf";
+ };
+
+ buildInputs = [ emacs ];
+
+ buildPhase = ''
+ emacs -L . --batch -f batch-byte-compile *.el
+ '';
+
+ installPhase = ''
+ install -d $out/share/emacs/site-lisp
+ install *.el *.elc $out/share/emacs/site-lisp
+ '';
+
+ meta = {
+ description = "Emacs minor mode that aids in finding common writing problems";
+ homepage = https://github.com/bnbeckwith/writegood-mode;
+ platforms = stdenv.lib.platforms.all;
+ maintainers = [ stdenv.lib.maintainers.pSub ];
+ license = "GPL3";
+ };
+}
diff --git a/pkgs/applications/editors/idea/default.nix b/pkgs/applications/editors/idea/default.nix
index 74dbaf78dac8b7e40efb6d96bed6665b7810ffc6..c6301bd8a302742d4c0eb622eb5a0084dd9c663a 100644
--- a/pkgs/applications/editors/idea/default.nix
+++ b/pkgs/applications/editors/idea/default.nix
@@ -5,10 +5,10 @@
let
buildIdea =
- { name, src, description, license }:
+ { name, version, build, src, description, license }:
stdenv.mkDerivation rec {
- inherit name src license;
+ inherit name build src license;
ideaItem = makeDesktopItem {
name = "IDEA";
exec = "idea";
@@ -23,27 +23,30 @@ let
buildCommand = ''
tar xvzf $src
mkdir -p $out
- cp -a $name $out
+ cp -a idea-$build $out
interpreter=$(echo ${stdenv.glibc}/lib/ld-linux*.so.2)
- 7z x $out/$name/lib/snappy-java-1.0.5.jar
- rm $out/$name/lib/snappy-java-1.0.5.jar
+ 7z x $out/idea-$build/lib/snappy-java-1.0.5.jar
+ rm $out/idea-$build/lib/snappy-java-1.0.5.jar
if [ "${stdenv.system}" == "x86_64-linux" ];then
- patchelf --set-interpreter $interpreter $out/$name/bin/fsnotifier64
+ patchelf --set-interpreter $interpreter $out/idea-$build/bin/fsnotifier64
patchelf --set-rpath ${stdenv.gcc.gcc}/lib64/ org/xerial/snappy/native/Linux/amd64/libsnappyjava.so
else
- patchelf --set-interpreter $interpreter $out/$name/bin/fsnotifier
+ patchelf --set-interpreter $interpreter $out/idea-$build/bin/fsnotifier
patchelf --set-rpath ${stdenv.gcc.gcc}/lib/ org/xerial/snappy/native/Linux/i386/libsnappyjava.so
fi
- 7z a -tzip $out/$name/lib/snappy-java-1.0.5.jar .
+ 7z a -tzip $out/idea-$build/lib/snappy-java-1.0.5.jar .
mkdir -p $out/bin
- makeWrapper $out/$name/bin/idea.sh $out/bin/idea \
+
+ jdk=${jdk}/lib/openjdk
+
+ makeWrapper $out/idea-$build/bin/idea.sh $out/bin/idea \
--prefix PATH : ${jdk}/bin:${coreutils}/bin:${gnugrep}/bin:${which}/bin:${git}/bin \
--prefix LD_RUN_PATH : ${stdenv.gcc.gcc}/lib/ \
- --prefix JDK_HOME : ${jdk} \
- --prefix IDEA_JDK : ${jdk}
+ --prefix JDK_HOME : $jdk \
+ --prefix IDEA_JDK : $jdk
mkdir -p $out/share/applications
cp ${ideaItem}/share/applications/* $out/share/applications
@@ -61,43 +64,27 @@ let
in {
- idea_community_1301 = buildIdea {
- name = "idea-IC-133.331";
- description = "IntelliJ IDEA 13 Community Edition";
- license = stdenv.lib.licenses.asl20.shortName;
- src = fetchurl {
- url = http://download-ln.jetbrains.com/idea/ideaIC-13.0.1.tar.gz;
- sha256 = "6f268bb1dbe61ed0274fd2ea9b4b7403f50da11bdde208bcfc8c391d235d7c02";
- };
- };
-
- idea_ultimate_1301 = buildIdea {
- name = "idea-IU-133.331";
- description = "IntelliJ IDEA 13 Ultimate Edition";
- license = stdenv.lib.licenses.unfree;
- src = fetchurl {
- url = http://download-ln.jetbrains.com/idea/ideaIU-13.0.1.tar.gz;
- sha256 = "d3638d97b719773459d5027ba096b52695325b241cbf5e31e535165a5f19849d";
- };
- };
-
- idea_community_13 = buildIdea {
- name = "idea-IC-133.193";
+ idea_community_1311 = buildIdea rec {
+ name = "idea-community-${version}";
+ version = "13.1.1";
+ build = "IC-135.480";
description = "IntelliJ IDEA 13 Community Edition";
license = stdenv.lib.licenses.asl20.shortName;
src = fetchurl {
- url = http://download-ln.jetbrains.com/idea/ideaIC-13.tar.gz;
- sha256 = "5cd88b8effc5e4e55d999df1cec6f54c53b5adf0b88e49400b3a185bef7db13a";
+ url = "http://download-ln.jetbrains.com/idea/ideaIC-${version}.tar.gz";
+ sha256 = "9e28d3e5682b037c9d6190622ab2a47112fa792539083cc7a4cb24f3f7bf7d22";
};
};
- idea_ultimate_13 = buildIdea {
- name = "idea-IU-133.193";
+ idea_ultimate_1311 = buildIdea rec {
+ name = "idea-ultimate-${version}";
+ version = "13.1.1";
+ build = "IU-135.480";
description = "IntelliJ IDEA 13 Ultimate Edition";
license = stdenv.lib.licenses.unfree;
src = fetchurl {
- url = http://download-ln.jetbrains.com/idea/ideaIU-13.tar.gz;
- sha256 = "211a782654d04f2fe5fce9084043edfb8355a7bc4dc41fee7dc79cfe604d4654";
+ url = "http://download-ln.jetbrains.com/idea/ideaIU-${version}.tar.gz";
+ sha256 = "d699abcdcace387105a465049e015c1367dedf42f7a5f5a1f7b3d840e98b2658";
};
};
diff --git a/pkgs/applications/editors/kdevelop/default.nix b/pkgs/applications/editors/kdevelop/default.nix
index 14f9c1eb0d4904e1b809a7d0fd2c2b4f22e711d4..b815b05234717b737a0ebc675d32b081d9ec6a36 100644
--- a/pkgs/applications/editors/kdevelop/default.nix
+++ b/pkgs/applications/editors/kdevelop/default.nix
@@ -1,28 +1,20 @@
{ stdenv, fetchurl, kdevplatform, cmake, pkgconfig, automoc4, shared_mime_info,
- kdebase_workspace, gettext, perl, okteta }:
+ kdebase_workspace, gettext, perl, okteta, qjson }:
stdenv.mkDerivation rec {
name = "${pname}-${version}";
- version = "4.3.1";
+ version = "4.6.0";
pname = "kdevelop";
src = fetchurl {
- url = "mirror://kde/stable/${pname}/${version}/src/${name}.tar.bz2";
- sha256 = "0015hv39rqhyq1w6jw65lx7ls4l5pc3a2asvd5zsd65831vrfxxs";
+ url = "mirror://kde/stable/${pname}/${version}/src/${name}.tar.xz";
+ sha256 = "1ee9e7b8c46f575dd29d920cfd6284130f2e738a2e1f52dfd97b075fab2e4c73";
};
- buildInputs = [ kdevplatform kdebase_workspace okteta ];
+ buildInputs = [ kdevplatform kdebase_workspace okteta qjson ];
nativeBuildInputs = [ cmake pkgconfig automoc4 shared_mime_info gettext perl ];
- patches =
- [ ( fetchurl {
- url = https://git.reviewboard.kde.org/r/105211/diff/raw/;
- name = "okteta-0.9.patch"; # fixes build with KDE-4.9.x
- sha256 = "1mvqhw7jr1vi66l3jgam3slyfafcvwy4g3iapfi69dpfnzhmcxl0";
- } )
- ];
-
NIX_CFLAGS_COMPILE = "-I${okteta}/include/KDE";
meta = with stdenv.lib; {
diff --git a/pkgs/applications/editors/netbeans/default.nix b/pkgs/applications/editors/netbeans/default.nix
index f1fd9adbe86a2684124eb7f9b0fa2dce7cd125d4..5a2afebdd5cf0a67f23b186fc8b96d31ef85416a 100644
--- a/pkgs/applications/editors/netbeans/default.nix
+++ b/pkgs/applications/editors/netbeans/default.nix
@@ -11,10 +11,10 @@ let
};
in
stdenv.mkDerivation {
- name = "netbeans-7.2";
+ name = "netbeans-7.4";
src = fetchurl {
- url = http://download.netbeans.org/netbeans/7.2/final/zip/netbeans-7.2-201207171143-ml.zip;
- sha256 = "18ya1w291hdnc35vb12yqnai82wmqm7351wn82fax12kzha5fmci";
+ url = http://download.netbeans.org/netbeans/7.4/final/zip/netbeans-7.4-201310111528.zip;
+ sha256 = "0nrnghnsdix5cmp86xi1gmvarhjk2k8mlbld3dfa9impm8gpv6mx";
};
buildCommand = ''
# Unpack and copy the stuff
@@ -25,7 +25,9 @@ stdenv.mkDerivation {
# Create a wrapper capable of starting it
mkdir -p $out/bin
makeWrapper $out/netbeans/bin/netbeans $out/bin/netbeans \
- --prefix PATH : ${jdk}/bin:${which}/bin
+ --prefix PATH : ${jdk}/bin:${which}/bin \
+ --prefix JAVA_HOME : ${jdk}/lib/openjdk \
+ --add-flags "--jdkhome ${jdk}/lib/openjdk"
# Create desktop item, so we can pick it from the KDE/GNOME menu
mkdir -p $out/share/applications
diff --git a/pkgs/applications/editors/scite/default.nix b/pkgs/applications/editors/scite/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..234ee1f065e43947fabf952b7670c2ccb22e3544
--- /dev/null
+++ b/pkgs/applications/editors/scite/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, gtk }:
+
+let
+ version = "3.3.7";
+
+ version_short = stdenv.lib.replaceChars [ "." ] [ "" ] "${version}";
+in stdenv.mkDerivation {
+ name = "scite-${version}";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/project/scintilla/SciTE/${version}/scite${version_short}.tgz";
+ sha256 = "0x7i6yxq50frsjkrp3lc5zy0d1ssq2n91igjn0dmqajpg7kls2dd";
+ };
+
+ buildInputs = [ pkgconfig gtk ];
+ sourceRoot = "scintilla/gtk";
+
+ buildPhase = ''
+ make
+ cd ../../scite/gtk
+ make prefix=$out/
+ '';
+
+ installPhase = ''
+ make install prefix=$out/
+ '';
+
+ meta = {
+ homepage = "http://www.scintilla.org/SciTE.html";
+ description = "SCIntilla based Text Editor";
+ license = stdenv.lib.licenses.mit;
+ platforms = stdenv.lib.platforms.linux;
+ maintainers = stdenv.lib.maintainers.rszibele;
+ };
+}
diff --git a/pkgs/applications/editors/sublime/default.nix b/pkgs/applications/editors/sublime/default.nix
index cfa44d9285cc327e5c10244ec7323977b5c03d32..c7867ce22af2702b3b7afaec7c779281b767eb28 100644
--- a/pkgs/applications/editors/sublime/default.nix
+++ b/pkgs/applications/editors/sublime/default.nix
@@ -24,6 +24,7 @@ stdenv.mkDerivation rec {
mkdir -p $out/bin
mv Sublime* $out/sublime
ln -s $out/sublime/sublime_text $out/bin/sublime
+ ln -s $out/sublime/sublime_text $out/bin/sublime2
echo ${libPath}
patchelf \
diff --git a/pkgs/applications/editors/sublime3/default.nix b/pkgs/applications/editors/sublime3/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3d9dec0d8f8a23c6b073fc3bc629440dfa40b5d6
--- /dev/null
+++ b/pkgs/applications/editors/sublime3/default.nix
@@ -0,0 +1,40 @@
+{ fetchurl, stdenv, glib, xlibs, cairo, gtk, pango}:
+let
+ libPath = stdenv.lib.makeLibraryPath [glib xlibs.libX11 gtk cairo pango];
+in
+assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";
+
+stdenv.mkDerivation rec {
+ name = "sublimetext3-3.0.59";
+ src =
+ if stdenv.system == "i686-linux" then
+ fetchurl {
+ name = "sublimetext-3.0.59.tar.bz2";
+ url = http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3059_x32.tar.bz2;
+ sha256 = "5ee7b42b5db057108e97b86fd408124fc3f7b56662b2851f59d91f8f0c288088";
+ }
+ else
+ fetchurl {
+ name = "sublimetext-3.0.59.tar.bz2";
+ url = http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3059_x64.tar.bz2;
+ sha256 = "da3039687664d33a734cea0151b2291ece9c7f35e5b73df5b2b5eac28a20b972";
+ };
+ buildCommand = ''
+ tar xvf ${src}
+ mkdir -p $out/bin
+ mv sublime_text_3 $out/sublime
+ ln -s $out/sublime/sublime_text $out/bin/sublime
+ ln -s $out/sublime/sublime_text $out/bin/sublime3
+
+ echo ${libPath}
+ patchelf \
+ --interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
+ --set-rpath ${libPath}:${stdenv.gcc.gcc}/lib${stdenv.lib.optionalString stdenv.is64bit "64"} \
+ $out/sublime/sublime_text
+ '';
+
+ meta = {
+ description = "Sophisticated text editor for code, markup and prose";
+ license = "unfree";
+ };
+}
diff --git a/pkgs/applications/editors/vim/default.nix b/pkgs/applications/editors/vim/default.nix
index 7dd4a0519ce4cd08ecec32f59fa3fe19d6f8e9b5..67317490412989d4210582bb1bbd8b3f0fb60f62 100644
--- a/pkgs/applications/editors/vim/default.nix
+++ b/pkgs/applications/editors/vim/default.nix
@@ -1,8 +1,10 @@
{ stdenv, fetchhg, ncurses, gettext, pkgconfig }:
stdenv.mkDerivation rec {
- name = "vim-7.4.131";
-
+ name = "vim-${version}";
+
+ version = "7.4.131";
+
src = fetchhg {
url = "https://vim.googlecode.com/hg/";
tag = "v7-4-131";
@@ -10,7 +12,7 @@ stdenv.mkDerivation rec {
};
enableParallelBuilding = true;
-
+
buildInputs = [ ncurses pkgconfig ];
nativeBuildInputs = [ gettext ];
diff --git a/pkgs/applications/editors/vim/ft-nix-support.patch b/pkgs/applications/editors/vim/ft-nix-support.patch
index 0e73162d33ef930d2d02f64c365623f4ab96d1cb..ed508784813cbe0d08509203e22855dce754482c 100644
--- a/pkgs/applications/editors/vim/ft-nix-support.patch
+++ b/pkgs/applications/editors/vim/ft-nix-support.patch
@@ -23,7 +23,7 @@ new file mode 100644
index 0000000..a2f9918
--- /dev/null
+++ b/runtime/syntax/nix.vim
-@@ -0,0 +1,40 @@
+@@ -0,0 +1,47 @@
+" Vim syntax file
+" Language: nix
+" Maintainer: Marc Weber
@@ -46,8 +46,8 @@ index 0000000..a2f9918
+ \ __readFile __toXML __toFile __filterSource __attrNames __getAttr __hasAttr __isAttrs __listToAttrs __isList
+ \ __head __tail __add __sub __lessThan __substring __stringLength
+
-+syn match nixAttr "\w\+\ze\s*="
-+syn match nixFuncArg "\zs\w\+\ze\s*:"
++syn match nixAttr "[a-zA-Z0-9-_]\+\ze\s*="
++syn match nixFuncArg "\zs[a-zA-Z0-9-_]\+\ze\s*:"
+syn region nixStringParam start=+\${+ end=+}+
+syn region nixMultiLineComment start=+/\*+ skip=+\\"+ end=+\*/+
+syn match nixEndOfLineComment "#.*$"
@@ -66,3 +66,10 @@ index 0000000..a2f9918
+hi def link nixEndOfLineComment Comment
+hi def link nixAttr Identifier
+hi def link nixFuncArg Identifier
++
++let b:current_syntax = "nix"
++
++" scan backwards to find begining of multiline statements
++syn sync ccomment nixMultiLineComment minlines=10 maxlines=500
++syn sync ccomment nixStringIndented minlines=10 maxlines=500
++syn sync ccomment nixString maxlines=10
diff --git a/pkgs/applications/editors/vim/wrapper.nix b/pkgs/applications/editors/vim/wrapper.nix
new file mode 100644
index 0000000000000000000000000000000000000000..72e8680505372bd0ba5309818930be66f2532b35
--- /dev/null
+++ b/pkgs/applications/editors/vim/wrapper.nix
@@ -0,0 +1,32 @@
+{ stdenv, makeWrapper, writeText, vim, vimrc }:
+
+let
+
+ vimrcfile = writeText "vimrc" vimrc;
+
+ p = builtins.parseDrvName vim.name;
+
+in stdenv.mkDerivation rec {
+ name = "${p.name}-with-vimrc-${p.version}";
+
+ buildInputs = [ makeWrapper vim vimrcfile ];
+
+ phases = [ "installPhase" ];
+
+ installPhase = ''
+ mkdir -p $out
+ cp -r ${vim}/* $out/
+
+ chmod u+w $out/bin
+ chmod u+w $out/share/vim
+
+ ln -s ${vimrcfile} $out/share/vim/vimrc
+ wrapProgram $out/bin/vim --set VIM "$out/share/vim"
+ '';
+
+ meta = with stdenv.lib; {
+ description = "The most popular clone of the VI editor";
+ homepage = http://www.vim.org;
+ platforms = platforms.unix;
+ };
+}
diff --git a/pkgs/applications/editors/yi/yi-contrib.nix b/pkgs/applications/editors/yi/yi-contrib.nix
index e2fadcca345d247b48b02e3cb1a02cc44ca4607c..c7d3f094016407a295d1c54049f605a15fc7cda4 100644
--- a/pkgs/applications/editors/yi/yi-contrib.nix
+++ b/pkgs/applications/editors/yi/yi-contrib.nix
@@ -1,10 +1,12 @@
-{ cabal, dataAccessor, filepath, mtl, split, yi }:
+{ cabal, filepath, lens, mtl, split, time, transformersBase, yi }:
cabal.mkDerivation (self: {
pname = "yi-contrib";
- version = "0.7.0";
- sha256 = "12x9ps5yrszr8dlj15kmsm9myq3gzd9x9nacvl3x6cq91wk53mzj";
- buildDepends = [ dataAccessor filepath mtl split yi ];
+ version = "0.8.1";
+ sha256 = "0jsbga30x302mr708vj5y7cpc961vh85dshpq2zlrf44dh0kmpvf";
+ buildDepends = [
+ filepath lens mtl split time transformersBase yi
+ ];
meta = {
homepage = "http://haskell.org/haskellwiki/Yi";
description = "Add-ons to Yi, the Haskell-Scriptable Editor";
diff --git a/pkgs/applications/editors/yi/yi.nix b/pkgs/applications/editors/yi/yi.nix
index 4dfc60bef7694abba545e07381b3b976be566341..96e4a06965c106a1a9c457e17c27a8e2a695726b 100644
--- a/pkgs/applications/editors/yi/yi.nix
+++ b/pkgs/applications/editors/yi/yi.nix
@@ -1,32 +1,30 @@
{ cabal, alex, binary, Cabal, cautiousFile, concreteTyperep
-, dataAccessor, dataAccessorMtl, dataAccessorTemplate, derive, Diff
-, dlist, dyre, filepath, fingertree, ghcPaths, glib, gtk, hashable
-, hint, HUnit, mtl, pango, parsec, pointedlist, pureMD5, QuickCheck
-, random, regexBase, regexTdfa, split, testFramework
-, testFrameworkHunit, time, uniplate, unixCompat
-, unorderedContainers, utf8String, vty, xdgBasedir
+, dataDefault, derive, Diff, dlist, dyre, filepath, fingertree
+, glib, gtk, hashable, hint, HUnit, lens, mtl, pango, parsec
+, pointedlist, QuickCheck, random, regexBase, regexTdfa, safe
+, split, tasty, tastyHunit, tastyQuickcheck, time, transformersBase
+, uniplate, unixCompat, unorderedContainers, utf8String, vty
+, xdgBasedir
}:
cabal.mkDerivation (self: {
pname = "yi";
- version = "0.7.0";
- sha256 = "0mzcjgp12k5mxb37r6chxsk726b1qxds49ch656bpgrg7n22w2j1";
+ version = "0.8.1";
+ sha256 = "1hyqlydc0na9pkb3fkbp13c6vnp4f80z8237bvrv12wkk5syyn23";
isLibrary = true;
isExecutable = true;
buildDepends = [
- binary Cabal cautiousFile concreteTyperep dataAccessor
- dataAccessorMtl dataAccessorTemplate derive Diff dlist dyre
- filepath fingertree ghcPaths glib gtk hashable hint mtl pango
- parsec pointedlist pureMD5 QuickCheck random regexBase regexTdfa
- split time uniplate unixCompat unorderedContainers utf8String vty
- xdgBasedir
+ binary Cabal cautiousFile concreteTyperep dataDefault derive Diff
+ dlist dyre filepath fingertree glib gtk hashable hint lens mtl
+ pango parsec pointedlist QuickCheck random regexBase regexTdfa safe
+ split time transformersBase uniplate unixCompat unorderedContainers
+ utf8String vty xdgBasedir
];
testDepends = [
- filepath HUnit QuickCheck testFramework testFrameworkHunit
+ filepath HUnit QuickCheck tasty tastyHunit tastyQuickcheck
];
buildTools = [ alex ];
configureFlags = "-fpango";
- jailbreak = true;
doCheck = false;
meta = {
homepage = "http://haskell.org/haskellwiki/Yi";
diff --git a/pkgs/applications/graphics/ImageMagick/default.nix b/pkgs/applications/graphics/ImageMagick/default.nix
index 66a7f334dbdd468931ebc21e33018debb1d6fe7e..64b1f5b3b2c1be04c7dfcb3da77413752cc6b30a 100644
--- a/pkgs/applications/graphics/ImageMagick/default.nix
+++ b/pkgs/applications/graphics/ImageMagick/default.nix
@@ -18,14 +18,14 @@
}:
let
- version = "6.8.7-6";
+ version = "6.8.9-0";
in
stdenv.mkDerivation rec {
name = "ImageMagick-${version}";
src = fetchurl {
url = "mirror://imagemagick/${name}.tar.xz";
- sha256 = "0cbfhk184kxdxz5czyyqxac29mbfiahygjji6k97z6hp8ngnqlvh";
+ sha256 = "1lapn2798fkc2wn81slpms5p21kq4dsyg45khsk7n8p69cvrmw2b";
};
enableParallelBuilding = true;
diff --git a/pkgs/applications/graphics/darktable/default.nix b/pkgs/applications/graphics/darktable/default.nix
index 766696265812f19e70e85ea296397ecf02d82a0d..d4983ca04d83448c0b2a4cb6fe7072536b2f07ca 100644
--- a/pkgs/applications/graphics/darktable/default.nix
+++ b/pkgs/applications/graphics/darktable/default.nix
@@ -9,12 +9,12 @@
assert stdenv ? glibc;
stdenv.mkDerivation rec {
- version = "1.2.3";
+ version = "1.4.1";
name = "darktable-${version}";
src = fetchurl {
url = "mirror://sourceforge/darktable/darktable/1.2/darktable-${version}.tar.xz";
- sha256 = "05kkkz13a5rhb246rq1nxv7h91pcvm15filvik8n8gn143h64sv8";
+ sha256 = "1pkixhiyyjx5wx4dlkvabga9glcx374f1ic2kxmzzdprfm6kkqfd";
};
buildInputs =
diff --git a/pkgs/applications/graphics/feh/default.nix b/pkgs/applications/graphics/feh/default.nix
index 0cd3402796659f43fd62308a713dbb5488aab820..4f52e6dec0fd9cff75e99e6effd0ba29c683370d 100644
--- a/pkgs/applications/graphics/feh/default.nix
+++ b/pkgs/applications/graphics/feh/default.nix
@@ -1,20 +1,24 @@
-{ stdenv, fetchurl, x11, imlib2, libjpeg, libpng, giblib
+{ stdenv, makeWrapper, fetchurl, x11, imlib2, libjpeg, libpng, giblib
, libXinerama, curl }:
stdenv.mkDerivation rec {
- name = "feh-2.8";
+ name = "feh-2.10";
src = fetchurl {
url = "http://feh.finalrewind.org/${name}.tar.bz2";
- sha256 = "0zmslchnzvi9ydxj2mgci4x8zpv5mdfkf7kyny3nibbpajibqmrx";
+ sha256 = "10ya8j0mxlni08qli3gdkyjhy54g4d2q2kc0hhragmzd9s42ly5w";
};
- buildInputs = [x11 imlib2 giblib libjpeg libpng libXinerama curl ];
+ buildInputs = [makeWrapper x11 imlib2 giblib libjpeg libpng libXinerama curl ];
preBuild = ''
makeFlags="PREFIX=$out"
'';
+ postInstall = ''
+ wrapProgram "$out/bin/feh" --prefix PATH : "${libjpeg}/bin"
+ '';
+
meta = {
description = "A light-weight image viewer";
homepage = https://derf.homelinux.org/projects/feh/;
diff --git a/pkgs/applications/graphics/freecad/cmake.patch b/pkgs/applications/graphics/freecad/cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..62efaf1e29dc97128be5cd47ea8d8b82f560c638
--- /dev/null
+++ b/pkgs/applications/graphics/freecad/cmake.patch
@@ -0,0 +1,32 @@
+diff -urN freecad-0.13.1830.old/cMake/FreeCadMacros.cmake freecad-0.13.1830/cMake/FreeCadMacros.cmake
+--- freecad-0.13.1830.old/cMake/FreeCadMacros.cmake 2013-02-02 18:09:17.000000000 +0100
++++ freecad-0.13.1830/cMake/FreeCadMacros.cmake 2014-04-20 10:52:17.293599913 +0200
+@@ -201,7 +201,7 @@
+ #endmacro(fc_add_resources)
+
+ MACRO (fc_add_resources outfiles )
+- QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN})
++ QT4_EXTRACT_OPTIONS(rcc_files rcc_options rcc_target ${ARGN})
+
+ FOREACH (it ${rcc_files})
+ GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE)
+diff -urN freecad-0.13.1830.old/CMakeLists.txt freecad-0.13.1830/CMakeLists.txt
+--- freecad-0.13.1830.old/CMakeLists.txt 2013-02-02 18:09:17.000000000 +0100
++++ freecad-0.13.1830/CMakeLists.txt 2014-04-20 10:28:41.782536753 +0200
+@@ -314,14 +314,14 @@
+ macro(fc_wrap_cpp outfiles )
+ # get include dirs
+ QT4_GET_MOC_FLAGS(moc_flags)
+- QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
++ QT4_EXTRACT_OPTIONS(moc_files moc_options moc_target ${ARGN})
+ # fixes bug 0000585: bug with boost 1.48
+ SET(moc_options ${moc_options} -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)
+
+ foreach(it ${moc_files})
+ get_filename_component(it ${it} ABSOLUTE)
+ QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile)
+- QT4_CREATE_MOC_COMMAND(${it} ${outfile} "${moc_flags}" "${moc_options}")
++ QT4_CREATE_MOC_COMMAND(${it} ${outfile} "${moc_flags}" "${moc_options}" "")
+ set(${outfiles} ${${outfiles}} ${outfile})
+ add_file_dependencies(${it} ${outfile})
+ endforeach(it)
diff --git a/pkgs/applications/graphics/freecad/default.nix b/pkgs/applications/graphics/freecad/default.nix
index 37265c954e834783da7142d7968bb91cfbca68cd..770a7ee8212bd18f8679ab9f75d14cd8f8a26dc1 100644
--- a/pkgs/applications/graphics/freecad/default.nix
+++ b/pkgs/applications/graphics/freecad/default.nix
@@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
--set COIN_GL_NO_CURRENT_CONTEXT_CHECK 1
'';
- patches = [ ./pythonpath.patch ];
+ patches = [ ./pythonpath.patch ./cmake.patch ];
meta = {
homepage = http://free-cad.sourceforge.net/;
diff --git a/pkgs/applications/graphics/gimp/2.8.nix b/pkgs/applications/graphics/gimp/2.8.nix
index af7d9e3399b01f03bc69d7cb46ffdc48354ed10e..0f8d6d45f1286c0aa7749e944cad9ee7c01f449f 100644
--- a/pkgs/applications/graphics/gimp/2.8.nix
+++ b/pkgs/applications/graphics/gimp/2.8.nix
@@ -1,7 +1,7 @@
{ stdenv, fetchurl, pkgconfig, intltool, babl, gegl, gtk, glib, gdk_pixbuf
, pango, cairo, freetype, fontconfig, lcms, libpng, libjpeg, poppler, libtiff
, webkit, libmng, librsvg, libwmf, zlib, libzip, ghostscript, aalib, jasper
-, python, pygtk, libart_lgpl, libexif, gettext, xlibs }:
+, python, pygtk, libart_lgpl, libexif, gettext, xlibs, wrapPython }:
stdenv.mkDerivation rec {
name = "gimp-2.8.10";
@@ -16,8 +16,13 @@ stdenv.mkDerivation rec {
freetype fontconfig lcms libpng libjpeg poppler libtiff webkit
libmng librsvg libwmf zlib libzip ghostscript aalib jasper
python pygtk libart_lgpl libexif gettext xlibs.libXpm
+ wrapPython
];
+ pythonPath = [ pygtk ];
+
+ postInstall = ''wrapPythonPrograms'';
+
passthru = { inherit gtk; }; # probably its a good idea to use the same gtk in plugins ?
#configureFlags = [ "--disable-print" ];
@@ -29,5 +34,6 @@ stdenv.mkDerivation rec {
description = "The GNU Image Manipulation Program";
homepage = http://www.gimp.org/;
license = "GPL";
+ platforms = stdenv.lib.platforms.linux;
};
}
diff --git a/pkgs/applications/graphics/gimp/default.nix b/pkgs/applications/graphics/gimp/default.nix
deleted file mode 100644
index 33d52c6645bedd8888b93d8593bb1c8a2fbbd3b1..0000000000000000000000000000000000000000
--- a/pkgs/applications/graphics/gimp/default.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{ stdenv, fetchurl, pkgconfig, gtk, freetype
-, fontconfig, libart_lgpl, libtiff, libjpeg, libpng, libexif, zlib, perl
-, perlXMLParser, python, pygtk, gettext, xlibs, intltool, babl_0_0_22, gegl_0_0_22
-}:
-
-stdenv.mkDerivation rec {
- name = "gimp-2.6.12";
-
- src = fetchurl {
- url = "ftp://ftp.gtk.org/pub/gimp/v2.6/${name}.tar.bz2";
- sha256 = "0qpcgaa4pdqqhyyy8vjvzfflxgsrrs25zk79gixzlnbzq3qwjlym";
- };
-
- buildInputs = [
- pkgconfig gtk freetype fontconfig
- libart_lgpl libtiff libjpeg libpng libexif zlib perl
- perlXMLParser python pygtk gettext intltool babl_0_0_22 gegl_0_0_22
- ];
-
- passthru = { inherit gtk; }; # probably its a good idea to use the same gtk in plugins ?
-
- configureFlags = [ "--disable-print" ];
-
- # "screenshot" needs this.
- NIX_LDFLAGS = "-rpath ${xlibs.libX11}/lib";
-
- meta = {
- description = "The GNU Image Manipulation Program";
- homepage = http://www.gimp.org/;
- license = "GPL";
- };
-}
diff --git a/pkgs/applications/graphics/hoodle/default.nix b/pkgs/applications/graphics/hoodle/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e553875f756cdfdb050ef65f177bfcf0a6ec5823
--- /dev/null
+++ b/pkgs/applications/graphics/hoodle/default.nix
@@ -0,0 +1,20 @@
+{ cabal, cmdargs, configurator, dyre, filepath, hoodleCore, mtl }:
+
+cabal.mkDerivation (self: {
+ pname = "hoodle";
+ version = "0.2.2.1";
+ sha256 = "1qkyyzfmprhniwarnq6cdmv1r6605b3h2lsc1rlalxhq6jh5gamd";
+ isLibrary = true;
+ isExecutable = true;
+ buildDepends = [
+ cmdargs configurator dyre filepath hoodleCore mtl
+ ];
+ jailbreak = true;
+ meta = {
+ homepage = "http://ianwookim.org/hoodle";
+ description = "Executable for hoodle";
+ license = self.stdenv.lib.licenses.gpl3;
+ platforms = self.ghc.meta.platforms;
+ maintainers = [ self.stdenv.lib.maintainers.ianwookim ];
+ };
+})
diff --git a/pkgs/applications/graphics/inkscape/default.nix b/pkgs/applications/graphics/inkscape/default.nix
index 37905f8a73f6e128b3b9a9c80448dbcb8241a899..478a0ff7e50cd4d280b262100b77c7c6cbd28ab2 100644
--- a/pkgs/applications/graphics/inkscape/default.nix
+++ b/pkgs/applications/graphics/inkscape/default.nix
@@ -13,6 +13,10 @@ stdenv.mkDerivation rec {
patches = [ ./configure-python-libs.patch ];
+ postPatch = ''
+ patch -p0 < ${./spuriouscomma.patch}
+ '';
+
propagatedBuildInputs = [
# Python is used at run-time to execute scripts, e.g., those from
# the "Effects" menu.
diff --git a/pkgs/applications/graphics/inkscape/libpng-1.5.patch b/pkgs/applications/graphics/inkscape/libpng-1.5.patch
deleted file mode 100644
index 4c8a7ee5f9b67601e80efb79ae3fd98e2d6b2ead..0000000000000000000000000000000000000000
--- a/pkgs/applications/graphics/inkscape/libpng-1.5.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-Source: upstream revisions 10061 and 10707
-
---- a/src/sp-image.cpp 2011-02-21 07:59:34 +0000
-+++ b/src/sp-image.cpp 2011-02-21 08:57:28 +0000
-@@ -387,9 +387,13 @@
-
- #if defined(PNG_iCCP_SUPPORTED)
- {
-- char* name = 0;
-+ png_charp name = 0;
- int compression_type = 0;
-- char* profile = 0;
-+#if (PNG_LIBPNG_VER < 10500)
-+ png_charp profile = 0;
-+#else
-+ png_bytep profile = 0;
-+#endif
- png_uint_32 proflen = 0;
- if ( png_get_iCCP(pngPtr, infoPtr, &name, &compression_type, &profile, &proflen) ) {
- // g_message("Found an iCCP chunk named [%s] with %d bytes and comp %d", name, proflen, compression_type);
-
---- a/src/extension/internal/pdfinput/svg-builder.cpp 2011-10-27 04:55:51 +0000
-+++ b/src/extension/internal/pdfinput/svg-builder.cpp 2011-10-29 20:34:00 +0000
-@@ -1481,7 +1481,7 @@
- return NULL;
- }
- // Set error handler
-- if (setjmp(png_ptr->jmpbuf)) {
-+ if (setjmp(png_jmpbuf(png_ptr))) {
- png_destroy_write_struct(&png_ptr, &info_ptr);
- return NULL;
- }
-
---- a/src/helper/png-write.cpp 2011-08-07 10:53:12 +0000
-+++ b/src/helper/png-write.cpp 2011-10-29 20:34:00 +0000
-@@ -166,8 +166,8 @@
- /* Set error handling. REQUIRED if you aren't supplying your own
- * error hadnling functions in the png_create_write_struct() call.
- */
-- if (setjmp(png_ptr->jmpbuf)) {
-- /* If we get here, we had a problem reading the file */
-+ if (setjmp(png_jmpbuf(png_ptr))) {
-+ // If we get here, we had a problem reading the file
- fclose(fp);
- png_destroy_write_struct(&png_ptr, &info_ptr);
- return false;
-
diff --git a/pkgs/applications/graphics/inkscape/spuriouscomma.patch b/pkgs/applications/graphics/inkscape/spuriouscomma.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bc538068f9e3dec56d6ae9e4fa35ed51c9f7e7d0
--- /dev/null
+++ b/pkgs/applications/graphics/inkscape/spuriouscomma.patch
@@ -0,0 +1,11 @@
+--- src/widgets/desktop-widget.h~ 2011-07-08 13:25:09.000000000 -0500
++++ src/widgets/desktop-widget.h 2013-02-15 16:04:45.806910365 -0600
+@@ -239,7 +239,7 @@
+ private:
+ GtkWidget *tool_toolbox;
+ GtkWidget *aux_toolbox;
+- GtkWidget *commands_toolbox,;
++ GtkWidget *commands_toolbox;
+ GtkWidget *snap_toolbox;
+
+ static void init(SPDesktopWidget *widget);
diff --git a/pkgs/applications/graphics/k3d/default.nix b/pkgs/applications/graphics/k3d/default.nix
index 8920d243dbf0b793dab04d622b08c8bd934d4b1f..9f31d94ac7fb2977ad407c4f654120addab2f5c3 100644
--- a/pkgs/applications/graphics/k3d/default.nix
+++ b/pkgs/applications/graphics/k3d/default.nix
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
preConfigure = ''
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/build/lib"
- export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I$(echo ${gtkglext}/include/gtkglext-*) -I$(echo ${gtkglext}/lib/gtkglext-*/include)"
+ export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -fpermissive -I$(echo ${gtkglext}/include/gtkglext-*) -I$(echo ${gtkglext}/lib/gtkglext-*/include)"
'';
buildInputs = [
diff --git a/pkgs/applications/graphics/mirage/default.nix b/pkgs/applications/graphics/mirage/default.nix
index cd5388c1b88ffbf106f9e4c406729cd3f130db08..67b91fd685709b0e0ab21fcf8b9e0a8dffd47b11 100644
--- a/pkgs/applications/graphics/mirage/default.nix
+++ b/pkgs/applications/graphics/mirage/default.nix
@@ -9,10 +9,6 @@ buildPythonPackage rec {
sha256 = "d214a1b6d99d1d1e83da5848a2cef181f6781e0990e93f7ebff5880b0c43f43c";
};
- postInstall = ''
- mv $out/lib/${python.libPrefix}/site-packages/*.egg/share $out
- '';
-
doCheck = false;
buildInputs = [ stdenv libX11 gettext ];
diff --git a/pkgs/applications/graphics/openimageio/default.nix b/pkgs/applications/graphics/openimageio/default.nix
index 8748c808dc077c2d2a72e6afcfbf427d940e797e..f63f41a8ed105f97a38e59f8ad629de926f48463 100644
--- a/pkgs/applications/graphics/openimageio/default.nix
+++ b/pkgs/applications/graphics/openimageio/default.nix
@@ -4,11 +4,11 @@
stdenv.mkDerivation rec {
name = "oiio-${version}";
- version = "1.1.12";
+ version = "1.3.12";
src = fetchurl {
url = "https://github.com/OpenImageIO/oiio/archive/Release-${version}.zip";
- sha256 = "0v84xna2vp83njxbizlxnindcp2i67xd89kgl9nic1hz6ywlylz6";
+ sha256 = "114jx4pcqhzdchzpxbwrfzqmnxr2bm8cw13g4akz1hg8pvr1dhsb";
};
buildInputs = [
diff --git a/pkgs/applications/graphics/openscad/default.nix b/pkgs/applications/graphics/openscad/default.nix
index a1238fe3dcd961e37eab906d0f41c1e335670f1f..d831df5d7b660cf56047f30b1c0579a2b97b96ff 100644
--- a/pkgs/applications/graphics/openscad/default.nix
+++ b/pkgs/applications/graphics/openscad/default.nix
@@ -1,17 +1,19 @@
{ stdenv, fetchurl, qt4, bison, flex, eigen, boost, mesa, glew, opencsg, cgal
-, mpfr, gmp
+, mpfr, gmp, glib, pkgconfig
}:
stdenv.mkDerivation rec {
- version = "2013.06";
+ version = "2014.03";
name = "openscad-${version}";
src = fetchurl {
- url = "https://openscad.googlecode.com/files/${name}.src.tar.gz";
- sha256 = "01r013l8zyfkgmqn05axh3rlfsjwd6j403w5ffl7nby4i2spiw1f";
+ url = "http://files.openscad.org/${name}.src.tar.gz";
+ sha256 = "1hv1lmq1ayhlvrz5sqipg650xryq25a9k22ysdw0dsrwg9ixqpw6";
};
- buildInputs = [ qt4 bison flex eigen boost mesa glew opencsg cgal gmp mpfr ];
+ buildInputs = [
+ qt4 bison flex eigen boost mesa glew opencsg cgal mpfr gmp glib pkgconfig
+ ];
configurePhase = ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I$(echo ${eigen}/include/eigen*) "
diff --git a/pkgs/applications/graphics/photivo/default.nix b/pkgs/applications/graphics/photivo/default.nix
index 257ee681db6167ed4f6f55605c2d1bae2acd6183..61e3f666dca7845f40cee6fdc728212d12b41df0 100644
--- a/pkgs/applications/graphics/photivo/default.nix
+++ b/pkgs/applications/graphics/photivo/default.nix
@@ -2,15 +2,25 @@
lcms2, lensfun, pkgconfig, libjpeg, exiv2, liblqr1 }:
stdenv.mkDerivation rec {
- name = "photivo-2013-05-20";
+ name = "photivo-2014-01-25";
src = fetchhg {
url = "http://code.google.com/p/photivo/";
- tag = "6256ff175312";
- sha256 = "0pyvkijr7wwik21hdp1zwbbyqnhc07kf0m48ih1rws78fq3h86cc";
+ tag = "d687864489da";
+ sha256 = "0f6y18k7db2ci6xn664zcwm1g1k04sdv7gg1yd5jk41bndjb7z8h";
};
nativeBuildInputs = [ cmake pkgconfig ];
buildInputs = [ qt4 fftw graphicsmagick_q16 lcms2 lensfun libjpeg exiv2 liblqr1 ];
+ patchPhase = '' # kinda icky
+ sed -e '/("@INSTALL@")/d' \
+ -e s,@INSTALL@,$out/share/photivo, \
+ -i Sources/ptSettings.cpp
+ '';
+
+ meta = with stdenv.lib; {
+ platforms = platforms.linux;
+ maintainers = maintainers.mornfall;
+ };
}
diff --git a/pkgs/applications/graphics/sane/backends.nix b/pkgs/applications/graphics/sane/backends.nix
index 3b5077a14e2afdea59b76781a078e44208f6fbe5..3d95dcd81ee84a5f401b15f48dc884e1b8f195b7 100644
--- a/pkgs/applications/graphics/sane/backends.nix
+++ b/pkgs/applications/graphics/sane/backends.nix
@@ -12,7 +12,10 @@ stdenv.mkDerivation rec {
name = "sane-backends-${version}";
src = fetchurl {
- url = "https://alioth.debian.org/frs/download.php/file/3958/${name}.tar.gz";
+ urls = [
+ "http://pkgs.fedoraproject.org/repo/pkgs/sane-backends/sane-backends-1.0.24.tar.gz/1ca68e536cd7c1852322822f5f6ac3a4/${name}.tar.gz"
+ "https://alioth.debian.org/frs/download.php/file/3958/${name}.tar.gz"
+ ];
curlOpts = "--insecure";
sha256 = "0ba68m6bzni54axjk15i51rya7hfsdliwvqyan5msl7iaid0iir7";
};
diff --git a/pkgs/applications/graphics/shotwell/default.nix b/pkgs/applications/graphics/shotwell/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1953f951d1695d3dcf14a8059f7f2050e3ddcc88
--- /dev/null
+++ b/pkgs/applications/graphics/shotwell/default.nix
@@ -0,0 +1,62 @@
+{ fetchurl, stdenv, m4, glibc, gtk3, libexif, libgphoto2, libsoup, libxml2, vala, sqlite, webkit
+, pkgconfig, gnome3, gst_all_1, which, udev, libraw, glib, json_glib, gettext, desktop_file_utils
+, lcms2, gdk_pixbuf, librsvg, makeWrapper, gnome_doc_utils }:
+
+# for dependencies see http://www.yorba.org/projects/shotwell/install/
+
+let
+ rest = stdenv.mkDerivation rec {
+ name = "rest-0.7.12";
+
+ src = fetchurl {
+ url = "mirror://gnome/sources/rest/0.7/${name}.tar.xz";
+ sha256 = "0fmg7fq5fx0jg3ryk71kwdkspsvj42acxy9imk7vznkqj29a9zqn";
+ };
+
+ configureFlags = "--with-ca-certificates=/etc/ssl/certs/ca-bundle.crt";
+
+ buildInputs = [ pkgconfig glib libsoup ];
+ };
+in stdenv.mkDerivation rec {
+ version = "0.18.0";
+ name = "shotwell-${version}";
+
+ src = fetchurl {
+ url = "mirror://gnome/sources/shotwell/0.18/${name}.tar.xz";
+ sha256 = "0cq0zs13f3f4xyz46yvj4qfpm5nh4ypds7r53pkqm4a3n8ybf5v7";
+ };
+
+ NIX_CFLAGS_COMPILE = "-I${glib}/include/glib-2.0 -I${glib}/lib/glib-2.0/include";
+
+ configureFlags = [ "--disable-gsettings-convert-install" ];
+
+ preConfigure = ''
+ patchShebangs .
+ '';
+
+ postInstall = ''
+ mkdir -p $out/share/gsettings-schemas/$name
+ mv $out/share/glib-2.0 $out/share/gsettings-schemas/$name/
+ '';
+
+ preFixup = ''
+ wrapProgram "$out/bin/shotwell" \
+ --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
+ --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS:${gtk3}/share:$out/share:$GSETTINGS_SCHEMAS_PATH"
+ rm $out/share/icons/hicolor/icon-theme.cache
+ '';
+
+
+ buildInputs = [ m4 glibc gtk3 libexif libgphoto2 libsoup libxml2 vala sqlite webkit pkgconfig
+ gst_all_1.gstreamer gst_all_1.gst-plugins-base gnome3.libgee which udev gnome3.gexiv2
+ libraw rest json_glib gettext desktop_file_utils glib lcms2 gdk_pixbuf librsvg
+ makeWrapper gnome_doc_utils ];
+
+ meta = with stdenv.lib; {
+ description = "Popular photo organizer for the GNOME desktop";
+ homepage = http://www.yorba.org/projects/shotwell/;
+ license = licenses.lgpl21Plus;
+ maintainers = with maintainers; [iElectric];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/graphics/synfigstudio/default.nix b/pkgs/applications/graphics/synfigstudio/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..034a147b787465982c57640574ef979609b8dce5
--- /dev/null
+++ b/pkgs/applications/graphics/synfigstudio/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchurl, boost, cairo, gettext, glibmm, gtk, gtkmm
+, libsigcxx, libtool, libxmlxx, pango, pkgconfig, imagemagick
+, intltool
+}:
+
+let
+ version = "0.64.1";
+
+ ETL = stdenv.mkDerivation rec {
+ name = "ETL-0.04.17";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/synfig/${name}.tar.gz";
+ sha256 = "13kpiswgcpsif9fwcplqr0405aqavqn390cjnivkn3pxv0d2q8iy";
+ };
+ };
+
+ synfig = stdenv.mkDerivation rec {
+ name = "synfig-${version}";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/synfig/synfig-${version}.tar.gz";
+ sha256 = "1b4ksxnqbaq4rxlvasmrvk7z4jvjbsg4ns3cns2qcnz64dyvbgda";
+ };
+
+ patches = [ ./synfig-cstring.patch ];
+
+ buildInputs = [
+ ETL boost cairo gettext glibmm libsigcxx libtool libxmlxx pango
+ pkgconfig
+ ];
+
+ configureFlags = [ "--with-boost-libdir=${boost}/lib" ];
+ };
+in
+stdenv.mkDerivation rec {
+ name = "synfigstudio-${version}";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/synfig/${name}.tar.gz";
+ sha256 = "0nl6vpsn5dcjd5qhbrmd0j4mr3wddvymkg9414m77cdpz4l8b9v2";
+ };
+
+ buildInputs = [
+ ETL boost cairo gettext glibmm gtk gtkmm imagemagick intltool
+ intltool libsigcxx libtool libxmlxx pkgconfig synfig
+ ];
+
+ meta = with stdenv.lib; {
+ description = "A 2D animation program";
+ homepage = http://www.synfig.org;
+ license = licenses.gpl2Plus;
+ maintainers = [ maintainers.goibhniu ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/graphics/synfigstudio/synfig-cstring.patch b/pkgs/applications/graphics/synfigstudio/synfig-cstring.patch
new file mode 100644
index 0000000000000000000000000000000000000000..51eb7704216182de4eb6324aa3b311d6c798d003
--- /dev/null
+++ b/pkgs/applications/graphics/synfigstudio/synfig-cstring.patch
@@ -0,0 +1,12 @@
+http://www.synfig.org/issues/thebuggenie/synfig/issues/438
+--- a/src/modules/mod_png/trgt_png.cpp
++++ b/src/modules/mod_png/trgt_png.cpp
+@@ -39,6 +39,7 @@
+ #include
+ #include
+ #include
++#include
+
+ #endif
+
+
diff --git a/pkgs/applications/graphics/viewnior/default.nix b/pkgs/applications/graphics/viewnior/default.nix
index 99e1ec1c169bc97279d20df3e2a16a834c1ea1ed..aa09fb705f1c0edc36d754391c95edb9c10d9616 100644
--- a/pkgs/applications/graphics/viewnior/default.nix
+++ b/pkgs/applications/graphics/viewnior/default.nix
@@ -2,11 +2,11 @@
, intltool, gettext, shared_mime_info, glib, gdk_pixbuf, perl}:
stdenv.mkDerivation rec {
- name = "viewnior-1.3";
+ name = "viewnior-1.4";
src = fetchurl {
- url = "http://cloud.github.com/downloads/xsisqox/Viewnior/${name}.tar.gz";
- sha256 = "46c97c1a85361519b42fe008cfb8911e66f709f3a3a988c11047ab3726889f10";
+ url = "https://www.dropbox.com/s/zytq0suabesv933/${name}.tar.gz";
+ sha256 = "0vv1133phgfzm92md6bbccmcvfiqb4kz28z1572c0qj971yz457a";
};
buildInputs =
@@ -14,6 +14,10 @@ stdenv.mkDerivation rec {
shared_mime_info glib gdk_pixbuf perl
];
+ preFixup = ''
+ rm $out/share/icons/*/icon-theme.cache
+ '';
+
meta = {
description = "Viewnior is a fast and simple image viewer for GNU/Linux";
longDescription =
diff --git a/pkgs/applications/ike/default.nix b/pkgs/applications/ike/default.nix
index 7bba42152e8c217398435f739033380aee4cc9d5..1414310ebf339ee889ce06ad9f3030231aea70d6 100644
--- a/pkgs/applications/ike/default.nix
+++ b/pkgs/applications/ike/default.nix
@@ -31,7 +31,7 @@ stdenv.mkDerivation rec {
installPhase = ''
make install
for file in "$out"/bin/* "$out"/sbin/*; do
- wrapProgram $file --prefix LD_LIBRARY_PATH ":" "$out/lib:${openssl}/lib:${gcc.gcc}/lib:${libedit}/lib:${qt4}/lib"
+ wrapProgram $file --prefix LD_LIBRARY_PATH ":" "$out/lib:${openssl}/lib:${gcc.gcc}/lib:${stdenv.glibc}/lib::${gcc.gcc}/lib64:${stdenv.glibc}/lib64:${libedit}/lib:${qt4}/lib"
done
'';
@@ -40,6 +40,6 @@ stdenv.mkDerivation rec {
description = "IPsec Client for FreeBSD, NetBSD and many Linux based operating systems";
platforms = platforms.unix;
maintainers = [ maintainers.iElectric ];
- license = "sleepycat";
+ license = licenses.sleepycat;
};
}
diff --git a/pkgs/applications/misc/audio/sox/default.nix b/pkgs/applications/misc/audio/sox/default.nix
index 50aa92f8d293b7f18dd28d674ef199c6efda9b05..570699fb619e3384563b60a43aeccee3c08242d2 100644
--- a/pkgs/applications/misc/audio/sox/default.nix
+++ b/pkgs/applications/misc/audio/sox/default.nix
@@ -1,48 +1,31 @@
-{ composableDerivation, lib, fetchurl, alsaLib, libao, lame, libmad }:
-
-let inherit (composableDerivation) edf; in
-
-composableDerivation.composableDerivation {} {
- name = "sox-14.3.0";
+{ stdenv, fetchurl
+, enableAlsa ? true, alsaLib ? null
+, enableLibao ? true, libao ? null
+, enableLame ? false, lame ? null
+, enableLibmad ? true, libmad ? null
+, enableLibogg ? true, libogg ? null, libvorbis ? null
+}:
+let
+ inherit (stdenv.lib) optional optionals;
+in stdenv.mkDerivation rec {
+ name = "sox-14.4.1";
src = fetchurl {
- url = mirror://sourceforge/sox/sox-14.3.0.tar.gz;
- sha256 = "15r39dq9nlwrypm0vpxmbxyqqv0bd6284djbi1fdfrlkjhf43gws";
+ url = "mirror://sourceforge/sox/${name}.tar.gz";
+ sha256 = "16x8gykfjdhxg0kdxwzcwgwpm5caa08y2mx18siqsq0ywmpjr34s";
};
- flags =
- # are these options of interest? We'll see
- #--disable-fftw disable usage of FFTW
- #--enable-debug enable debugging
- #--disable-cpu-clip disable tricky cpu specific clipper
- edf { name = "alsa"; enable = { buildInputs = [alsaLib]; }; }
- // edf { name = "libao"; enable = { buildInputs = [libao]; }; }
- // edf { name = "oss"; }
- // edf { name = "sun_audio"; }
- // edf { name = "dl-lame"; enable.buildInputs = [ lame ]; } # use shared library
- // edf { name = "lame"; enable.buildInputs = [ lame ]; }
- // edf { name = "dl-mad"; enable.buildInputs = [ libmad ]; } # use shared library
- // edf { name = "mad"; enable.buildInputs =[ libmad ]; }
- ;
-
- cfg = {
- ossSupport = false;
- sun_audioSupport = false;
- } // lib.listToAttrs
- [ { name = "dl-lameSupport"; value = true; }
- { name = "dl-madSupport"; value = true; }
- ];
-
- configureFlags = ["-enable-dl-lame"];
-
- optionals = [ "libsndfile" "libogg" "flac" "ffmpeg" "libmad" "lame"
- /* "amr-wb" "amr-nb" */
- "libsamplerate" /* "ladspa" */ ];
+ buildInputs =
+ (optional enableAlsa alsaLib) ++
+ (optional enableLibao libao) ++
+ (optional enableLame lame) ++
+ (optional enableLibmad libmad) ++
+ (optionals enableLibogg [ libogg libvorbis ]);
meta = {
description = "Sample Rate Converter for audio";
homepage = http://www.mega-nerd.com/SRC/index.html;
- maintainers = [lib.maintainers.marcweber];
+ maintainers = [stdenv.lib.maintainers.marcweber stdenv.lib.maintainers.shlevy];
# you can choose one of the following licenses:
license = [
"GPL"
diff --git a/pkgs/applications/misc/bitcoin/default.nix b/pkgs/applications/misc/bitcoin/default.nix
index 9e20be0dcbcde1a3e44c146b0e6fc26939ddf1a4..118b56c55b0794937559b4db1b98288fc0cf7399 100644
--- a/pkgs/applications/misc/bitcoin/default.nix
+++ b/pkgs/applications/misc/bitcoin/default.nix
@@ -1,26 +1,39 @@
-{ fetchurl, stdenv, openssl, db4, boost, zlib, miniupnpc, qt4 }:
+{ fetchurl, stdenv, openssl, db48, boost, zlib, miniupnpc, qt4, utillinux
+, pkgconfig, protobuf, qrencode }:
stdenv.mkDerivation rec {
- version = "0.8.6";
+ version = "0.9.1";
name = "bitcoin-${version}";
src = fetchurl {
- url = "mirror://sourceforge/bitcoin/${name}-linux.tar.gz";
- sha256 = "036xx06gyrfh65rpdapff3viz1f38vzkj7lnhil6fc0s7pjmsjbk";
+ url = "https://bitcoin.org/bin/${version}/${name}-linux.tar.gz";
+ sha256 = "3fabc1c629007b465a278525883663d41a2ba62699f2773536a8bf59ca210425";
};
- buildInputs = [ openssl db4 boost zlib miniupnpc qt4 ];
+ # hexdump from utillinux is required for tests
+ buildInputs = [
+ openssl db48 boost zlib miniupnpc qt4 utillinux pkgconfig protobuf qrencode
+ ];
- configurePhase = ''
- cd src
- qmake
+ unpackPhase = ''
+ mkdir tmp-extract && (cd tmp-extract && tar xf $src)
+ tar xf tmp-extract/bitcoin*/src/bitcoin*.tar*
+ cd bitcoin*
'';
- installPhase = ''
- mkdir -p $out/bin
- cp bitcoin-qt $out/bin
+ configureFlags = [
+ "--with-boost=${boost}"
+ ];
+
+ preCheck = ''
+ # At least one test requires writing in $HOME
+ HOME=$TMPDIR
'';
+ doCheck = true;
+
+ enableParallelBuilding = true;
+
meta = {
description = "Bitcoin is a peer-to-peer currency";
longDescription= ''
diff --git a/pkgs/applications/misc/blender/default.nix b/pkgs/applications/misc/blender/default.nix
index 0951340ee94526dcaf3e36f9eb4e5a0246622f5a..2e9cf46bf864892811afecfe0515c74302cdddbb 100644
--- a/pkgs/applications/misc/blender/default.nix
+++ b/pkgs/applications/misc/blender/default.nix
@@ -5,11 +5,11 @@
}:
stdenv.mkDerivation rec {
- name = "blender-2.67";
+ name = "blender-2.70";
src = fetchurl {
url = "http://download.blender.org/source/${name}.tar.gz";
- sha256 = "066lwrm85455gs187bxr3jhqidc2f6f0791b4216jkagbszd9a8l";
+ sha256 = "0j73yfpavcrzg5v54kcha7sig6179g5ykrlhih8d288pnb5c7596";
};
buildInputs = [
@@ -35,11 +35,14 @@ stdenv.mkDerivation rec {
enableParallelBuilding = true;
- meta = {
+ meta = with stdenv.lib; {
description = "3D Creation/Animation/Publishing System";
homepage = http://www.blender.org;
# They comment two licenses: GPLv2 and Blender License, but they
# say: "We've decided to cancel the BL offering for an indefinite period."
- license = "GPLv2+";
+ license = licenses.gpl2Plus;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.goibhniu ];
+
};
}
diff --git a/pkgs/applications/misc/calibre/default.nix b/pkgs/applications/misc/calibre/default.nix
index 1e16e22c0fe6725e003ebecb7c855d2c8319a41d..c2d8e7979e45e067b92c793ff6c5a21e64af994d 100644
--- a/pkgs/applications/misc/calibre/default.nix
+++ b/pkgs/applications/misc/calibre/default.nix
@@ -4,11 +4,11 @@
}:
stdenv.mkDerivation rec {
- name = "calibre-1.17.0";
+ name = "calibre-1.31.0";
src = fetchurl {
url = "mirror://sourceforge/calibre/${name}.tar.xz";
- sha256 = "1g0kwfr0v4hgwik7hpajdvg1ganyi7hlq6wvq4r5218yvdq5mkzn";
+ sha256 = "1fl42y8ppw8s51v66dqsrg1ib28yi6z5779r9wfvdbl9v1clilfc";
};
inherit python;
diff --git a/pkgs/applications/misc/cgminer/default.nix b/pkgs/applications/misc/cgminer/default.nix
index 54650d395c2bd6eeeab150f6334be180133faa57..3247cb609fa6f7b365c21cb22da783014fbbce3b 100644
--- a/pkgs/applications/misc/cgminer/default.nix
+++ b/pkgs/applications/misc/cgminer/default.nix
@@ -1,5 +1,5 @@
-{ fetchgit, stdenv, pkgconfig, libtool, autoconf, automake,
- curl, ncurses, amdappsdk, amdadlsdk, xorg, jansson }:
+{ fetchgit, stdenv, pkgconfig, libtool, autoconf, automake
+, curl, ncurses, amdappsdk, amdadlsdk, xorg, jansson }:
stdenv.mkDerivation rec {
version = "3.7.2";
@@ -42,6 +42,7 @@ stdenv.mkDerivation rec {
homepage = "https://github.com/ckolivas/cgminer";
license = licenses.gpl3;
maintainers = [ maintainers.offline ];
- platforms = [ "i686-linux" "x86_64-linux" ];
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/misc/cura/default.nix b/pkgs/applications/misc/cura/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..937025c0840372b00575d8b20940e1d6c7d891ff
--- /dev/null
+++ b/pkgs/applications/misc/cura/default.nix
@@ -0,0 +1,71 @@
+{ stdenv, python27Packages, curaengine, makeDesktopItem, fetchgit }:
+let
+ py = python27Packages;
+in
+stdenv.mkDerivation rec {
+ name = "cura";
+
+ src = fetchgit {
+ url = "https://github.com/daid/Cura";
+ rev = "58414695269d60ca9b165e8cbc3424933ed79403";
+ sha256 = "1nxrrz8sjjx9i9cyvz15vay6yarnywp3vlk7qzr65sw88lzxgq23";
+ fetchSubmodules = false;
+ };
+
+ desktopItem = makeDesktopItem {
+ name = "Cura";
+ exec = "cura";
+ icon = "cura";
+ comment = "Cura";
+ desktopName = "Cura";
+ genericName = "3D printing host software";
+ categories = "GNOME;GTK;Utility;";
+ };
+
+ python_deps = [ py.pyopengl py.pyserial py.numpy py.wxPython30 py.power py.setuptools ];
+
+ pythonPath = python_deps;
+
+ propagatedBuildInputs = python_deps;
+
+ buildInputs = [ curaengine py.wrapPython ];
+
+ configurePhase = "";
+ buildPhase = "";
+
+ installPhase = ''
+ # Install Python code.
+ site_packages=$out/lib/python2.7/site-packages
+ mkdir -p $site_packages
+ cp -r Cura $site_packages/
+
+ # Install resources.
+ resources=$out/share/cura
+ mkdir -p $resources
+ cp -r resources/* $resources/
+ sed -i 's|os.path.join(os.path.dirname(__file__), "../../resources")|"'$resources'"|g' $site_packages/Cura/util/resources.py
+
+ # Install executable.
+ mkdir -p $out/bin
+ cp Cura/cura.py $out/bin/cura
+ chmod +x $out/bin/cura
+ sed -i 's|#!/usr/bin/python|#!/usr/bin/env python|' $out/bin/cura
+ wrapPythonPrograms
+
+ # Make it find CuraEngine.
+ echo "def getEngineFilename(): return '${curaengine}/bin/CuraEngine'" >> $site_packages/Cura/util/sliceEngine.py
+
+ # Install desktop item.
+ mkdir -p "$out"/share/applications
+ cp "$desktopItem"/share/applications/* "$out"/share/applications/
+ mkdir -p "$out"/share/icons
+ ln -s "$resources/images/c.png" "$out"/share/icons/cura.png
+ '';
+
+ meta = with stdenv.lib; {
+ description = "3D printing host software";
+ homepage = https://github.com/daid/Cura;
+ license = licenses.agpl3;
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/misc/curaengine/default.nix b/pkgs/applications/misc/curaengine/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..256d337f679e8337cb904123fb2eeefe692a8c57
--- /dev/null
+++ b/pkgs/applications/misc/curaengine/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchgit }:
+stdenv.mkDerivation {
+ name = "curaengine";
+
+ src = fetchgit {
+ url = "https://github.com/Ultimaker/CuraEngine";
+ rev = "62667ff2e7479b55d75e3d1dc9136242adf4a6a0";
+ sha256 = "0c68xmnq4c49vzg2cyqb375kc72rcnghj21wp3919w8sfwil00vr";
+ };
+
+ installPhase = ''
+ mkdir -p $out/bin
+ cp CuraEngine $out/bin/
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Engine for processing 3D models into 3D printing instructions";
+ homepage = https://github.com/Ultimaker/CuraEngine;
+ license = licenses.agpl3;
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/misc/electrum/default.nix b/pkgs/applications/misc/electrum/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c35a2c7ff821fc5bed4307ae80c4ef6c265e2354
--- /dev/null
+++ b/pkgs/applications/misc/electrum/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pythonPackages, slowaes, ecdsa, pyqt4 }:
+
+pythonPackages.buildPythonPackage rec {
+ name = "electrum-${version}";
+ version = "1.9.8";
+
+ src = fetchurl {
+ url = "https://download.electrum.org/Electrum-${version}.tar.gz";
+ sha256 = "8fc144a32013e4a747fea27fff981762a6b9e14cde9ffb405c4c721975d846ff";
+ };
+
+ buildInputs = [ slowaes ecdsa ];
+
+ propagatedBuildInputs = [
+ slowaes
+ ecdsa
+ pyqt4
+ ];
+
+ postPatch = ''
+ mkdir -p $out/share
+ sed -i 's@usr_share = .*@usr_share = os.getenv("out")+"/share"@' setup.py
+ '';
+
+ meta = {
+ description = "Bitcoin thin-wallet";
+ long-description = "Electrum is an easy to use Bitcoin client. It protects you from losing coins in a backup mistake or computer failure, because your wallet can be recovered from a secret phrase that you can write on paper or learn by heart. There is no waiting time when you start the client, because it does not download the Bitcoin blockchain.";
+ homepage = "https://electrum.org";
+ license = stdenv.lib.licenses.gpl3;
+ maintainers = [ "emery@vfemail.net" ];
+ };
+}
\ No newline at end of file
diff --git a/pkgs/applications/misc/freicoin/default.nix b/pkgs/applications/misc/freicoin/default.nix
index d5ed057f56b8b3a3e9533c0778f726261a56b028..33d8585bb2dd686babe13180123f051aab215425 100644
--- a/pkgs/applications/misc/freicoin/default.nix
+++ b/pkgs/applications/misc/freicoin/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv, db4, boost, gmp, mpfr, miniupnpc, qt4, unzip }:
+{ fetchurl, stdenv, db, boost, gmp, mpfr, miniupnpc, qt4, unzip }:
stdenv.mkDerivation rec {
version = "0.8.3-1";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
# I think that openssl and zlib are required, but come through other
# packages
- buildInputs = [ db4 boost gmp mpfr miniupnpc qt4 unzip ];
+ buildInputs = [ db boost gmp mpfr miniupnpc qt4 unzip ];
configurePhase = "qmake";
diff --git a/pkgs/applications/misc/girara/default.nix b/pkgs/applications/misc/girara/default.nix
index 7af8cbeccc63fdc3d394060a075dbfe7c20a4c29..4db4e4b109162ad595d6aa7e002ce8536c703db2 100644
--- a/pkgs/applications/misc/girara/default.nix
+++ b/pkgs/applications/misc/girara/default.nix
@@ -1,11 +1,11 @@
{ stdenv, fetchurl, pkgconfig, gtk, gettext }:
stdenv.mkDerivation rec {
- name = "girara-0.1.9";
+ name = "girara-0.2.0";
src = fetchurl {
url = "http://pwmt.org/projects/girara/download/${name}.tar.gz";
- sha256 = "1kd20dalnpy07hajv0rkmkbsym4bpfxh0gby7j2mvkvl5qr3vx70";
+ sha256 = "0k8p5sgazqw7r78ssqh8bm2hn98xjml5w76l9awa66yq0k5m8jyi";
};
buildInputs = [ pkgconfig gtk gettext ];
diff --git a/pkgs/applications/misc/gnome_terminator/default.nix b/pkgs/applications/misc/gnome_terminator/default.nix
deleted file mode 100644
index b394719611de397666d22ddae33c8822f1ebcea7..0000000000000000000000000000000000000000
--- a/pkgs/applications/misc/gnome_terminator/default.nix
+++ /dev/null
@@ -1,30 +0,0 @@
-{ stdenv, fetchurl, python, pygtk, vte, gettext, intltool, makeWrapper }:
-
-stdenv.mkDerivation rec {
- name = "gnome-terminator-0.96";
-
- src = fetchurl {
- url = "https://launchpad.net/terminator/trunk/0.96/+download/terminator_0.96.tar.gz";
- sha256 = "d708c783c36233fcafbd0139a91462478ae40f5cf696ef4acfcaf5891a843201";
- };
-
- buildInputs =
- [ python pygtk vte gettext intltool makeWrapper
- ];
-
- phases = "unpackPhase installPhase";
-
- installPhase = ''
- python setup.py --without-icon-cache install --prefix=$out
- for i in $(cd $out/bin && ls); do
- wrapProgram $out/bin/$i \
- --prefix PYTHONPATH : "$(toPythonPath $out):$PYTHONPATH"
- done
- '';
-
- meta = {
- description = "Gnome terminal emulator with support for tiling and tabs";
- homepage = http://www.tenshu.net/p/terminator.html;
- license = "GPLv2";
- };
-}
diff --git a/pkgs/applications/misc/gnuradio-osmosdr/default.nix b/pkgs/applications/misc/gnuradio-osmosdr/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..2e9d74c2441d6db1308a034ce0977be12b888b7e
--- /dev/null
+++ b/pkgs/applications/misc/gnuradio-osmosdr/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchgit, cmake, pkgconfig, boost, gnuradio, rtl-sdr, uhd
+, makeWrapper
+, pythonSupport ? true, python, swig
+}:
+
+assert pythonSupport -> python != null && swig != null;
+
+stdenv.mkDerivation rec {
+ name = "gnuradio-osmosdr-${version}";
+ version = "0.1.0";
+
+ src = fetchgit {
+ url = "git://git.osmocom.org/gr-osmosdr";
+ rev = "refs/tags/v${version}";
+ sha256 = "112zfvnr6fjvhdc06ihi2sb0dp441qy7jq8rvr81nbyv3r8jspj4";
+ };
+
+ buildInputs = [
+ cmake pkgconfig boost gnuradio rtl-sdr uhd makeWrapper
+ ] ++ stdenv.lib.optionals pythonSupport [ python swig ];
+
+ postInstall = ''
+ for prog in "$out"/bin/*; do
+ wrapProgram "$prog" --set PYTHONPATH $PYTHONPATH:$(toPythonPath "$out")
+ done
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Gnuradio block for OsmoSDR and rtl-sdr";
+ homepage = http://sdr.osmocom.org/trac/wiki/GrOsmoSDR;
+ license = licenses.gpl3Plus;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.bjornfor ];
+ };
+}
diff --git a/pkgs/applications/misc/gnuradio/default.nix b/pkgs/applications/misc/gnuradio/default.nix
index 08d2b29a92a86a4179234d065f84a65d062d40da..1a0dea586d0e7d8c0c086eee619339ca286ef527 100644
--- a/pkgs/applications/misc/gnuradio/default.nix
+++ b/pkgs/applications/misc/gnuradio/default.nix
@@ -23,11 +23,11 @@
stdenv.mkDerivation rec {
name = "gnuradio-${version}";
- version = "3.7.1";
+ version = "3.7.3";
src = fetchurl {
url = "http://gnuradio.org/releases/gnuradio/${name}.tar.gz";
- sha256 = "1kfni8vpgr6v9rdiz3zsmwc07qj6zka9x22z2y0y4rak2xnzdxz9";
+ sha256 = "0caj7dqppav53nhn0ima106hpsn0sakw57v1ihac9fk7ka0x2w8w";
};
buildInputs = [
@@ -51,9 +51,9 @@ stdenv.mkDerivation rec {
postInstall = ''
printf "backend : Qt4Agg\n" > "$out/share/gnuradio/matplotlibrc"
- for file in "$out"/bin/*; do
+ for file in "$out"/bin/* "$out"/share/gnuradio/examples/*/*.py; do
wrapProgram "$file" \
- --set PYTHONPATH $PYTHONPATH:$(toPythonPath "$out") \
+ --prefix PYTHONPATH : $PYTHONPATH:$(toPythonPath "$out") \
--set MATPLOTLIBRC "$out/share/gnuradio"
done
'';
diff --git a/pkgs/applications/misc/goldendict/default.nix b/pkgs/applications/misc/goldendict/default.nix
index f7b8a511bc66e05a03d7d926fae5c1005805bdae..717d0a012a2c892e17f853cd908d75e1847858f5 100644
--- a/pkgs/applications/misc/goldendict/default.nix
+++ b/pkgs/applications/misc/goldendict/default.nix
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
cd ${name}-src
tar xf ${src}
'';
- patches = [ ./goldendict-paths.diff ];
+ patches = [ ./goldendict-paths.diff ./gcc47.patch ];
patchFlags = "-p 0";
configurePhase = ''
qmake
diff --git a/pkgs/applications/misc/goldendict/gcc47.patch b/pkgs/applications/misc/goldendict/gcc47.patch
new file mode 100644
index 0000000000000000000000000000000000000000..311dad4f64876ddc48503e79ad16b6ba2878d969
--- /dev/null
+++ b/pkgs/applications/misc/goldendict/gcc47.patch
@@ -0,0 +1,40 @@
+From b00d081da20b9a6b257573c6b23a6bc640c4dab1 Mon Sep 17 00:00:00 2001
+From: Michael Palimaka
+Date: Fri, 20 Jul 2012 03:27:38 +1000
+Subject: [PATCH] Fix build with GCC 4.7 by adding missing includes.
+
+---
+ processwrapper.cc | 4 ++++
+ qtsingleapplication/src/qtlocalpeer.cpp | 1 +
+ 2 files changed, 5 insertions(+)
+
+diff --git processwrapper.cc processwrapper.cc
+index f7f3f19..86b985d 100644
+--- processwrapper.cc
++++ processwrapper.cc
+@@ -2,6 +2,10 @@
+
+ #include
+
++#if defined(Q_OS_UNIX)
++#include
++#endif
++
+ #ifdef Q_OS_WIN32
+
+ #include
+diff --git qtsingleapplication/src/qtlocalpeer.cpp qtsingleapplication/src/qtlocalpeer.cpp
+index 382d182..506c142 100644
+--- qtsingleapplication/src/qtlocalpeer.cpp
++++ qtsingleapplication/src/qtlocalpeer.cpp
+@@ -50,6 +50,7 @@ static PProcessIdToSessionId pProcessIdToSessionId = 0;
+ #endif
+ #if defined(Q_OS_UNIX)
+ #include
++#include
+ #endif
+
+ namespace QtLP_Private {
+--
+1.7.11.1
+
diff --git a/pkgs/applications/misc/gphoto2/default.nix b/pkgs/applications/misc/gphoto2/default.nix
index cba54bf8013c1a8714acbaf350daf918f0b5f614..7ff253fd4e8d5090d9f13e2283875a4bcaf8d4f5 100644
--- a/pkgs/applications/misc/gphoto2/default.nix
+++ b/pkgs/applications/misc/gphoto2/default.nix
@@ -3,11 +3,11 @@
}:
stdenv.mkDerivation rec {
- name = "gphoto2-2.5.2";
+ name = "gphoto2-2.5.3";
src = fetchurl {
url = "mirror://sourceforge/gphoto/${name}.tar.bz2";
- sha256 = "16c8k1cxfypg7v5h8xi87grclw7a5ayaamn548ys3zkj727r5fcf";
+ sha256 = "0i6qjyvgn3aaspiblmiwv51mfy92gm73xpbd3z41ki8mw7plg53i";
};
nativeBuildInputs = [ pkgconfig gettext ];
diff --git a/pkgs/applications/misc/gqrx/default.nix b/pkgs/applications/misc/gqrx/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a52081077509d5a1488e9f5a6f21c20585c4e326
--- /dev/null
+++ b/pkgs/applications/misc/gqrx/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, qt4, gnuradio, boost, gnuradio-osmosdr
+# drivers (optional):
+, rtl-sdr
+, pulseaudioSupport ? true, pulseaudio
+}:
+
+assert pulseaudioSupport -> pulseaudio != null;
+
+stdenv.mkDerivation rec {
+ name = "gqrx-${version}";
+ version = "2.2.0";
+
+ src = fetchurl {
+ url = "mirror://sourceforge/project/gqrx/${version}/${name}-src.tar.gz";
+ sha256 = "15ncx2shh43skph7sj3jvmkls9cbbbysld49c8xd23fhdsxanj9x";
+ };
+
+ buildInputs = [
+ qt4 gnuradio boost gnuradio-osmosdr rtl-sdr
+ ] ++ stdenv.lib.optionals pulseaudioSupport [ pulseaudio ];
+
+ configurePhase = ''qmake PREFIX="$out"'';
+
+ meta = with stdenv.lib; {
+ description = "Software defined radio (SDR) receiver";
+ longDescription = ''
+ Gqrx is a software defined radio receiver powered by GNU Radio and the Qt
+ GUI toolkit. It can process I/Q data from many types of input devices,
+ including Funcube Dongle Pro/Pro+, rtl-sdr, HackRF, and Universal
+ Software Radio Peripheral (USRP) devices.
+ '';
+ homepage = http://gqrx.dk/;
+ # Some of the code comes from the Cutesdr project, with a BSD license, but
+ # it's currently unknown which version of the BSD license that is.
+ license = licenses.gpl3Plus;
+ platforms = platforms.linux; # should work on Darwin / OS X too
+ maintainers = [ maintainers.bjornfor ];
+ };
+}
diff --git a/pkgs/applications/misc/ikiwiki/default.nix b/pkgs/applications/misc/ikiwiki/default.nix
index 6e5eece5d34de7f6d456e5a707b62f38e98fba39..b347f971ee0f724ac9fcccba33dd9940c3d107f8 100644
--- a/pkgs/applications/misc/ikiwiki/default.nix
+++ b/pkgs/applications/misc/ikiwiki/default.nix
@@ -23,7 +23,7 @@ assert mercurialSupport -> (mercurial != null);
let
name = "ikiwiki";
- version = "3.20140102";
+ version = "3.20140227";
lib = stdenv.lib;
in
@@ -32,7 +32,7 @@ stdenv.mkDerivation {
src = fetchurl {
url = "http://ftp.de.debian.org/debian/pool/main/i/ikiwiki/${name}_${version}.tar.gz";
- sha256 = "0nsyfq7j03cg4qq73kw7cxnc7wgbr2m75fqmmll77wyl9cb661lj";
+ sha256 = "1bbpqs4c1la1yqcxcxj3xip3wadjnjq0wawv19j6d6baymm66cr3";
};
buildInputs = [ perl TextMarkdown URI HTMLParser HTMLScrubber HTMLTemplate
diff --git a/pkgs/applications/misc/jigdo/default.nix b/pkgs/applications/misc/jigdo/default.nix
index 24edc0e128a7504b8ff3a98fa88439d0043f1d2d..fe4c0287fdd2b787c1ac96caeedf2577788a1bec 100644
--- a/pkgs/applications/misc/jigdo/default.nix
+++ b/pkgs/applications/misc/jigdo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, db4, gtk, bzip2 }:
+{ stdenv, fetchurl, db, gtk, bzip2 }:
stdenv.mkDerivation {
name = "jigdo-0.7.3";
@@ -14,7 +14,7 @@ stdenv.mkDerivation {
sha256 = "0jnlzm9m2hjlnw0zs2fv456ml5r2jj2q1lncqbrgg52lq18f6fa3";
};
- buildInputs = [ db4 gtk bzip2 ];
+ buildInputs = [ db gtk bzip2 ];
configureFlags = "--without-libdb";
diff --git a/pkgs/applications/misc/kde-wacomtablet/default.nix b/pkgs/applications/misc/kde-wacomtablet/default.nix
index 22587a1bae04ca3126bcce5e7096938330a1a81a..3e652c717ec43e9cfb57489d6ebbccd60ffac308 100644
--- a/pkgs/applications/misc/kde-wacomtablet/default.nix
+++ b/pkgs/applications/misc/kde-wacomtablet/default.nix
@@ -1,14 +1,14 @@
-{ stdenv, fetchurl, kdelibs, gettext }:
+{ stdenv, fetchurl, kdelibs, gettext, xf86_input_wacom }:
stdenv.mkDerivation rec {
- name = "wacomtablet-1.3.5";
+ name = "wacomtablet-2.0";
src = fetchurl {
- url = "http://kde-apps.org/CONTENT/content-files/114856-wacomtablet-v1.3.5.tar.bz2";
- sha256 = "0dgsp3izx2v44f6j8mhxc6zybjn5sj9038w6b4v2fgix47fri0ja";
+ url = "http://kde-apps.org/CONTENT/content-files/114856-wacomtablet-2.0.tar.bz2";
+ sha256 = "1vqdmkfl0awsjxl6p8bihz198hlc75d3zn7xwwryc674l76s25ax";
};
- buildInputs = [ kdelibs ];
+ buildInputs = [ kdelibs xf86_input_wacom ];
nativeBuildInputs = [ gettext ];
diff --git a/pkgs/applications/misc/keepassx/2.0.nix b/pkgs/applications/misc/keepassx/2.0.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1a79af7cb577d2372d959bcb03489814cfaa8799
--- /dev/null
+++ b/pkgs/applications/misc/keepassx/2.0.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, cmake, libgcrypt, qt4, xlibs, ... }:
+
+stdenv.mkDerivation {
+ name = "keepassx2-2.0alpha5";
+ src = fetchurl {
+ url = "https://github.com/keepassx/keepassx/archive/2.0-alpha5.tar.gz";
+ sha256 = "1vxj306zhrr38mvsy3vpjlg6d0xwlcvsi3l69nhhwzkccsc4smfm";
+ };
+
+ buildInputs = [ cmake libgcrypt qt4 xlibs.libXtst ];
+
+ meta = {
+ description = "Qt password manager compatible with its Win32 and Pocket PC versions";
+ homepage = http://www.keepassx.org/;
+ license = stdenv.lib.licenses.gpl2;
+ maintainers = with stdenv.lib.maintainers; [qknight];
+ platforms = with stdenv.lib.platforms; linux;
+ };
+}
diff --git a/pkgs/applications/misc/keepassx/default.nix b/pkgs/applications/misc/keepassx/default.nix
index 375a1ae2419a3c15d5ead43190a0a3d8f7434415..fc089f4fa5b7d3728f29572cd0e7f936d369a655 100644
--- a/pkgs/applications/misc/keepassx/default.nix
+++ b/pkgs/applications/misc/keepassx/default.nix
@@ -12,6 +12,8 @@ stdenv.mkDerivation rec {
qmake PREFIX=$out
'';
+ patches = [ ./random.patch ];
+
buildInputs = [ bzip2 qt4 libX11 xextproto libXtst ];
meta = {
diff --git a/pkgs/applications/misc/keepassx/random.patch b/pkgs/applications/misc/keepassx/random.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0a0b26f6e8c95e3cdcd714c19c6032c68c093e91
--- /dev/null
+++ b/pkgs/applications/misc/keepassx/random.patch
@@ -0,0 +1,13 @@
+--- a/src/lib/random.cpp 2014-01-21 21:15:55.829312723 +0000
++++ b/src/lib/random.cpp 2014-01-21 21:16:36.752535839 +0000
+@@ -28,6 +28,10 @@
+ #include
+ #include
+ #endif
++#ifndef Q_WS_WIN
++ #include
++ #include
++#endif
+
+ #include
+ #include
diff --git a/pkgs/applications/misc/krusader/default.nix b/pkgs/applications/misc/krusader/default.nix
index bd86501c30e24f3250f6c5e0362e9978d027c1d2..83c21da0e542fae2f5f26c0ed6f1a003e5960099 100644
--- a/pkgs/applications/misc/krusader/default.nix
+++ b/pkgs/applications/misc/krusader/default.nix
@@ -7,6 +7,7 @@ stdenv.mkDerivation rec {
sha256 = "1q1m4cjzz2m41pdpxnwrsiczc7990785b700lv64midjjgjnr7j6";
};
buildInputs = [ gettext kdelibs kde_baseapps ];
+ NIX_CFLAGS_COMPILE = "-fpermissive"; # fix build with newer gcc versions
meta = {
description = "Norton/Total Commander clone for KDE";
license = "GPL";
diff --git a/pkgs/applications/misc/librecad/2.0.nix b/pkgs/applications/misc/librecad/2.0.nix
index 2394d116314e16ee258ec4835a9d022def603c87..2f140db93973271e430524ddfb5be7d166344dbc 100644
--- a/pkgs/applications/misc/librecad/2.0.nix
+++ b/pkgs/applications/misc/librecad/2.0.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, qt4, muparser, which, boost}:
+{ stdenv, fetchurl, qt4, muparser, which, boost, pkgconfig }:
stdenv.mkDerivation {
- name = "librecad-2.0.0beta1";
+ name = "librecad-2.0.2";
src = fetchurl {
- url = https://github.com/LibreCAD/LibreCAD/tarball/2.0.0beta1;
- name = "librecad-2.0.0beta1.tar.gz";
- sha256 = "8bf969b79be115f3b3ff72cc030a4c21fe93164dd0cb19ddfb78a7d66b8bc770";
+ url = https://github.com/LibreCAD/LibreCAD/tarball/2.0.2;
+ name = "librecad-2.0.2.tar.gz";
+ sha256 = "0a5rs1h4n74d4bnrj91ij6y6wzc8d6nbrg9lfwjx8icjjl6hqikm";
};
patchPhase = ''
@@ -25,12 +25,14 @@ stdenv.mkDerivation {
'';
buildInputs = [ qt4 muparser which boost ];
+ nativeBuildInputs = [ pkgconfig ];
enableParallelBuilding = true;
meta = {
description = "A 2D CAD package based upon Qt";
homepage = http://librecad.org;
+ repositories.git = git://github.com/LibreCAD/LibreCAD.git;
license = "GPLv2";
maintainers = with stdenv.lib.maintainers; [viric];
platforms = with stdenv.lib.platforms; linux;
diff --git a/pkgs/applications/misc/librecad/default.nix b/pkgs/applications/misc/librecad/default.nix
index 59bd4888e4a6202f60d29babe71fccea5ef62e6d..b225519f4868c84084d38a75e3f1bde257738dcf 100644
--- a/pkgs/applications/misc/librecad/default.nix
+++ b/pkgs/applications/misc/librecad/default.nix
@@ -1,12 +1,12 @@
{ stdenv, fetchurl, qt4, muparser, which}:
stdenv.mkDerivation {
- name = "librecad-1.0.2";
+ name = "librecad-1.0.4";
src = fetchurl {
- url = https://github.com/LibreCAD/LibreCAD/tarball/v1.0.2;
- name = "librecad-1.0.2.tar.gz";
- sha256 = "13ee7e401e4f5fbc68c2e017b7189bec788038f4f6e77f559861ceb8cfb1907d";
+ url = https://github.com/LibreCAD/LibreCAD/tarball/v1.0.4;
+ name = "librecad-1.0.4.tar.gz";
+ sha256 = "00nzbijw7pn1zkj4256da501xcm6rkcvycpa79y6dr2p6c43yc6m";
};
patchPhase = ''
diff --git a/pkgs/applications/misc/lxappearance/default.nix b/pkgs/applications/misc/lxappearance/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9295eaabf3223462249a8310449a3adb700f3ada
--- /dev/null
+++ b/pkgs/applications/misc/lxappearance/default.nix
@@ -0,0 +1,17 @@
+{ stdenv, fetchurl, intltool, pkgconfig, libX11, gtk }:
+
+stdenv.mkDerivation rec {
+ name = "lxappearance-0.5.5";
+ src = fetchurl{
+ url = "http://downloads.sourceforge.net/project/lxde/LXAppearance/${name}.tar.xz";
+ sha256 = "8cae82e6425ba8a0267774e4d10096df2d91b0597520058331684a5ece068b4c";
+ };
+ buildInputs = [ intltool libX11 pkgconfig gtk ];
+ meta = {
+ description = "A lightweight program for configuring the theme and fonts of gtk applications";
+ maintainers = [ stdenv.lib.maintainers.hinton ];
+ platforms = stdenv.lib.platforms.all;
+ license = stdenv.lib.licenses.gpl2;
+ homepage = "http://lxappearance.sourceforce.net/";
+ };
+}
diff --git a/pkgs/applications/misc/lyx/default.nix b/pkgs/applications/misc/lyx/default.nix
index fd2e7c3ac42660c8f4f397adf9103e5c8bf73be2..1ea4f06c9273a757c4f5d16ba0ed301556aa2703 100644
--- a/pkgs/applications/misc/lyx/default.nix
+++ b/pkgs/applications/misc/lyx/default.nix
@@ -3,12 +3,12 @@
}:
stdenv.mkDerivation rec {
- version = "2.0.6";
+ version = "2.0.7";
name = "lyx-${version}";
src = fetchurl {
url = "ftp://ftp.lyx.org/pub/lyx/stable/2.0.x/${name}.tar.xz";
- sha256 = "1llah9d9ymvdk8asmqslcwnicycxrwb27k8si184n5bfxvnjpjx5";
+ sha256 = "0qp8xqmlafib4hispjgl1friln0w3s05mi20sjfzaxnl6jkvv5q5";
};
configureFlags = [
diff --git a/pkgs/applications/misc/merkaartor/default.nix b/pkgs/applications/misc/merkaartor/default.nix
index 6d10cbb8c21f6c33825ea18330fbe9378f10b024..e6636415b5ef39bae0fa7037222534ed1def10da 100644
--- a/pkgs/applications/misc/merkaartor/default.nix
+++ b/pkgs/applications/misc/merkaartor/default.nix
@@ -1,17 +1,17 @@
-{stdenv, fetchurl, qt4, boost}:
+{stdenv, fetchurl, qt4, boost, proj, gdal}:
stdenv.mkDerivation rec {
- name = "merkaartor-0.17.2";
+ name = "merkaartor-0.18.1";
src = fetchurl {
- url = "http://merkaartor.be/attachments/download/253/merkaartor-0.17.2.tar.bz2";
- sha256 = "0akhp9czzn39132mgj9h38nlh4l9ibzn3vh93bfs685zxyn4yps2";
+ url = "http://merkaartor.be/attachments/download/301/merkaartor-0.18.1.tar.bz2";
+ sha256 = "17qk45pmlxqigla1915dvn9pp91y85d2bkcaap4g3m8mk1crcsix";
};
configurePhase = ''
qmake -makefile PREFIX=$out
'';
- buildInputs = [ qt4 boost ];
+ buildInputs = [ qt4 boost proj gdal ];
meta = {
description = "An openstreetmap editor";
diff --git a/pkgs/applications/misc/mupdf/default.nix b/pkgs/applications/misc/mupdf/default.nix
index 17b86910de0721c8050ae6b792e9771ab0954b9d..ef7571f5d14f2bbf4af8e95fcf1368a089141f5f 100644
--- a/pkgs/applications/misc/mupdf/default.nix
+++ b/pkgs/applications/misc/mupdf/default.nix
@@ -8,6 +8,13 @@ stdenv.mkDerivation rec {
sha256 = "0y247nka5gkr1ajn47jrlp5rcnf6h4ff7dfsprma3h4wxqdv7a5b";
};
+ patches = [(fetchurl {
+ name = "CVE-2014-2013.patch";
+ url = "http://git.ghostscript.com/?p=mupdf.git;a=commitdiff_plain;"
+ + "h=60dabde18d7fe12b19da8b509bdfee9cc886aafc";
+ sha256 = "1walj3wir9x50i6lph33bx14c8593r9xrn08gkd3v7r6d15lmjps";
+ })];
+
buildInputs = [ pkgconfig zlib freetype libjpeg jbig2dec openjpeg libX11 libXext ];
enableParallelBuilding = true;
@@ -32,6 +39,7 @@ stdenv.mkDerivation rec {
meta = {
homepage = http://mupdf.com/;
+ repositories.git = git://git.ghostscript.com/mupdf.git;
description = "Lightweight PDF viewer and toolkit written in portable C";
license = "GPLv3+";
maintainers = with stdenv.lib.maintainers; [ viric ];
diff --git a/pkgs/applications/misc/nc-indicators/default.nix b/pkgs/applications/misc/nc-indicators/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a33cfbdf159ac708be75cc0d92fd036528f6e24c
--- /dev/null
+++ b/pkgs/applications/misc/nc-indicators/default.nix
@@ -0,0 +1,16 @@
+{ cabal, attoparsec, gtk, hflags, lens, pipes, stm }:
+
+cabal.mkDerivation (self: {
+ pname = "nc-indicators";
+ version = "0.1";
+ sha256 = "19amwfcbwfxcj0gr7w0vgxl427l43q3l2s3n3zsxhqwkfblxmfy5";
+ isLibrary = false;
+ isExecutable = true;
+ buildDepends = [ attoparsec gtk hflags lens pipes stm ];
+ meta = {
+ homepage = "https://github.com/nilcons/nc-indicators/issues";
+ description = "CPU load and memory usage indicators for i3bar";
+ license = self.stdenv.lib.licenses.asl20;
+ platforms = self.ghc.meta.platforms;
+ };
+})
diff --git a/pkgs/applications/misc/nut/default.nix b/pkgs/applications/misc/nut/default.nix
index 92cd0de8b3121c913bb48849c26f13e26e4ae764..3e972f672cc25a636f649480bcabe196e61988c6 100644
--- a/pkgs/applications/misc/nut/default.nix
+++ b/pkgs/applications/misc/nut/default.nix
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
"--without-powerman" # Until we have it ...
"--without-cgi"
"--without-hal"
- "--with-systemdsystemunitdir=$(out)/etc/systemd/systemd"
+ "--with-systemdsystemunitdir=$(out)/etc/systemd/system"
"--with-udev-dir=$(out)/etc/udev"
];
diff --git a/pkgs/applications/misc/pcmanfm/default.nix b/pkgs/applications/misc/pcmanfm/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f71800979619fddf5d3f52258cfcd6c60b9e5185
--- /dev/null
+++ b/pkgs/applications/misc/pcmanfm/default.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, glib, gtk, intltool, libfm, libX11, pango, pkgconfig }:
+
+stdenv.mkDerivation {
+ name = "pcmanfm-1.2.0";
+ src = fetchurl {
+ url = "mirror://sourceforge/pcmanfm/pcmanfm-1.2.0.tar.xz";
+ sha256 = "1cmskj7dpjgrrn89z7cc1h1nsmd6qq3bakf207ldrhrxxv3fxl2j";
+ };
+
+ buildInputs = [ glib gtk intltool libfm libX11 pango pkgconfig ];
+
+ meta = with stdenv.lib; {
+ homepage = "http://blog.lxde.org/?cat=28/";
+ license = licenses.gpl2Plus;
+ description = "File manager with GTK+ interface";
+ maintainers = [ maintainers.ttuegel ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/misc/printrun/default.nix b/pkgs/applications/misc/printrun/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..dc258d653280e8683ea37fde7903889fc722ed12
--- /dev/null
+++ b/pkgs/applications/misc/printrun/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, python27Packages, fetchgit }:
+let
+ py = python27Packages;
+in
+py.buildPythonPackage rec {
+ name = "printrun";
+
+ src = fetchgit {
+ url = "https://github.com/kliment/Printrun";
+ rev = "0a7f2335d0c02c3cc283200867b41f8b337b1387";
+ sha256 = "1zvh5ih89isv51sraljm29z9k00srrdnklwkyp27ymxzlbcwq6gv";
+ };
+
+ propagatedBuildInputs = [ py.wxPython py.pyserial py.dbus py.psutil ];
+
+ doCheck = false;
+
+ postPatch = ''
+ sed -i -r "s|/usr(/local)?/share/|$out/share/|g" printrun/utils.py
+ sed -i "s|distutils.core|setuptools|" setup.py
+ sed -i "s|distutils.command.install |setuptools.command.install |" setup.py
+ '';
+
+ postInstall = ''
+ for f in $out/share/applications/*.desktop; do
+ sed -i -e "s|/usr/|$out/|g" "$f"
+ done
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Pronterface, Pronsole, and Printcore - Pure Python 3d printing host software";
+ homepage = https://github.com/kliment/Printrun;
+ license = licenses.gpl3;
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/misc/pstree/default.nix b/pkgs/applications/misc/pstree/default.nix
index 0d61d3d74cfbb9236a9e9b5f3a2ec0010d10f0d1..d4ffe2a4afd7c2a8e2efbe9ad3c08ef057c8f0d1 100644
--- a/pkgs/applications/misc/pstree/default.nix
+++ b/pkgs/applications/misc/pstree/default.nix
@@ -16,5 +16,6 @@ stdenv.mkDerivation rec {
meta = {
description = "Show the set of running processes as a tree";
license = "GPL";
+ maintainers = stdenv.lib.maintainers.mornfall;
};
}
diff --git a/pkgs/applications/misc/redshift/default.nix b/pkgs/applications/misc/redshift/default.nix
index ae983aedc6790bc383abebbbf2713f7c381f79ce..88d6e7a7cf94a04c2ff70557f38b6484c2e00087 100644
--- a/pkgs/applications/misc/redshift/default.nix
+++ b/pkgs/applications/misc/redshift/default.nix
@@ -40,5 +40,6 @@ stdenv.mkDerivation rec {
license = "GPLv3+";
homepage = "http://jonls.dk/redshift";
platforms = platforms.linux;
+ maintainers = maintainers.mornfall;
};
}
diff --git a/pkgs/applications/misc/rtl-sdr/default.nix b/pkgs/applications/misc/rtl-sdr/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e6e762493883c99af5629ecc1e12321936caffa2
--- /dev/null
+++ b/pkgs/applications/misc/rtl-sdr/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchgit, cmake, pkgconfig, libusb1 }:
+
+stdenv.mkDerivation rec {
+ name = "rtl-sdr-${version}";
+ version = "0.5.3";
+
+ src = fetchgit {
+ url = "git://git.osmocom.org/rtl-sdr.git";
+ rev = "refs/tags/v${version}";
+ sha256 = "00r5d08r12zzkd0xggd7l7p4r2278rzdhqdaihwjlajmr9qd3hs1";
+ };
+
+ buildInputs = [ cmake pkgconfig libusb1 ];
+
+ # Building with -DINSTALL_UDEV_RULES=ON tries to install udev rules to
+ # /etc/udev/rules.d/, and there is no option to install elsewhere. So install
+ # rules manually.
+ postInstall = ''
+ mkdir -p "$out/etc/udev/rules.d/"
+ cp ../rtl-sdr.rules "$out/etc/udev/rules.d/99-rtl-sdr.rules"
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Turns your Realtek RTL2832 based DVB dongle into a SDR receiver";
+ homepage = http://sdr.osmocom.org/trac/wiki/rtl-sdr;
+ license = licenses.gpl2Plus;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.bjornfor ];
+ };
+}
diff --git a/pkgs/applications/misc/rxvt_unicode/default.nix b/pkgs/applications/misc/rxvt_unicode/default.nix
index 640ace40277d7bc42921c2c599afd219663296bb..2e3ef9f0d10ec294774c7650c6412f74b44196d2 100644
--- a/pkgs/applications/misc/rxvt_unicode/default.nix
+++ b/pkgs/applications/misc/rxvt_unicode/default.nix
@@ -24,6 +24,8 @@ stdenv.mkDerivation (rec {
outputs = [ "out" "terminfo" ];
+ patches = [ ./rxvt-unicode-9.06-font-width.patch ];
+
preConfigure =
''
mkdir -p $terminfo/share/terminfo
@@ -41,5 +43,6 @@ stdenv.mkDerivation (rec {
meta = {
description = "A clone of the well-known terminal emulator rxvt";
homepage = "http://software.schmorp.de/pkg/rxvt-unicode.html";
+ maintainers = stdenv.lib.maintainers.mornfall;
};
})
diff --git a/pkgs/applications/misc/rxvt_unicode/rxvt-unicode-9.06-font-width.patch b/pkgs/applications/misc/rxvt_unicode/rxvt-unicode-9.06-font-width.patch
new file mode 100644
index 0000000000000000000000000000000000000000..636083218fa56c2d3fdf1828a2a42910b6b29524
--- /dev/null
+++ b/pkgs/applications/misc/rxvt_unicode/rxvt-unicode-9.06-font-width.patch
@@ -0,0 +1,21 @@
+--- a/src/rxvtfont.C 2008-07-09 12:21:45.000000000 +0400
++++ b/src/rxvtfont.C 2009-10-30 14:32:53.000000000 +0300
+@@ -1195,12 +1195,14 @@
+ XGlyphInfo g;
+ XftTextExtents16 (disp, f, &ch, 1, &g);
+
+- g.width -= g.x;
+-
++/*
++ * bukind: don't use g.width as a width of a character!
++ * instead use g.xOff, see e.g.: http://keithp.com/~keithp/render/Xft.tutorial
++ */
+ int wcw = WCWIDTH (ch);
+- if (wcw > 0) g.width = (g.width + wcw - 1) / wcw;
++ if (wcw > 1) g.xOff = g.xOff / wcw;
++ if (width < g.xOff) width = g.xOff;
+
+- if (width < g.width ) width = g.width;
+ if (height < g.height ) height = g.height;
+ if (glheight < g.height - g.y) glheight = g.height - g.y;
+ }
\ No newline at end of file
diff --git a/pkgs/applications/misc/spacefm/default.nix b/pkgs/applications/misc/spacefm/default.nix
index 6d52f63ff6b42dce46678b91e5ee81af761b8a1f..7dbe723d9eb2bc71b4c7e0862c28c376f666f02c 100644
--- a/pkgs/applications/misc/spacefm/default.nix
+++ b/pkgs/applications/misc/spacefm/default.nix
@@ -3,21 +3,21 @@
}:
let
- version = "0.9.2";
+ version = "0.9.4";
in stdenv.mkDerivation rec {
name = "spacefm-${version}";
src = fetchurl {
url = "https://github.com/IgnorantGuru/spacefm/blob/pkg/${version}/${name}.tar.xz?raw=true";
- sha256 = "3767137d74aa78597ffb42a6121784e91a4276efcd5d718b3793b9790f82268c";
+ sha256 = "0marwa031jk24q8hy90dr7yw6rv5hn1shar404zpb1k57v4nr23m";
};
buildInputs = [ gtk3 udev desktop_file_utils shared_mime_info intltool pkgconfig makeWrapper ];
- postInstall = ''
+ preFixup = ''
wrapProgram "$out/bin/spacefm" \
- --prefix XDG_DATA_DIRS : "${gtk3}/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
'';
meta = {
diff --git a/pkgs/applications/misc/st/default.nix b/pkgs/applications/misc/st/default.nix
index 41575ce35a699821235808697af42168bba0eaf8..fda89f1cd3dd764d7f44aa1c4c9a13960ed3167e 100644
--- a/pkgs/applications/misc/st/default.nix
+++ b/pkgs/applications/misc/st/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, writeText, libX11, ncurses, libXext, libXft, fontconfig
+{ stdenv, fetchurl, pkgconfig, writeText, libX11, ncurses, libXext, libXft, fontconfig
, conf? null}:
with stdenv.lib;
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
configFile = optionalString (conf!=null) (writeText "config.def.h" conf);
preBuild = optionalString (conf!=null) "cp ${configFile} config.def.h";
- buildInputs = [ libX11 ncurses libXext libXft fontconfig ];
+ buildInputs = [ pkgconfig libX11 ncurses libXext libXft fontconfig ];
NIX_LDFLAGS = "-lfontconfig";
diff --git a/pkgs/applications/misc/surf/default.nix b/pkgs/applications/misc/surf/default.nix
index 42792ba8f91d6cc204b7909fa277cc2bf7b7a267..651cfcca40673360e22d8daeaa74e171d0fa9abf 100644
--- a/pkgs/applications/misc/surf/default.nix
+++ b/pkgs/applications/misc/surf/default.nix
@@ -9,7 +9,7 @@ stdenv.mkDerivation rec {
sha256 = "01b8hq8z2wd7ssym5bypx2b15mrs1lhgkrcgxf700kswxvxcrhgx";
};
- buildInputs = [ gtk makeWrapper webkit pkgconfig glib libsoup ];
+ buildInputs = [ gtk makeWrapper webkit gsettings_desktop_schemas pkgconfig glib libsoup ];
# Allow users set their own list of patches
inherit patches;
@@ -21,9 +21,12 @@ stdenv.mkDerivation rec {
preConfigure = [ ''sed -i "s@PREFIX = /usr/local@PREFIX = $out@g" config.mk'' ];
installPhase = ''
make PREFIX=/ DESTDIR=$out install
+ '';
+
+ preFixup = ''
wrapProgram "$out/bin/surf" \
--prefix GIO_EXTRA_MODULES : ${glib_networking}/lib/gio/modules \
- --prefix XDG_DATA_DIRS : "${gsettings_desktop_schemas}/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
'';
meta = {
diff --git a/pkgs/applications/misc/synergy/cryptopp.patch b/pkgs/applications/misc/synergy/cryptopp.patch
index d0aebb872610ea5cd8e66ca23dd9f8999b08f22d..1c296423acd6fe32d71d604054c69ce6b533aa23 100644
--- a/pkgs/applications/misc/synergy/cryptopp.patch
+++ b/pkgs/applications/misc/synergy/cryptopp.patch
@@ -1,32 +1,30 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 3b61fc0..2206646 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -133,6 +133,9 @@ if (UNIX)
+diff -urN synergy-1.4.17-Source/CMakeLists.txt synergy-1.4.17-Source-fix/CMakeLists.txt
+--- synergy-1.4.17-Source/CMakeLists.txt 2014-03-14 21:34:19.000000000 +0100
++++ synergy-1.4.17-Source-fix/CMakeLists.txt 2014-04-11 13:37:18.839338710 +0200
+@@ -145,6 +145,9 @@
check_type_size(long SIZEOF_LONG)
check_type_size(short SIZEOF_SHORT)
-+ # let's just assume cryptopp exists (provided by the Nix expression)
-+ list(APPEND libs cryptopp)
++ # let's just assume cryptopp exists (provided by the Nix expression)
++ list(APPEND libs cryptopp)
+
# pthread is used on both Linux and Mac
check_library_exists("pthread" pthread_create "" HAVE_PTHREAD)
if (HAVE_PTHREAD)
-@@ -303,7 +306,6 @@ if (VNC_SUPPORT)
+@@ -317,7 +320,6 @@
endif()
add_subdirectory(src)
--add_subdirectory(tools)
+-add_subdirectory(ext)
if (WIN32)
- # add /analyze in order to unconver potential bugs in the source code
-diff --git a/src/lib/io/CCryptoMode.h b/src/lib/io/CCryptoMode.h
-index 9b7e8ad..0d659ac 100644
---- a/src/lib/io/CCryptoMode.h
-+++ b/src/lib/io/CCryptoMode.h
-@@ -17,9 +17,9 @@
-
- #pragma once
+ # TODO: consider using /analyze to uncover potential bugs in the source code.
+diff -urN synergy-1.4.17-Source/src/lib/io/CryptoMode_cryptopp.h synergy-1.4.17-Source-fix/src/lib/io/CryptoMode_cryptopp.h
+--- synergy-1.4.17-Source/src/lib/io/CryptoMode_cryptopp.h 2014-02-28 13:36:45.000000000 +0100
++++ synergy-1.4.17-Source-fix/src/lib/io/CryptoMode_cryptopp.h 2014-04-11 13:36:01.111985556 +0200
+@@ -25,6 +25,6 @@
+ # pragma GCC system_header
+ #endif
-#include
-#include
@@ -34,21 +32,14 @@ index 9b7e8ad..0d659ac 100644
+#include
+#include
+#include
- #include "ECryptoMode.h"
- #include "CString.h"
+diff -urN synergy-1.4.17-Source/src/lib/io/CryptoStream_cryptopp.h synergy-1.4.17-Source-fix/src/lib/io/CryptoStream_cryptopp.h
+--- synergy-1.4.17-Source/src/lib/io/CryptoStream_cryptopp.h 2014-02-28 13:36:45.000000000 +0100
++++ synergy-1.4.17-Source-fix/src/lib/io/CryptoStream_cryptopp.h 2014-04-11 13:36:07.173013005 +0200
+@@ -25,5 +25,5 @@
+ # pragma GCC system_header
+ #endif
-diff --git a/src/lib/io/CCryptoStream.h b/src/lib/io/CCryptoStream.h
-index 104b1f6..09c4dc4 100644
---- a/src/lib/io/CCryptoStream.h
-+++ b/src/lib/io/CCryptoStream.h
-@@ -20,8 +20,8 @@
- #include "BasicTypes.h"
- #include "CStreamFilter.h"
- #include "CCryptoMode.h"
-#include
-#include
+#include
+#include
-
- class CCryptoOptions;
-
diff --git a/pkgs/applications/misc/synergy/default.nix b/pkgs/applications/misc/synergy/default.nix
index c01d67943e5736cdc2c492cc6896fd6ce9d5542c..834b514148b62d18dcfaf37902a52566b47de323 100644
--- a/pkgs/applications/misc/synergy/default.nix
+++ b/pkgs/applications/misc/synergy/default.nix
@@ -1,29 +1,31 @@
-{ stdenv, fetchurl, cmake, x11, libX11, libXi, libXtst, libXrandr, xinput
-, cryptopp ? null, unzip ? null }:
+{ stdenv, fetchurl, cmake, x11, libX11, libXi, libXtst, libXrandr, xinput, curl
+, cryptopp ? null, unzip }:
assert stdenv.isLinux -> cryptopp != null;
-assert !stdenv.isLinux -> unzip != null;
with stdenv.lib;
stdenv.mkDerivation rec {
- name = "synergy-1.4.15";
+ name = "synergy-1.4.17";
src = fetchurl {
- url = "http://synergy.googlecode.com/files/${name}-Source.tar.gz";
- sha256 = "0l1mxxky9hacyva0npzkgkwg4wkmihzq3abdrds0w5f6is44adv4";
+ url = "http://fossfiles.com/synergy/${name}-r2055-Source.tar.gz";
+ sha256 = "1mwaapvq9vsm0rdpq99fyzcw6wbp83rg6cylcqcgjjd21c6y9iwm";
};
patches = optional stdenv.isLinux ./cryptopp.patch;
- postPatch = if stdenv.isLinux then ''
+ postPatch = (if stdenv.isLinux then ''
sed -i -e '/HAVE_X11_EXTENSIONS_XRANDR_H/c \
set(HAVE_X11_EXTENSIONS_XRANDR_H true)' CMakeLists.txt
'' else ''
- ${unzip}/bin/unzip -d tools/cryptopp562 tools/cryptopp562.zip
+ ${unzip}/bin/unzip -d ext/cryptopp562 ext/cryptopp562.zip
+ '') + ''
+ ${unzip}/bin/unzip -d ext/gmock-1.6.0 ext/gmock-1.6.0.zip
+ ${unzip}/bin/unzip -d ext/gtest-1.6.0 ext/gtest-1.6.0.zip
'';
- buildInputs = [ cmake x11 libX11 libXi libXtst libXrandr xinput ]
+ buildInputs = [ cmake x11 libX11 libXi libXtst libXrandr xinput curl ]
++ optional stdenv.isLinux cryptopp;
# At this moment make install doesn't work for synergy
diff --git a/pkgs/applications/misc/taffybar/default.nix b/pkgs/applications/misc/taffybar/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a92e7e32f0488410c349221ac497936a05a5832b
--- /dev/null
+++ b/pkgs/applications/misc/taffybar/default.nix
@@ -0,0 +1,25 @@
+{ cabal, cairo, dbus, dyre, filepath, gtk, gtkTraymanager
+, HStringTemplate, HTTP, mtl, network, parsec, split, stm, text
+, time, transformers, utf8String, X11, xdgBasedir, xmonad
+, xmonadContrib
+}:
+
+cabal.mkDerivation (self: {
+ pname = "taffybar";
+ version = "0.3.0";
+ sha256 = "02vpfbwfprca997ykk746ih7id0ls3i5pnb33gj3nrfgc59fkz7v";
+ isLibrary = true;
+ isExecutable = true;
+ buildDepends = [
+ cairo dbus dyre filepath gtk gtkTraymanager HStringTemplate HTTP
+ mtl network parsec split stm text time transformers utf8String X11
+ xdgBasedir xmonad xmonadContrib
+ ];
+ pkgconfigDepends = [ gtk ];
+ meta = {
+ homepage = "http://github.com/travitch/taffybar";
+ description = "A desktop bar similar to xmobar, but with more GUI";
+ license = self.stdenv.lib.licenses.bsd3;
+ platforms = self.ghc.meta.platforms;
+ };
+})
diff --git a/pkgs/applications/misc/terminator/default.nix b/pkgs/applications/misc/terminator/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c337cd329c925bcbdd2f567bb01ba41b5654d88d
--- /dev/null
+++ b/pkgs/applications/misc/terminator/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, python, pygtk, notify, keybinder, vte, gettext, intltool
+, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+ name = "terminator-${version}";
+ version = "0.97";
+
+ src = fetchurl {
+ url = "https://launchpad.net/terminator/trunk/${version}/+download/${name}.tar.gz";
+ sha256 = "1xykpx10g2zssx0ss6351ca6vmmma7zwxxhjz0fg28ps4dq88cci";
+ };
+
+ buildInputs = [
+ python pygtk notify keybinder vte gettext intltool makeWrapper
+ ];
+
+ installPhase = ''
+ python setup.py --without-icon-cache install --prefix="$out"
+
+ for file in "$out"/bin/*; do
+ wrapProgram "$file" \
+ --prefix PYTHONPATH : "$(toPythonPath $out):$PYTHONPATH"
+ done
+ '';
+
+ meta = with stdenv.lib; {
+ description = "Terminal emulator with support for tiling and tabs";
+ longDescription = ''
+ The goal of this project is to produce a useful tool for arranging
+ terminals. It is inspired by programs such as gnome-multi-term,
+ quadkonsole, etc. in that the main focus is arranging terminals in grids
+ (tabs is the most common default method, which Terminator also supports).
+ '';
+ homepage = http://gnometerminator.blogspot.no/p/introduction.html;
+ license = licenses.gpl2;
+ maintainers = [ maintainers.bjornfor ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/misc/twmn/default.nix b/pkgs/applications/misc/twmn/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..65c2ccb5ff0bf26f4c32188f31d8af0e2f4131e0
--- /dev/null
+++ b/pkgs/applications/misc/twmn/default.nix
@@ -0,0 +1,29 @@
+{ fetchurl, stdenv, fetchgit, qt4, pkgconfig, boost, dbus }:
+
+stdenv.mkDerivation rec {
+ rev = "9f52882688ba03d7aaab2e3fd83cb05cfbf1a374";
+ name = "twmn-${rev}";
+
+ src = fetchgit {
+ inherit rev;
+ url = "https://github.com/sboli/twmn.git";
+ sha256 = "1jd2y0ydcpjdmjbx77lw35710sqfwbgyrnpv66mi3gwvrbyiwpf3";
+ };
+
+ buildInputs = [ qt4 pkgconfig boost ];
+ propagatedBuildInputs = [ dbus ];
+
+ configurePhase = "qmake";
+
+ installPhase = ''
+ mkdir -p "$out/bin"
+ cp bin/* "$out/bin"
+ '';
+
+ meta = {
+ description = "A notification system for tiling window managers";
+ homepage = "https://github.com/sboli/twmn";
+ platforms = with stdenv.lib.platforms; linux;
+ maintainers = [ stdenv.lib.maintainers.matejc ];
+ };
+}
diff --git a/pkgs/applications/misc/xmobar/add-freeration-variable.patch b/pkgs/applications/misc/xmobar/add-freeration-variable.patch
deleted file mode 100644
index a8c10e1a30d6da06b90122e15457dad05e87cb71..0000000000000000000000000000000000000000
--- a/pkgs/applications/misc/xmobar/add-freeration-variable.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-diff --git a/readme.md b/readme.md
-index f4f07e8..de679c7 100644
---- a/readme.md
-+++ b/readme.md
-@@ -645,7 +645,7 @@ something like:
- - Args: default monitor arguments
- - Variables that can be used with the `-t`/`--template` argument:
- `total`, `free`, `buffer`, `cache`, `rest`, `used`,
-- `usedratio`, `usedbar`, `freebar`
-+ `usedratio`, `usedbar`, `freeratio`, `freebar`
- - Default template: `Mem: % (M)`
-
- ### `Swap Args RefreshRate`
-diff --git a/src/Plugins/Monitors/Mem.hs b/src/Plugins/Monitors/Mem.hs
-index 5c55ee2..3cf46c7 100644
---- a/src/Plugins/Monitors/Mem.hs
-+++ b/src/Plugins/Monitors/Mem.hs
-@@ -19,8 +19,8 @@ import Plugins.Monitors.Common
- memConfig :: IO MConfig
- memConfig = mkMConfig
- "Mem: % (M)" -- template
-- ["usedbar", "freebar", "usedratio", "total",
-- "free", "buffer", "cache", "rest", "used"] -- available replacements
-+ ["usedbar", "freebar", "usedratio", "freeratio", "total",
-+ "free", "buffer", "cache", "rest", "used"] -- available replacements
-
- fileMEM :: IO String
- fileMEM = readFile "/proc/meminfo"
-@@ -33,7 +33,8 @@ parseMEM =
- rest = free + buffer + cache
- used = total - rest
- usedratio = used / total
-- return [usedratio, total, free, buffer, cache, rest, used]
-+ freeratio = free / total
-+ return [usedratio, freeratio, total, free, buffer, cache, rest, used, freeratio]
-
- totalMem :: IO Float
- totalMem = fmap ((*1024) . (!!1)) parseMEM
-@@ -42,15 +43,16 @@ usedMem :: IO Float
- usedMem = fmap ((*1024) . (!!6)) parseMEM
-
- formatMem :: [Float] -> Monitor [String]
--formatMem (r:xs) =
-+formatMem (r:fr:xs) =
- do let f = showDigits 0
- rr = 100 * r
- ub <- showPercentBar rr r
- fb <- showPercentBar (100 - rr) (1 - r)
- rs <- showPercentWithColors r
-+ fs <- showPercentWithColors fr
- s <- mapM (showWithColors f) xs
-- return (ub:fb:rs:s)
--formatMem _ = return $ replicate 9 "N/A"
-+ return (ub:fb:rs:fs:s)
-+formatMem _ = return $ replicate 10 "N/A"
-
- runMem :: [String] -> Monitor String
- runMem _ =
diff --git a/pkgs/applications/misc/xmobar/default.nix b/pkgs/applications/misc/xmobar/default.nix
index 7eacaf15b625285cb22cc389ebd0b469d36ada82..a7aeed339e242bdd9fe37d7c8b975724e64072be 100644
--- a/pkgs/applications/misc/xmobar/default.nix
+++ b/pkgs/applications/misc/xmobar/default.nix
@@ -1,15 +1,16 @@
-{ cabal, alsaCore, alsaMixer, filepath, libXrandr, mtl, parsec
-, regexCompat, stm, time, utf8String, wirelesstools, X11, X11Xft
+{ cabal, alsaCore, alsaMixer, filepath, HTTP, libXrandr, mtl
+, parsec, regexCompat, stm, time, utf8String, wirelesstools, X11
+, X11Xft
}:
cabal.mkDerivation (self: {
pname = "xmobar";
- version = "0.19";
- sha256 = "1lwbww9vpqscip16lqiax2qvfyksxms5xx4n0s61mzw7v61hyxq2";
+ version = "0.20.1";
+ sha256 = "16jfgn6ciqxrwj6qjhbcpms7mzlbxfaxyxfxp64xvnw626xlpjvk";
isLibrary = false;
isExecutable = true;
buildDepends = [
- alsaCore alsaMixer filepath mtl parsec regexCompat stm time
+ alsaCore alsaMixer filepath HTTP mtl parsec regexCompat stm time
utf8String X11 X11Xft
];
extraLibraries = [ libXrandr wirelesstools ];
diff --git a/pkgs/applications/misc/xterm/default.nix b/pkgs/applications/misc/xterm/default.nix
index 1d050182da339476381401d8a12031e6669e89b5..ac2f6dd7756fa7cce48d1238cc4faf4961d48189 100644
--- a/pkgs/applications/misc/xterm/default.nix
+++ b/pkgs/applications/misc/xterm/default.nix
@@ -1,11 +1,11 @@
{ stdenv, fetchurl, xorg, ncurses, freetype, fontconfig, pkgconfig }:
stdenv.mkDerivation rec {
- name = "xterm-300";
+ name = "xterm-303";
src = fetchurl {
url = "ftp://invisible-island.net/xterm/${name}.tgz";
- sha256 = "1k8p7q4d1gpk6zikb8hys8b30yq2v001nlp3r9g40my31ij9al31";
+ sha256 = "0n7hay16aam9kfn642ri0wj5yzilbjm3l8znxc2p5dx9pn3rkwla";
};
buildInputs =
diff --git a/pkgs/applications/misc/ykpers/default.nix b/pkgs/applications/misc/ykpers/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e7bfa8ded50e91a4fb26f07822310188fe4a0944
--- /dev/null
+++ b/pkgs/applications/misc/ykpers/default.nix
@@ -0,0 +1,23 @@
+{stdenv, fetchurl, pkgconfig, libusb1, libyubikey}:
+
+stdenv.mkDerivation rec
+{
+ version = "1.15.0";
+ name = "ykpers-${version}";
+
+ src = fetchurl
+ {
+ url = "http://opensource.yubico.com/yubikey-personalization/releases/${name}.tar.gz";
+ sha256 = "1n4s8kk31q5zh2rm7sj9qmv86yl8ibimdnpvk9ny391a88qlypyd";
+ };
+
+ buildInputs = [pkgconfig libusb1 libyubikey];
+
+ meta =
+ {
+ homepage = "http://opensource.yubico.com/yubikey-personalization/";
+ description = "YubiKey Personalization cross-platform library and tool";
+ license = "bsd";
+ maintainers = [ stdenv.lib.maintainers.calrama ];
+ };
+}
diff --git a/pkgs/applications/misc/zathura/core/default.nix b/pkgs/applications/misc/zathura/core/default.nix
index 00e1e6cd28a16ff4e614d596bf43096bb22b7c85..933882c940bbce0a8e16305120a98673cf7b5b88 100644
--- a/pkgs/applications/misc/zathura/core/default.nix
+++ b/pkgs/applications/misc/zathura/core/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, pkgconfig, gtk, girara, gettext, docutils, file, makeWrapper }:
+{ stdenv, fetchurl, pkgconfig, gtk, girara, gettext, docutils, file, makeWrapper, zathura_icon }:
stdenv.mkDerivation rec {
- version = "0.2.6";
+ version = "0.2.7";
name = "zathura-core-${version}";
src = fetchurl {
url = "http://pwmt.org/projects/zathura/download/zathura-${version}.tar.gz";
- sha1 = "d84878388969d523027a1661f49fd29638bd460b";
+ sha256 = "ef43be7705612937d095bfbe719a03503bf7e45493ea9409cb43a45cf96f0daf";
};
buildInputs = [ pkgconfig file gtk girara gettext makeWrapper ];
@@ -21,7 +21,12 @@ stdenv.mkDerivation rec {
makeFlags = [ "PREFIX=$(out)" "RSTTOMAN=${docutils}/bin/rst2man.py" "VERBOSE=1" ];
postInstall = ''
- wrapProgram "$out/bin/zathura" --prefix PATH ":" "${file}/bin"
+ wrapProgram "$out/bin/zathura" \
+ --prefix PATH ":" "${file}/bin" \
+ --prefix XDG_CONFIG_DIRS ":" "$out/etc"
+
+ mkdir -pv $out/etc
+ echo "set window-icon ${zathura_icon}" > $out/etc/zathurarc
'';
meta = {
diff --git a/pkgs/applications/misc/zathura/default.nix b/pkgs/applications/misc/zathura/default.nix
index 74288657fb350844db2c8f8245a8d12cfd84487d..f943bff7bf0c3b4489cb87c409d32640f9870c6b 100644
--- a/pkgs/applications/misc/zathura/default.nix
+++ b/pkgs/applications/misc/zathura/default.nix
@@ -3,8 +3,11 @@
rec {
inherit (pkgs) stdenv;
+ icon = ./icon.xpm;
+
zathura_core = callPackage ./core {
gtk = pkgs.gtk3;
+ zathura_icon = icon;
};
zathura_pdf_poppler = callPackage ./pdf-poppler { };
@@ -19,7 +22,7 @@ rec {
zathuraWrapper = stdenv.mkDerivation {
- inherit zathura_core;
+ inherit zathura_core icon;
name = "zathura-${zathura_core.version}";
@@ -29,10 +32,10 @@ rec {
zathura_ps
];
- icon = ./icon.xpm;
-
builder = ./builder.sh;
+ preferLocalBuild = true;
+
meta = {
homepage = http://pwmt.org/projects/zathura/;
description = "A highly customizable and functional PDF viewer";
diff --git a/pkgs/applications/misc/zathura/pdf-poppler/default.nix b/pkgs/applications/misc/zathura/pdf-poppler/default.nix
index 71c418f168c4392ffba2eb1e2e5927a6d5e03675..ce4894e6c0f15b95c7f77ca18c17fa090207db6e 100644
--- a/pkgs/applications/misc/zathura/pdf-poppler/default.nix
+++ b/pkgs/applications/misc/zathura/pdf-poppler/default.nix
@@ -1,12 +1,12 @@
{ stdenv, fetchurl, pkgconfig, zathura_core, girara, poppler, gettext }:
stdenv.mkDerivation rec {
- version = "0.2.4";
+ version = "0.2.5";
name = "zathura-pdf-poppler-${version}";
src = fetchurl {
url = "http://pwmt.org/projects/zathura/plugins/download/${name}.tar.gz";
- sha256 = "1x1n21naixb87g1knznjfjfibazzwbn1cv7d42kxgwlnf1p1wbzm";
+ sha256 = "1b0chsds8iwjm4g629p6a67nb6wgra65pw2vvngd7g35dmcjgcv0";
};
buildInputs = [ pkgconfig poppler gettext zathura_core girara ];
diff --git a/pkgs/applications/networking/bittorrentsync/default.nix b/pkgs/applications/networking/bittorrentsync/default.nix
index 895ebd7911bebf59eee989d3f084bf9e45204fdf..d0611d5b6024c2dbb59e2522837b8a946b36c482 100644
--- a/pkgs/applications/networking/bittorrentsync/default.nix
+++ b/pkgs/applications/networking/bittorrentsync/default.nix
@@ -1,47 +1,42 @@
{ stdenv, fetchurl, patchelf }:
-# this package contains the daemon version of bittorrent sync
-# it's unfortunately closed source.
-
let
- # TODO: arm, ppc, osx
-
arch = if stdenv.system == "x86_64-linux" then "x64"
else if stdenv.system == "i686-linux" then "i386"
else throw "Bittorrent Sync for: ${stdenv.system} not supported!";
-
- interpreter = if stdenv.system == "x86_64-linux" then "ld-linux-x86-64.so.2"
- else if stdenv.system == "i686-linux" then "ld-linux.so.2"
- else throw "Bittorrent Sync for: ${stdenv.system} not supported!";
- version = "1.2.82";
- sha256 = if stdenv.system == "x86_64-linux" then "0cqrscav57xwz7rag6wy06xw6z7ca97xailprgg6jdjv4pnc91ra"
- else if stdenv.system == "i686-linux" then "1b9rnfk0wkhj1zybvfqwgd9dcqnxwdnp7m0vf6lhrgi75cydj7is"
+ sha256 = if stdenv.system == "x86_64-linux" then "16jdnip51fsnc2g0vib2zb4f06z5p1myzv9brrp42lq63l4skylj"
+ else if stdenv.system == "i686-linux" then "15bspn9frm2n7bzj7pdgbpd7gjjcxp0yx2sksa4ly6wmlv9lvf1j"
else throw "Bittorrent Sync for: ${stdenv.system} not supported!";
-in stdenv.mkDerivation {
- name = "btsync-bin-${version}";
- src = fetchurl {
- url = "http://syncapp.bittorrent.com/${version}/btsync_${arch}-${version}.tar.gz";
+ libPath = stdenv.lib.makeLibraryPath [ stdenv.gcc.libc ];
+in
+stdenv.mkDerivation rec {
+ name = "btsync-${version}";
+ version = "1.3.87";
+
+ src = fetchurl {
+ url = "http://syncapp.bittorrent.com/${version}/btsync_${arch}-${version}.tar.gz";
inherit sha256;
};
- sourceRoot = ".";
+ dontStrip = true; # Don't strip, otherwise patching the rpaths breaks
+ sourceRoot = ".";
+ buildInputs = [ patchelf ];
installPhase = ''
ensureDir "$out/bin/"
cp -r "btsync" "$out/bin/"
- patchelf --set-interpreter ${stdenv.glibc}/lib/${interpreter} \
- "$out/bin/btsync"
+ patchelf --interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
+ --set-rpath ${libPath} "$out/bin/btsync"
'';
- buildInputs = [ patchelf ];
-
meta = {
- homepage = "http://labs.bittorrent.com/experiments/sync.html";
description = "Automatically sync files via secure, distributed technology";
- license = stdenv.lib.licenses.unfree;
- maintainers = [ stdenv.lib.maintainers.iElectric ];
+ homepage = "http://www.bittorrent.com/sync";
+ license = stdenv.lib.licenses.unfreeRedistributable;
+ platforms = stdenv.lib.platforms.linux;
+ maintainers = with stdenv.lib.maintainers; [ iElectric thoughtpolice ];
};
}
diff --git a/pkgs/applications/networking/browsers/chromium/default.nix b/pkgs/applications/networking/browsers/chromium/default.nix
index 87cdf673041a44484cd746aaf5bbfdd3ecbd8ecf..213e75ee6efa46d4e424b77f87d9c8d3ef191527 100644
--- a/pkgs/applications/networking/browsers/chromium/default.nix
+++ b/pkgs/applications/networking/browsers/chromium/default.nix
@@ -8,7 +8,7 @@
, libusb1, libexif, pciutils
, python, pythonPackages, perl, pkgconfig
-, nspr, udev, krb5, file
+, nspr, udev, krb5
, utillinux, alsaLib
, gcc, bison, gperf
, glib, gtk, dbus_glib
@@ -40,6 +40,8 @@ let
inherit url sha256;
};
+ buildInputs = [ python ]; # cannot patch shebangs otherwise
+
phases = [ "unpackPhase" "patchPhase" "installPhase" ];
opensslPatches = optional useOpenSSL openssl.patches;
@@ -49,15 +51,19 @@ let
patches = singleton ./sandbox_userns_31.patch;
postPatch = ''
- sed -i -r -e 's/-f(stack-protector)(-all)?/-fno-\1/' build/common.gypi
- '' + (if versionOlder version "32.0.0.0" then ''
- sed -i -e 's|/usr/bin/gcc|gcc|' third_party/WebKit/Source/core/core.gypi
- '' else ''
+ sed -i -r \
+ -e 's/-f(stack-protector)(-all)?/-fno-\1/' \
+ -e 's|/bin/echo|echo|' \
+ -e "/python_arch/s/: *'[^']*'/: '""'/" \
+ build/common.gypi chrome/chrome_tests.gypi
+ sed -i '/not RunGN/,+1d' build/gyp_chromium
sed -i -e 's|/usr/bin/gcc|gcc|' \
third_party/WebKit/Source/build/scripts/scripts.gypi \
third_party/WebKit/Source/build/scripts/preprocessor.pm
- '') + optionalString useOpenSSL ''
+ '' + optionalString useOpenSSL ''
cat $opensslPatches | patch -p1 -d third_party/openssl/openssl
+ '' + optionalString (!versionOlder version "34.0.0.0") ''
+ sed -i '/import.*depot/d' build/gyp_chromium
'';
outputs = [ "out" "sandbox" "bundled" "main" ];
@@ -160,8 +166,7 @@ in stdenv.mkDerivation rec {
nspr udev
(if useOpenSSL then openssl else nss)
utillinux alsaLib
- gcc bison gperf
- krb5 file
+ gcc bison gperf krb5
glib gtk dbus_glib
libXScrnSaver libXcursor libXtst mesa
pciutils protobuf speechd libXdamage
@@ -218,8 +223,10 @@ in stdenv.mkDerivation rec {
ffmpeg_branding = "Chrome";
} // optionalAttrs (stdenv.system == "x86_64-linux") {
target_arch = "x64";
+ python_arch = "x86-64";
} // optionalAttrs (stdenv.system == "i686-linux") {
target_arch = "ia32";
+ python_arch = "ia32";
});
configurePhase = ''
@@ -241,6 +248,9 @@ in stdenv.mkDerivation rec {
installPhase = ''
ensureDir "${libExecPath}"
cp -v "${buildPath}/"*.pak "${libExecPath}/"
+ ${optionalString (!versionOlder src.version "34.0.0.0") ''
+ cp -v "${buildPath}/icudtl.dat" "${libExecPath}/"
+ ''}
cp -vR "${buildPath}/locales" "${buildPath}/resources" "${libExecPath}/"
cp -v ${buildPath}/libffmpegsumo.so "${libExecPath}/"
@@ -270,7 +280,7 @@ in stdenv.mkDerivation rec {
meta = {
description = "An open source web browser from Google";
homepage = http://www.chromium.org/;
- maintainers = with maintainers; [ goibhniu chaoflow aszlig ];
+ maintainers = with maintainers; [ goibhniu chaoflow aszlig wizeman ];
license = licenses.bsd3;
platforms = platforms.linux;
};
diff --git a/pkgs/applications/networking/browsers/chromium/sources.nix b/pkgs/applications/networking/browsers/chromium/sources.nix
index b7a30ef63f7db3b9ac393dfe82ae6f2ca6831c75..49b5e2b42215aa79745cbe57c9097ee70691bd1e 100644
--- a/pkgs/applications/networking/browsers/chromium/sources.nix
+++ b/pkgs/applications/networking/browsers/chromium/sources.nix
@@ -1,18 +1,18 @@
# This file is autogenerated from update.sh in the same directory.
{
dev = {
- version = "33.0.1712.4";
- url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-33.0.1712.4.tar.xz";
- sha256 = "1c1m0y3nnz2lclqi21j6hgqmb46p1hv7c22zz9fn7dax7jkimydk";
+ version = "35.0.1883.0";
+ url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-35.0.1883.0.tar.xz";
+ sha256 = "0qbv6prxl18y5824pfd13ng9798g561gzb6nypwp502hqr45jvb6";
};
beta = {
- version = "32.0.1700.19";
- url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-32.0.1700.19.tar.xz";
- sha256 = "0d0kgy160pyg472ka43gxk7n09pqhhs9nd93jyxrp9qsyllfc425";
+ version = "34.0.1847.60";
+ url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-34.0.1847.60.tar.xz";
+ sha256 = "1na5d6z4a0wkabn7cj62vyiv3mmvcb6qdvrkyy6fj79h7gk2hb7k";
};
stable = {
- version = "32.0.1700.77";
- url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-32.0.1700.77.tar.xz";
- sha256 = "1mwqa5k32d168swpw0bdcnhglxwcqdsx766fq0iz22h3hd4ccdwa";
+ version = "34.0.1847.116";
+ url = "http://commondatastorage.googleapis.com/chromium-browser-official/chromium-34.0.1847.116.tar.xz";
+ sha256 = "04cpfav5rqa117igvzmrw0045r2ljxg5fqb46qgqvkgff30pjrfx";
};
}
diff --git a/pkgs/applications/networking/browsers/conkeror/default.nix b/pkgs/applications/networking/browsers/conkeror/default.nix
index fc84f7fcecc29749061e286851f98095c0792902..79402c31f8b66c2b664ad72f87fc612f45edb766 100644
--- a/pkgs/applications/networking/browsers/conkeror/default.nix
+++ b/pkgs/applications/networking/browsers/conkeror/default.nix
@@ -1,12 +1,12 @@
{ stdenv, fetchgit, unzip, xulrunner, makeWrapper }:
stdenv.mkDerivation {
- name = "conkeror-1.0pre-20131116-1";
+ name = "conkeror-1.0pre-20140212";
src = fetchgit {
url = git://repo.or.cz/conkeror.git;
- rev = "refs/tags/debian-1.0--pre+git131116-1";
- sha256 = "6fe0f30487c5bb8f2183dc7c2e15cf29df7cc8b1950b5fc15c26510c74a1f7d3";
+ rev = "07064d76d10e0978c6de535e21f4597d44560fbd";
+ sha256 = "b03a7debee8583ff7a3f2d95474f60e956f0e24dbd1a8fd22412de1d6627f322";
};
buildInputs = [ unzip makeWrapper ];
diff --git a/pkgs/applications/networking/browsers/dillo/default.nix b/pkgs/applications/networking/browsers/dillo/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..0cf23f38b0f0d886ebf8aa1e7afa19686f59934f
--- /dev/null
+++ b/pkgs/applications/networking/browsers/dillo/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl
+, fltk
+, openssl
+, libjpeg, libpng
+, perl
+, libXcursor, libXi, libXinerama
+}:
+
+stdenv.mkDerivation rec {
+ version = "3.0.4";
+ name = "dillo-${version}";
+
+ src = fetchurl {
+ url = "http://www.dillo.org/download/${name}.tar.bz2";
+ sha256 = "0ffz481vgl7f12f575pmbagm8swgxgv9s9c0p8c7plhd04jsnazf";
+ };
+
+ buildInputs = with stdenv.lib;
+ [ fltk openssl libjpeg libpng libXcursor libXi libXinerama ];
+
+ nativeBuildInputs = [ perl ];
+
+ configureFlags = "--enable-ssl";
+
+ meta = {
+ homepage = http://www.dillo.org/;
+ description = "A fast graphical web browser with a small footprint";
+ maintainers = [ stdenv.lib.maintainers.AndersonTorres ];
+ platforms = stdenv.lib.platforms.linux;
+ };
+}
diff --git a/pkgs/applications/networking/browsers/dwb/default.nix b/pkgs/applications/networking/browsers/dwb/default.nix
index 0421a8a6c6a8c9b36691656ff41791b95961ae6b..010dbd168a8d0d9fc22ef9fcc2e2e49e39747407 100644
--- a/pkgs/applications/networking/browsers/dwb/default.nix
+++ b/pkgs/applications/networking/browsers/dwb/default.nix
@@ -2,25 +2,25 @@
m4, glib_networking, gsettings_desktop_schemas }:
stdenv.mkDerivation {
- name = "dwb-0.1";
+ name = "dwb-2014-04-20";
src = fetchgit {
url = "https://bitbucket.org/portix/dwb.git";
- rev = "84a8621787baded72e84afdd5cdda278cb81e007";
- sha256 = "5a32f3c21ad59b43935a16108244f84d260fafaea9b93d41e8de9ba9089ee7b0";
+ rev = "117a6a8cdb84b30b0c084dee531b650664d09ba2";
+ sha256 = "1k1nax3ij64b2hbn9paqj128yyzy41b61xd2m1ayq9y17k9als0b";
};
- buildInputs = [ pkgconfig makeWrapper libsoup webkit gtk3 gnutls json_c m4 ];
+ buildInputs = [ pkgconfig makeWrapper gsettings_desktop_schemas libsoup webkit gtk3 gnutls json_c m4 ];
# There are Xlib and gtk warnings therefore I have set Wno-error
preBuild=''
makeFlagsArray=(CPPFLAGS="-Wno-error" GTK=3 PREFIX=$out);
'';
- postInstall=''
+ preFixup=''
wrapProgram "$out/bin/dwb" \
--prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
- --prefix XDG_DATA_DIRS : "${gsettings_desktop_schemas}/share:$out/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH:$out/share"
wrapProgram "$out/bin/dwbem" \
--prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules"
'';
diff --git a/pkgs/applications/networking/browsers/elinks/default.nix b/pkgs/applications/networking/browsers/elinks/default.nix
index 142e5a65df6c4b423b163d34a50869524947ca5c..61db2656a409319bab78fa923008611e4cf3b082 100644
--- a/pkgs/applications/networking/browsers/elinks/default.nix
+++ b/pkgs/applications/networking/browsers/elinks/default.nix
@@ -1,6 +1,6 @@
{ stdenv, fetchurl, perl, ncurses, x11, bzip2, zlib, openssl
, spidermonkey, gpm
-, enableGuile ? true, guile ? null
+, enableGuile ? false, guile ? null # Incompatible licenses, LGPLv3 - GPLv2
, enablePython ? false, python ? null
}:
@@ -43,5 +43,6 @@ stdenv.mkDerivation rec {
meta = {
description = "Full-featured text-mode web browser";
homepage = http://elinks.or.cz;
+ license = "GPLv2";
};
}
diff --git a/pkgs/applications/networking/browsers/firefox/default.nix b/pkgs/applications/networking/browsers/firefox/default.nix
index 27363482be09a1c1d53937f9f91060bdde080e96..b45fb4bbae75b882cac7dea10f0f226c82f6716a 100644
--- a/pkgs/applications/networking/browsers/firefox/default.nix
+++ b/pkgs/applications/networking/browsers/firefox/default.nix
@@ -17,9 +17,9 @@ assert stdenv.gcc ? libc && stdenv.gcc.libc != null;
rec {
- firefoxVersion = "26.0";
+ firefoxVersion = "27.0.1";
- xulVersion = "26.0"; # this attribute is used by other packages
+ xulVersion = "27.0.1"; # this attribute is used by other packages
src = fetchurl {
@@ -29,7 +29,7 @@ rec {
# Fall back to this url for versions not available at releases.mozilla.org.
"http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/${firefoxVersion}/source/firefox-${firefoxVersion}.source.tar.bz2"
];
- sha1 = "f7c6642d6f62aea8d4eced48dd27aba0634edcd5";
+ sha256 = "13qd53yf8dn9m03p4x5ml9h3mys60nba5nz82lcvaq7ycp1pl1bn";
};
commonConfigureFlags =
@@ -82,7 +82,7 @@ rec {
"--disable-javaxpcom"
] ++ commonConfigureFlags;
- enableParallelBuilding = true;
+ #enableParallelBuilding = true; # cf. https://github.com/NixOS/nixpkgs/pull/1699#issuecomment-35196282
preConfigure =
''
@@ -116,6 +116,7 @@ rec {
for i in $out/lib/$libDir/{plugin-container,xulrunner,xulrunner-stub}; do
wrapProgram $i --prefix LD_LIBRARY_PATH ':' "$out/lib/$libDir"
done
+
rm -f $out/bin/run-mozilla.sh
''; # */
@@ -162,13 +163,20 @@ rec {
"SYSTEM_LIBXUL=1"
];
- # Hack to work around make's idea of -lbz2 dependency
+ # Because preConfigure runs configure from a subdirectory.
+ configureScript = "../configure";
+
preConfigure =
''
+ # Hack to work around make's idea of -lbz2 dependency
find . -name Makefile.in -execdir sed -i '{}' -e '1ivpath %.so ${
stdenv.lib.concatStringsSep ":"
(map (s : s + "/lib") (buildInputs ++ [stdenv.gcc.libc]))
}' ';'
+
+ # Building directly in the main source directory is not allowed.
+ mkdir obj_dir
+ cd obj_dir
'';
postInstall =
@@ -187,7 +195,7 @@ rec {
meta = {
description = "Mozilla Firefox - the browser, reloaded";
homepage = http://www.mozilla.com/en-US/firefox/;
- maintainers = [ stdenv.lib.maintainers.eelco ];
+ maintainers = with stdenv.lib.maintainers; [ eelco wizeman ];
};
passthru = {
diff --git a/pkgs/applications/networking/browsers/firefox/wrapper.nix b/pkgs/applications/networking/browsers/firefox/wrapper.nix
index bf4c7f3e7d222ea3e48e1f67d4f647df68f3e5d7..6a00dfcd8c193bba82ea933f751fc46b7bed4d86 100644
--- a/pkgs/applications/networking/browsers/firefox/wrapper.nix
+++ b/pkgs/applications/networking/browsers/firefox/wrapper.nix
@@ -2,8 +2,10 @@
, browserName, desktopName, nameSuffix, icon
}:
+let p = builtins.parseDrvName browser.name; in
+
stdenv.mkDerivation {
- name = browser.name + "-with-plugins";
+ name = "${p.name}-with-plugins-${p.version}";
desktopItem = makeDesktopItem {
name = browserName;
@@ -40,6 +42,8 @@ stdenv.mkDerivation {
echo ${browser} > $out/nix-support/propagated-user-env-packages
'';
+ preferLocalBuild = true;
+
# Let each plugin tell us (through its `mozillaPlugin') attribute
# where to find the plugin in its tree.
plugins = map (x: x + x.mozillaPlugin) plugins;
diff --git a/pkgs/applications/networking/browsers/icecat-3/default.nix b/pkgs/applications/networking/browsers/icecat-3/default.nix
index 84269a290e9ac43f754ce76fe72b6f465836c810..ef2c69422b6266bac5eaf40fe4ca7187ede1d37e 100644
--- a/pkgs/applications/networking/browsers/icecat-3/default.nix
+++ b/pkgs/applications/networking/browsers/icecat-3/default.nix
@@ -105,7 +105,7 @@ stdenv.mkDerivation {
'';
homepage = http://www.gnu.org/software/gnuzilla/;
- licenses = [ "GPLv2+" "LGPLv2+" "MPLv1+" ];
+ license = [ "GPLv2+" "LGPLv2+" "MPLv1+" ];
maintainers = [ ];
platforms = stdenv.lib.platforms.gnu;
diff --git a/pkgs/applications/networking/browsers/kwebkitpart/default.nix b/pkgs/applications/networking/browsers/kwebkitpart/default.nix
index e9babf787bd16b5766c30ce94da2a8144419bd51..5ced048fe6491adf079f54db01e8ce1027aa97fc 100644
--- a/pkgs/applications/networking/browsers/kwebkitpart/default.nix
+++ b/pkgs/applications/networking/browsers/kwebkitpart/default.nix
@@ -1,12 +1,13 @@
{ stdenv, fetchgit, kdelibs }:
stdenv.mkDerivation rec {
- name = "kwebkitpart-1.3.2";
+ name = "kwebkitpart-${version}";
+ version = "1.3.3";
src = fetchgit {
url = git://anongit.kde.org/kwebkitpart;
- rev = "292f32fda933b2ead5a61ff1ec457f839fad5c85";
- sha256 = "1b2jar9b1yb3gy9fnq8dn2n4z8lffb6pfrj9jc4rjzv5b3rwh1ak";
+ rev = "refs/tags/v${version}";
+ sha256 = "0kszffgg3zpf319lmzlmdba5gq8kdr5xwb69xwy4s2abc9nvwvbi";
};
buildInputs = [ kdelibs ];
diff --git a/pkgs/applications/networking/browsers/links2/default.nix b/pkgs/applications/networking/browsers/links2/default.nix
index 7efdf7ed015ebe0364f0db57351a0ebf16616ea1..9b9d9ab6db17693c00e9c82356406912f52c5e14 100644
--- a/pkgs/applications/networking/browsers/links2/default.nix
+++ b/pkgs/applications/networking/browsers/links2/default.nix
@@ -8,12 +8,12 @@
}:
stdenv.mkDerivation rec {
- version = "2.5";
+ version = "2.8";
name = "links2-${version}";
src = fetchurl {
url = "${meta.homepage}/download/links-${version}.tar.bz2";
- sha256 = "1wlmj8s6bxgznh0pnawihyvhffzryciz3lkagcxhf7fp64zz5izm";
+ sha256 = "15h07498z52jfdahzgvkphg1f7qvxnpbyfn2xmsls0d2dwwdll3r";
};
buildInputs =
diff --git a/pkgs/applications/networking/browsers/midori/default.nix b/pkgs/applications/networking/browsers/midori/default.nix
index b2ca7c42e76c0a7cc5c1d09083ac0042237d8257..d3135e0be8e394d0bee714e2d83a7b6bde195abe 100644
--- a/pkgs/applications/networking/browsers/midori/default.nix
+++ b/pkgs/applications/networking/browsers/midori/default.nix
@@ -3,8 +3,11 @@
, glib_networking, gsettings_desktop_schemas
}:
+let
+ version = "0.5.7";
+in
stdenv.mkDerivation rec {
- name = "midori-0.5.6";
+ name = "midori-${version}";
meta = {
description = "Lightweight WebKitGTK+ web browser";
@@ -15,8 +18,8 @@ stdenv.mkDerivation rec {
};
src = fetchurl {
- url = "${meta.homepage}/downloads/midori_0.5.6_all_.tar.bz2";
- sha256 = "0jpj8cw0dzamzylzslayamjhv0is0xd99dyaql4nyxrkk5fipgn5";
+ url = "${meta.homepage}/downloads/midori_${version}_all_.tar.bz2";
+ sha256 = "0k8bppicgzm97g5x8ahvpw9wvg2f1mq093qp8biwr858m0mbnx98";
};
buildInputs = [
@@ -29,9 +32,9 @@ stdenv.mkDerivation rec {
-DUSE_ZEITGEIST=OFF
'';
- postInstall = ''
+ preFixup = ''
wrapProgram $out/bin/midori \
--prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
- --prefix XDG_DATA_DIRS : "${gtk3}/share:${gsettings_desktop_schemas}/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
'';
}
diff --git a/pkgs/applications/networking/browsers/mozilla-plugins/flashplayer-11/default.nix b/pkgs/applications/networking/browsers/mozilla-plugins/flashplayer-11/default.nix
index d4d95f7e5b99b3e80b7630b3bc43e72ffe237d89..a78ab7d27f720d4ac23e967528aa447fb539dc4e 100644
--- a/pkgs/applications/networking/browsers/mozilla-plugins/flashplayer-11/default.nix
+++ b/pkgs/applications/networking/browsers/mozilla-plugins/flashplayer-11/default.nix
@@ -35,6 +35,8 @@
}:
let
+ # -> http://get.adobe.com/flashplayer/
+ version = "11.2.202.350";
src =
if stdenv.system == "x86_64-linux" then
@@ -43,10 +45,9 @@ let
# http://labs.adobe.com/technologies/flashplayer10/faq.html
throw "no x86_64 debugging version available"
else rec {
- # -> http://labs.adobe.com/downloads/flashplayer10.html
- version = "11.2.202.310";
+ inherit version;
url = "http://fpdownload.macromedia.com/get/flashplayer/pdc/${version}/install_flash_player_11_linux.x86_64.tar.gz";
- sha256 = "03r9r7h3l4i15hw62k9il6pjzq122nldbgxr37b4y10xp08a9izj";
+ sha256 = "0f5y05c0acvdzd7a7qi93kd17byazf9swm6gml5rph5bc25aw77l";
}
else if stdenv.system == "i686-linux" then
if debug then {
@@ -55,9 +56,9 @@ let
url = http://fpdownload.macromedia.com/pub/flashplayer/updaters/11/flashplayer_11_plugin_debug.i386.tar.gz;
sha256 = "1z3649lv9sh7jnwl8d90a293nkaswagj2ynhsr4xmwiy7c0jz2lk";
} else rec {
- version = "11.2.202.310";
+ inherit version;
url = "http://fpdownload.macromedia.com/get/flashplayer/pdc/${version}/install_flash_player_11_linux.i386.tar.gz";
- sha256 = "0qf09p92silp81pjfcg2vcfcfi1padizmb58q5iaarnapgkawlbh";
+ sha256 = "0nsrj56xbpn8r4365zby8qbc38cl2anb5ky0h7jwyh7xyrs9xmml";
}
else throw "Flash Player is not supported on this platform";
@@ -87,5 +88,7 @@ stdenv.mkDerivation {
meta = {
description = "Adobe Flash Player browser plugin";
homepage = http://www.adobe.com/products/flashplayer/;
+ maintainer = with stdenv.lib.maintainers; [ wizeman ];
+ license = "unfree";
};
}
diff --git a/pkgs/applications/networking/browsers/mozilla-plugins/fribid/default.nix b/pkgs/applications/networking/browsers/mozilla-plugins/fribid/default.nix
index 66bd28424c0e9192d5f1a0702a2dfd57bae0e382..8cda5ad5762fdfbe8408793d127665c8c51ba034 100644
--- a/pkgs/applications/networking/browsers/mozilla-plugins/fribid/default.nix
+++ b/pkgs/applications/networking/browsers/mozilla-plugins/fribid/default.nix
@@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
meta = {
description = "A browser plugin to manage Swedish BankID:s";
homepage = http://fribid.se;
- licenses = [ "GPLv2" "MPLv1" ];
+ license = [ "GPLv2" "MPLv1" ];
maintainers = [ stdenv.lib.maintainers.edwtjo ];
platforms = with stdenv.lib.platforms; linux;
};
diff --git a/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix b/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
index 4f7d3feb8ad6d3afdfecad2935bc421810a47650..e1bc4e977f6a061772d040c5f38a33d3efb66e0e 100644
--- a/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
+++ b/pkgs/applications/networking/browsers/mozilla-plugins/google-talk-plugin/default.nix
@@ -45,20 +45,22 @@ in
stdenv.mkDerivation rec {
name = "google-talk-plugin-${version}";
- # Use the following to determine the current upstream version:
- # curl -s http://dl.google.com/linux/talkplugin/deb/dists/stable/main/binary-amd64/Packages | sed -nr 's/^Version: *([^ ]+)-1$/\1/p'
- version = "4.2.1.0";
+
+ # You can get the upstream version and SHA-1 hash from the following URLs:
+ # http://dl.google.com/linux/talkplugin/deb/dists/stable/main/binary-amd64/Packages
+ # http://dl.google.com/linux/talkplugin/deb/dists/stable/main/binary-i386/Packages
+ version = "5.1.5.0";
src =
if stdenv.system == "x86_64-linux" then
fetchurl {
url = "${baseURL}/google-talkplugin_${version}-1_amd64.deb";
- sha256 = "1g7kpz2lzzz1gri5rd3isp7cfyls6gzwcw2kc8jgrgrixq9iixfd";
+ sha1 = "fc830f4c7f5816f4578ec73e6d4aef059ad4a0b1";
}
else if stdenv.system == "i686-linux" then
fetchurl {
url = "${baseURL}/google-talkplugin_${version}-1_i386.deb";
- sha256 = "1z0zbblzlky9nyifxmnl49v4zafpqp3l08b9v1486sinm35rf58r";
+ sha1 = "9b7043c3585b3479ba11aabb7b8af755a61df963";
}
else throw "Google Talk does not support your platform.";
diff --git a/pkgs/applications/networking/browsers/mozilla-plugins/mplayerplug-in/default.nix b/pkgs/applications/networking/browsers/mozilla-plugins/mplayerplug-in/default.nix
index 6ee1735f76c7671d89b11cd173fbd07082107216..5b6b2176d47e681613580f1020c4e8a82f9ae587 100644
--- a/pkgs/applications/networking/browsers/mozilla-plugins/mplayerplug-in/default.nix
+++ b/pkgs/applications/networking/browsers/mozilla-plugins/mplayerplug-in/default.nix
@@ -34,6 +34,6 @@ stdenv.mkDerivation rec {
meta = {
description = "A browser plugin that uses mplayer to play digital media from websites";
homepage = http://mplayerplug-in.sourceforge.net/;
- licenses = [ "GPLv2+" "LGPLv2+" "MPLv1+" ];
+ license = [ "GPLv2+" "LGPLv2+" "MPLv1+" ];
};
}
diff --git a/pkgs/applications/networking/browsers/mozilla-plugins/nspluginwrapper/default.nix b/pkgs/applications/networking/browsers/mozilla-plugins/nspluginwrapper/default.nix
index 7cb1abf3153746e158967e99db299af477cf781f..51511621dce6dc45fa8fb834d0a0928fbde81483 100644
--- a/pkgs/applications/networking/browsers/mozilla-plugins/nspluginwrapper/default.nix
+++ b/pkgs/applications/networking/browsers/mozilla-plugins/nspluginwrapper/default.nix
@@ -26,6 +26,8 @@ stdenv.mkDerivation rec {
buildInputs = [which pkgconfig file glib gtk2 gtk3 curl];
+ preferLocalBuild = true;
+
meta = {
description = ''A wrapper to run browser plugins out-of-process'';
homepage = "http://nspluginwrapper.org/";
diff --git a/pkgs/applications/networking/browsers/uzbl/default.nix b/pkgs/applications/networking/browsers/uzbl/default.nix
index 4c6458d909fd9eb3e416722fa184a65f9a1c18ab..81b4f5c01d9a85f5039cd264a3d0d53d58a6d0f7 100644
--- a/pkgs/applications/networking/browsers/uzbl/default.nix
+++ b/pkgs/applications/networking/browsers/uzbl/default.nix
@@ -1,45 +1,39 @@
-a :
-let
- fetchgit = a.fetchgit;
+{ stdenv, fetchurl, pkgconfig, python, makeWrapper, pygtk
+, webkit, glib_networking, gsettings_desktop_schemas
+}:
- buildInputs = with a; [
- libsoup pkgconfig webkit gtk makeWrapper
- kbproto glib pango cairo gdk_pixbuf atk
- python3
- ];
-in
-rec {
- src = fetchgit {
- url = "https://github.com/Dieterbe/uzbl.git";
- rev = "refs/tags/2012.05.14";
- sha256 = "1crvikb0qqsx5qb003i4w7ywh72psl37gjslrj5hx2fd2f215l0l";
- };
+stdenv.mkDerivation rec {
+ name = "uzbl-20120514";
- name = "uzbl-git";
+ meta = with stdenv.lib; {
+ description = "Tiny externally controllable webkit browser";
+ homepage = "http://uzbl.org/";
+ license = licenses.gpl3;
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ raskin ];
+ };
- inherit buildInputs;
- configureFlags = [];
+ src = fetchurl {
+ name = "${name}.tar.gz";
+ url = "https://github.com/uzbl/uzbl/archive/2012.05.14.tar.gz";
+ sha256 = "1flpf0rg0c3n9bjifr37zxljn9yxslg8vkll7ghkm341x76cbkwn";
+ };
- /* doConfigure should be removed if not needed */
- phaseNames = ["addInputs" "setVars" "doMakeInstall" "doWrap"];
+ preConfigure = ''
+ makeFlags="$makeFlags PREFIX=$out"
+ makeFlags="$makeFlags PYINSTALL_EXTRA=--prefix=$out"
+ '';
- setVars = a.noDepEntry (''
- export NIX_LDFLAGS="$NIX_LDFLAGS -L${a.libX11}/lib -lX11"
- '');
+ preFixup = ''
+ for f in $out/bin/*; do
+ wrapProgram $f \
+ --prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
+ --prefix PYTHONPATH : "$PYTHONPATH" \
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH:$out/share"
+ done
+ '';
- doWrap = a.makeManyWrappers "$out/bin/uzbl-core"
- ''
- --prefix GST_PLUGIN_PATH : ${a.webkit.gstreamer}/lib/gstreamer-* \
- --prefix GST_PLUGIN_PATH : ${a.webkit.gst_plugins_base}/lib/gstreamer-* \
- --prefix GST_PLUGIN_PATH : ${a.webkit.gst_plugins_good}/lib/gstreamer-* \
- --prefix GST_PLUGIN_PATH : ${a.webkit.gst_ffmpeg}/lib/gstreamer-* \
- --prefix GIO_EXTRA_MODULES : ${a.glib_networking}/lib/gio/modules
- '';
+ nativeBuildInputs = [ pkgconfig python makeWrapper ];
- installFlags = "PREFIX=$out PYINSTALL_EXTRA=\"--prefix=$out\"";
-
- meta = {
- description = "Tiny externally controllable webkit browser";
- maintainers = [a.lib.maintainers.raskin];
- };
+ buildInputs = [ webkit pygtk ];
}
diff --git a/pkgs/applications/networking/browsers/vimb/default.nix b/pkgs/applications/networking/browsers/vimb/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..6cb52be775c6cdb5989684f3a91c9b5e7721c4af
--- /dev/null
+++ b/pkgs/applications/networking/browsers/vimb/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, pkgconfig, libsoup, webkit, gtk, glib_networking
+, gsettings_desktop_schemas, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+ name = "vimb-${version}";
+ version = "2.2";
+
+ src = fetchurl {
+ url = "https://github.com/fanglingsu/vimb/archive/${version}.tar.gz";
+ sha256 = "18gig6rcxv0i4a8mz3jv29zpj0323zw45jsg1ycx61a08rzag60m";
+ };
+
+ # Nixos default ca bundle
+ patchPhase = ''
+ sed -i s,/etc/ssl/certs/ca-certificates.crt,/etc/ssl/certs/ca-bundle.crt, src/default.h
+ '';
+
+ buildInputs = [ makeWrapper gtk libsoup pkgconfig webkit gsettings_desktop_schemas ];
+
+ makeFlags = [ "PREFIX=$(out)" ];
+
+ preFixup = ''
+ wrapProgram "$out/bin/vimb" \
+ --prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
+ '';
+
+ meta = {
+ description = "A Vim-like browser";
+ longDescription = ''
+ A fast and lightweight vim like web browser based on the webkit web
+ browser engine and the GTK toolkit. Vimb is modal like the great vim
+ editor and also easily configurable during runtime. Vimb is mostly
+ keyboard driven and does not detract you from your daily work.
+ '';
+ homepage = "http://fanglingsu.github.io/vimb/";
+ license = stdenv.lib.licenses.gpl3;
+ maintainers = [ stdenv.lib.maintainers.rickynils ];
+ platforms = with stdenv.lib.platforms; linux;
+ };
+}
diff --git a/pkgs/applications/networking/browsers/vimprobable2/default.nix b/pkgs/applications/networking/browsers/vimprobable2/default.nix
index ee8e4b8434a4b04a3028a113013495912c07f1ac..8e1e00795d24c47a75acc24bb5b4b521d4b4995f 100644
--- a/pkgs/applications/networking/browsers/vimprobable2/default.nix
+++ b/pkgs/applications/networking/browsers/vimprobable2/default.nix
@@ -2,25 +2,28 @@
pkgconfig, webkit, gsettings_desktop_schemas }:
stdenv.mkDerivation rec {
- version = "1.2.1";
+ version = "1.4.2";
name = "vimprobable2-${version}";
src = fetchurl {
url = "mirror://sourceforge/vimprobable/vimprobable2_${version}.tar.bz2";
- sha256 = "19zx1k3s2gnhzzd2wpyqsk151w9p52ifl64xaz9a6qkgvrxlli8p";
+ sha256 = "13jdximksh9r3cgd2f8vms0pbsn3x0gxvyqdqiw16xp5fmdx5kzr";
};
# Nixos default ca bundle
patchPhase = ''
- sed -i s,/etc/ssl/certs/ca-certificates.crt,/etc/ca-bundle.crt, config.h
+ sed -i s,/etc/ssl/certs/ca-certificates.crt,/etc/ssl/certs/ca-bundle.crt, config.h
'';
- buildInputs = [ makeWrapper gtk libsoup libX11 perl pkgconfig webkit ];
+ buildInputs = [ makeWrapper gtk libsoup libX11 perl pkgconfig webkit gsettings_desktop_schemas ];
installPhase = ''
make PREFIX=/ DESTDIR=$out install
+ '';
+
+ preFixup = ''
wrapProgram "$out/bin/vimprobable2" \
--prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
- --prefix XDG_DATA_DIRS : "${gsettings_desktop_schemas}/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
'';
meta = {
diff --git a/pkgs/applications/networking/browsers/w3m/default.nix b/pkgs/applications/networking/browsers/w3m/default.nix
index 5953111fad5965e5a52e9693c2dc80d2a25541b1..5f046f7b7328f0525bb4312b29c45c8c906463a5 100644
--- a/pkgs/applications/networking/browsers/w3m/default.nix
+++ b/pkgs/applications/networking/browsers/w3m/default.nix
@@ -39,8 +39,9 @@ stdenv.mkDerivation rec {
enableParallelBuilding = false;
- meta = {
+ meta = with stdenv.lib; {
homepage = http://w3m.sourceforge.net/;
description = "A text-mode web browser";
+ maintainers = maintainers.mornfall;
};
}
diff --git a/pkgs/applications/networking/cluster/hadoop/default.nix b/pkgs/applications/networking/cluster/hadoop/default.nix
index ef2f16e3193616b3d63917e5ae529e4d0abf946b..f6e86c6289cf082d3725904ca54d221ac7ecf271 100644
--- a/pkgs/applications/networking/cluster/hadoop/default.nix
+++ b/pkgs/applications/networking/cluster/hadoop/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
- name = "hadoop-2.0.2-alpha";
+ name = "hadoop-2.2.0";
src = fetchurl {
url = "mirror://apache/hadoop/common/${name}/${name}.tar.gz";
- sha256 = "1r7ailmqhny3pl5nb8bcblnhckszy6hb9n58kwa3s4b8qfk87gkb";
+ sha256 = "0r0kx8arsrvmcfy0693hpv4cz3i0razvk1xa3yhlf3ybb80a8106";
};
buildInputs = [ makeWrapper ];
diff --git a/pkgs/applications/networking/cluster/spark/default.nix b/pkgs/applications/networking/cluster/spark/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..61f2d0c6e202940585ee9d0fac4c6f6541c052c3
--- /dev/null
+++ b/pkgs/applications/networking/cluster/spark/default.nix
@@ -0,0 +1,127 @@
+{ stdenv, fetchurl, jre, bash, simpleBuildTool, python27Packages }:
+
+stdenv.mkDerivation rec {
+ name = "spark-${version}";
+ version = "0.9.0";
+
+ src = fetchurl {
+ url = "http://d3kbcqa49mib13.cloudfront.net/${name}-incubating-bin-cdh4.tgz";
+ sha256 = "0dgirq2ws25accijijanqij6d1mwxkrcqkmq1xsslfpz26svs1w1";
+ };
+
+ unpackPhase = ''tar zxf $src'';
+
+ untarDir = "spark-${version}-incubating-bin-cdh4";
+ installPhase = ''
+ set -x
+ mkdir -p $out/lib $out/bin
+ mv ${untarDir} $out/lib
+
+ cat > $out/bin/spark-class < []" >&2
+ exit 1
+ fi
+
+ export SPARK_MEM=\''${SPARK_MEM:-1024m}
+
+ JAVA_OPTS=""
+ JAVA_OPTS="\$JAVA_OPTS -Djava.library.path=\"\$SPARK_LIBRARY_PATH\""
+ JAVA_OPTS="\$JAVA_OPTS -Xms\$SPARK_MEM -Xmx\$SPARK_MEM"
+ export JAVA_OPTS
+
+ CLASSPATH=\`$out/lib/${untarDir}/bin/compute-classpath.sh\`
+ export CLASSPATH
+
+ exec ${jre}/bin/java -cp "\$CLASSPATH" \$JAVA_OPTS "\$@"
+ EOF
+ chmod +x $out/bin/spark-class
+
+ cat > $out/bin/spark-shell </dev/null)
+ if [[ ! \$? ]]; then
+ saved_stty=""
+ fi
+
+ $out/bin/spark-class \$OPTIONS org.apache.spark.repl.Main "\$@"
+
+ exit_status=\$?
+ onExit
+ EOF
+ chmod +x $out/bin/spark-shell
+
+ cat > $out/bin/pyspark < $out/bin/spark-upload-scala < $out/bin/spark-upload-python <.
patches = [ ./find-ca-bundle.patch ];
postInstall = ''
@@ -19,12 +20,11 @@ stdenv.mkDerivation {
chmod 555 "$out/bin/snipe"
'';
- meta = {
+ meta = with stdenv.lib; {
description = "Simple, lightweight tool for sniping eBay auctions";
- homepage = "http://esnipe.rsourceforge.net";
- license = "GPLv2";
-
- platforms = stdenv.lib.platforms.all;
- maintainers = [ stdenv.lib.maintainers.simons ];
+ homepage = http://esnipe.rsourceforge.net;
+ license = licenses.gpl2;
+ maintainers = with maintainers; [ lovek323 simons ];
+ platforms = platforms.all;
};
}
diff --git a/pkgs/applications/networking/feedreaders/newsbeuter/default.nix b/pkgs/applications/networking/feedreaders/newsbeuter/default.nix
index 029a6f8e633960e5fa6e17047c2a5f6a54476e04..e5f18f72cedcbd4bc7b793c2afdc6c504e0e3786 100644
--- a/pkgs/applications/networking/feedreaders/newsbeuter/default.nix
+++ b/pkgs/applications/networking/feedreaders/newsbeuter/default.nix
@@ -1,23 +1,24 @@
-{ stdenv, fetchurl, sqlite, curl, pkgconfig, libxml2, stfl, json_c, ncurses
+{ stdenv, fetchurl, sqlite, curl, pkgconfig, libxml2, stfl, json-c-0-11, ncurses
, gettext, libiconvOrEmpty, makeWrapper, perl }:
stdenv.mkDerivation rec {
- name = "newsbeuter-2.7";
+ name = "newsbeuter-2.8";
src = fetchurl {
url = "http://www.newsbeuter.org/downloads/${name}.tar.gz";
- sha256 = "0flhzzlbdirjmrq738gmcxqqnifg3kb7plcwqcxshpizmjkhswp6";
+ sha256 = "013qi8yghpms2qq1b3xbrlmfgpj0ybgk0qhj245ni4kpxila0wn8";
+
};
buildInputs
# use gettext instead of libintlOrEmpty so we have access to the msgfmt
# command
- = [ pkgconfig sqlite curl libxml2 stfl json_c ncurses gettext perl ]
+ = [ pkgconfig sqlite curl libxml2 stfl json-c-0-11 ncurses gettext perl ]
++ libiconvOrEmpty
++ stdenv.lib.optional stdenv.isDarwin makeWrapper;
preBuild = ''
- sed -i -e 104,108d config.sh
+ sed -i -e 110,114d config.sh
sed -i "1 s%^.*$%#!${perl}/bin/perl%" txt2h.pl
export LDFLAGS=-lncursesw
'';
diff --git a/pkgs/applications/networking/feedreaders/newsbeuter/dev.nix b/pkgs/applications/networking/feedreaders/newsbeuter/dev.nix
index 17e97d92b89794c2b3adbf02fa6015e2d2895215..4390360ff9e8238fea8d7e0e3a3701ddfa2c23a3 100644
--- a/pkgs/applications/networking/feedreaders/newsbeuter/dev.nix
+++ b/pkgs/applications/networking/feedreaders/newsbeuter/dev.nix
@@ -2,11 +2,12 @@
, gettext, libiconvOrEmpty, makeWrapper, perl }:
stdenv.mkDerivation rec {
- name = "newsbeuter-dev-20131118";
+ name = "newsbeuter-dev-20140309";
src = fetchgit {
url = "https://github.com/akrennmair/newsbeuter.git";
- rev = "18b73f7d44a99a698d4878fe7d226f55842132c2";
+ rev = "1427bdb0705806368db39576a9b803df82fa0415";
+ sha256 = "b29a304a46bf56b439d0d35ea586f7fd0fbf1a5565dca95de76e774885d8b64b";
};
buildInputs
@@ -17,7 +18,7 @@ stdenv.mkDerivation rec {
++ stdenv.lib.optional stdenv.isDarwin makeWrapper;
preBuild = ''
- sed -i -e 104,108d config.sh
+ sed -i -e 110,114d config.sh
sed -i "1 s%^.*$%#!${perl}/bin/perl%" txt2h.pl
export LDFLAGS=-lncursesw
'';
diff --git a/pkgs/applications/networking/ftp/filezilla/default.nix b/pkgs/applications/networking/ftp/filezilla/default.nix
index b7c9a76e151fa139f9796250457b293de4053b8a..a8b4cfaf92663547b290dd0c352395725da0c211 100644
--- a/pkgs/applications/networking/ftp/filezilla/default.nix
+++ b/pkgs/applications/networking/ftp/filezilla/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, dbus, gnutls2, wxGTK28, libidn, tinyxml, gettext
+{ stdenv, fetchurl, dbus, gnutls, wxGTK28, libidn, tinyxml, gettext
, pkgconfig, xdg_utils, gtk2, sqlite }:
let version = "3.7.3"; in
@@ -15,7 +15,7 @@ stdenv.mkDerivation {
];
buildInputs = [
- dbus gnutls2 wxGTK28 libidn tinyxml gettext pkgconfig xdg_utils gtk2 sqlite
+ dbus gnutls wxGTK28 libidn tinyxml gettext pkgconfig xdg_utils gtk2 sqlite
];
meta = with stdenv.lib; {
diff --git a/pkgs/applications/networking/instant-messengers/ekiga/default.nix b/pkgs/applications/networking/instant-messengers/ekiga/default.nix
index 276df1ae7a158fd073dd2bfd1b463fea445fffbb..9de14cae6f0f61d9d1b198759bd4d52f68a7efcc 100644
--- a/pkgs/applications/networking/instant-messengers/ekiga/default.nix
+++ b/pkgs/applications/networking/instant-messengers/ekiga/default.nix
@@ -2,7 +2,7 @@ x@{builderDefsPackage
, cyrus_sasl, gettext, openldap, ptlib, opal, GConf, libXv, rarian, intltool
, perl, perlXMLParser, evolution_data_server, gnome_doc_utils, avahi
, libsigcxx, gtk, dbus_glib, libnotify, libXext, xextproto, automake
- , autoconf, pkgconfig, libxml2, videoproto, unixODBC, db4, nspr, nss, zlib
+ , autoconf, pkgconfig, libxml2, videoproto, unixODBC, db, nspr, nss, zlib
, libXrandr, randrproto, which, libxslt, libtasn1, gmp, nettle
, ...}:
builderDefsPackage
diff --git a/pkgs/applications/networking/instant-messengers/jitsi/default.nix b/pkgs/applications/networking/instant-messengers/jitsi/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e6dd6569a55f14177f3cbd970b5bc5ffd8dd2b19
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/jitsi/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, makeDesktopItem, unzip, ant, jdk }:
+
+stdenv.mkDerivation rec {
+
+ name = "jitsi-${version}";
+ version = "2.4.4997";
+
+ src = fetchurl {
+ url = "https://download.jitsi.org/jitsi/src/jitsi-src-${version}.zip";
+ sha256 = "f1c2688d7d6bf1916fed3b8b105a785662980c5b297dcab3c9e7d272647ef825";
+ };
+
+ patches = [ ./jitsi.patch ];
+
+ jitsiItem = makeDesktopItem {
+ name = "Jitsi";
+ exec = "jitsi";
+ comment = "VoIP and Instant Messaging client";
+ desktopName = "Jitsi";
+ genericName = "Instant Messaging";
+ categories = "Application;Internet;";
+ };
+
+ buildInputs = [unzip ant jdk];
+
+ buildPhase = ''ant make'';
+
+ installPhase = ''
+ mkdir -p $out
+ cp -a lib $out/
+ cp -a sc-bundles $out/
+ mkdir $out/bin
+ cp resources/install/generic/run.sh $out/bin/jitsi
+ chmod +x $out/bin/jitsi
+ sed -i 's| java | ${jdk}/bin/java |' $out/bin/jitsi
+ patchShebangs $out
+ '';
+
+ meta = {
+ homepage = https://jitsi.org/;
+ description = "Open Source Video Calls and Chat";
+ license = stdenv.lib.licenses.lgpl21Plus.shortName;
+ platforms = stdenv.lib.platforms.linux;
+ };
+
+}
diff --git a/pkgs/applications/networking/instant-messengers/jitsi/jitsi.patch b/pkgs/applications/networking/instant-messengers/jitsi/jitsi.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9163cecd175b264c843e077a7b300e4aecd3376b
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/jitsi/jitsi.patch
@@ -0,0 +1,27 @@
+--- /home/dario/Downloads/jitsi/resources/install/generic/run.sh 2013-11-01 15:37:21.000000000 +0000
++++ jitsi/resources/install/generic/run.sh 2014-03-04 11:52:30.796397567 +0000
+@@ -1,4 +1,9 @@
+-mkdir -p $HOME/.sip-communicator/log
++#! /bin/bash
++# A modified version of the generic run.sh
++
++#mkdir -p $HOME/.sip-communicator/log
++
++cd "$( dirname "$( dirname "${BASH_SOURCE[0]}" )" )"
+
+ # Get architecture
+ ARCH=`uname -m | sed -e s/x86_64/64/ -e s/i.86/32/`
+@@ -6,10 +11,12 @@
+ # Additionnal JVM arguments
+ CLIENTARGS=""
+
++NATIVELIBS="lib/native/linux-64"
+ if [ $ARCH -eq 32 ]
+ then
+ CLIENTARGS="-client -Xmx256m"
++ NATIVELIBS="lib/native/linux"
+ fi
+
+ export PATH=$PATH:native
+-java $CLIENTARGS -classpath "lib/felix.jar:sc-bundles/sc-launcher.jar:sc-bundles/util.jar:lib/" -Djava.library.path=native -Dfelix.config.properties=file:./lib/felix.client.run.properties -Djava.util.logging.config.file=lib/logging.properties net.java.sip.communicator.launcher.SIPCommunicator
++exec java $CLIENTARGS -classpath "lib/felix.jar:sc-bundles/sc-launcher.jar:sc-bundles/util.jar:lib/" -Djava.library.path=$NATIVELIBS -Dfelix.config.properties=file:lib/felix.client.run.properties -Djava.util.logging.config.file=lib/logging.properties net.java.sip.communicator.launcher.SIPCommunicator
diff --git a/pkgs/applications/networking/instant-messengers/kadu/cmake.patch b/pkgs/applications/networking/instant-messengers/kadu/cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bb2d2d39d25a5c8d64e4b6f73fffb2a97418324b
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/kadu/cmake.patch
@@ -0,0 +1,13 @@
+diff -ru kadu-0.12.2.orig/plugins/jabber_protocol/3rdparty/CMakeLists.txt kadu-0.12.2/plugins/jabber_protocol/3rdparty/CMakeLists.txt
+--- kadu-0.12.2.orig/plugins/jabber_protocol/3rdparty/CMakeLists.txt 2012-08-30 16:13:17.000000000 +0200
++++ kadu-0.12.2/plugins/jabber_protocol/3rdparty/CMakeLists.txt 2014-02-15 10:20:33.368716013 +0100
+@@ -26,7 +26,7 @@
+ get_filename_component (_basename ${_current_MOC} NAME_WE)
+ set (_header ${_abs_FILE})
+ set (_moc ${_abs_PATH}/${_current_MOC})
+- QT4_CREATE_MOC_COMMAND (${_header} ${_moc} "${_moc_INCS}" "")
++ QT4_CREATE_MOC_COMMAND (${_header} ${_moc} "${_moc_INCS}" "" "")
+ MACRO_ADD_FILE_DEPENDENCIES (${_abs_FILE} ${_moc})
+ endforeach (_current_MOC_INC)
+ endif (_match)
+Only in kadu-0.12.2/plugins/jabber_protocol/3rdparty: CMakeLists.txt~
diff --git a/pkgs/applications/networking/instant-messengers/kadu/default.nix b/pkgs/applications/networking/instant-messengers/kadu/default.nix
index 03cbb1ce073762b01c2ad6a1497754b449c6efc2..4e176ec56dcba40129cf2f552da4b07e0df87afa 100644
--- a/pkgs/applications/networking/instant-messengers/kadu/default.nix
+++ b/pkgs/applications/networking/instant-messengers/kadu/default.nix
@@ -26,6 +26,7 @@ stdenv.mkDerivation {
sed -i -e '/mpd_mediaplayer/d' \
-e '/encryption_ng/d' \
-e '/encryption_ng_simlite/d' Plugins.cmake
+ patch -p1 < ${./cmake.patch}
'';
NIX_LDFLAGS="-lX11";
diff --git a/pkgs/applications/networking/instant-messengers/pidgin/default.nix b/pkgs/applications/networking/instant-messengers/pidgin/default.nix
index d0652adcb0d6b8a03a85afc89e34206b8dcb7545..6e6fd6d0eb6cd853bd6e0e7901a3ec470a56e6e7 100644
--- a/pkgs/applications/networking/instant-messengers/pidgin/default.nix
+++ b/pkgs/applications/networking/instant-messengers/pidgin/default.nix
@@ -21,10 +21,10 @@
} :
stdenv.mkDerivation rec {
- name = "pidgin-2.10.7";
+ name = "pidgin-2.10.9";
src = fetchurl {
url = "mirror://sourceforge/pidgin/${name}.tar.bz2";
- sha256 = "14piyx4xpc3l8286x4nh5pna2wfyn9cv0qa29br1q3d2xja2k8zb";
+ sha256 = "06gka47myl9f5x0flkq74ml75akkf28rx9sl8pm3wqkzazc2wdnw";
};
inherit nss ncurses;
@@ -51,8 +51,11 @@ stdenv.mkDerivation rec {
configureFlags="--with-nspr-includes=${nspr}/include/nspr --with-nspr-libs=${nspr}/lib --with-nss-includes=${nss}/include/nss --with-nss-libs=${nss}/lib --with-ncurses-headers=${ncurses}/include --disable-meanwhile --disable-nm --disable-tcl"
+ (lib.optionalString (gnutls != null) " --enable-gnutls=yes --enable-nss=no")
;
- meta = {
+ meta = with stdenv.lib; {
description = "Pidgin IM - XMPP(Jabber), AIM/ICQ, IRC, SIP etc client";
homepage = http://pidgin.im;
+ license = licenses.gpl2Plus;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.vcunat ];
};
}
diff --git a/pkgs/applications/networking/instant-messengers/sflphone/default.nix b/pkgs/applications/networking/instant-messengers/sflphone/default.nix
index 2401d796bfdc2f4d7a2aeba5905c2ce1f18f691d..a31a682abf88978e651f5ac1be0c4765edd79a37 100644
--- a/pkgs/applications/networking/instant-messengers/sflphone/default.nix
+++ b/pkgs/applications/networking/instant-messengers/sflphone/default.nix
@@ -75,8 +75,10 @@ rec {
'';
# gtk3 programs have the runtime dependency on XDG_DATA_DIRS
- postInstall = ''
- wrapProgram $out/bin/sflphone* --prefix XDG_DATA_DIRS ":" ${gtk}/share
+ preFixup = ''
+ for f in "$out/bin/sflphone" "$out/bin/sflphone-client-gnome"; do
+ wrapProgram $f --prefix XDG_DATA_DIRS ":" "${gtk}/share:$GSETTINGS_SCHEMAS_PATH"
+ done
'';
buildInputs = [ daemon pkgconfig gtk glib dbus_glib libnotify intltool makeWrapper ];
diff --git a/pkgs/applications/networking/instant-messengers/skype/default.nix b/pkgs/applications/networking/instant-messengers/skype/default.nix
index ebd84ff47b89bfaadcc456cbc6eaf8d18fced31e..20a304952a7a81d33b959fdbbda7e6364ad8d44e 100644
--- a/pkgs/applications/networking/instant-messengers/skype/default.nix
+++ b/pkgs/applications/networking/instant-messengers/skype/default.nix
@@ -5,11 +5,11 @@
assert stdenv.system == "i686-linux";
stdenv.mkDerivation rec {
- name = "skype-4.2.0.11";
+ name = "skype-4.2.0.13";
src = fetchurl {
url = "http://download.skype.com/linux/${name}.tar.bz2";
- sha256 = "0kh66p50m3x4ql6j8ciz73c30npcizd00ya9qrhid711rar0mlw7";
+ sha256 = "137kp6c0v4z7n7pp4hwrx4gjgk4knwj815dc6swh44lb5cj1c5m5";
};
buildInputs =
diff --git a/pkgs/applications/networking/instant-messengers/telegram-cli/default.nix b/pkgs/applications/networking/instant-messengers/telegram-cli/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..51639f6050dcde4f176d5e039978aa13a99e8813
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/telegram-cli/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchgit, libconfig, lua5_2, openssl, readline, zlib
+}:
+
+stdenv.mkDerivation rec {
+ name = "telegram-cli";
+
+ src = fetchgit {
+ url = "https://github.com/vysheng/tg.git";
+ rev = "ac6079a00ac66bb37a3179a82af130b41ec39bc9";
+ sha256 = "1rpwnyzmqk7p97n5pd00m5c6rypc39mb3hs94qxxrdcpwpgcb73q";
+ };
+
+ buildInputs = [ libconfig lua5_2 openssl readline zlib ];
+
+ installPhase = ''
+ mkdir -p $out/bin
+ cp ./telegram $out/bin/telegram-wo-key
+ cp ./tg.pub $out/
+ cat > $out/bin/telegram < $out/share/applications/thunderbird.desktop < jackaudio != null;
+assert speechdSupport -> speechd != null;
+
+let
+ optional = stdenv.lib.optional;
+ optionalString = stdenv.lib.optionalString;
+in
stdenv.mkDerivation rec {
name = "mumble-" + version;
- version = "1.2.4";
+ version = "1.2.5";
src = fetchurl {
url = "mirror://sourceforge/mumble/${name}.tar.gz";
- sha256 = "16wwj6gwcnyjlnzh7wk0l255ldxmbwx0wi652sdp20lsv61q7kx1";
+ sha256 = "1bsgains6xgpgpd1b5bq682z0kswp5fcjh2cir4c4qkndya5clci";
};
- patchPhase = ''
- patch -p1 < ${ ./mumble-jack-support.patch }
- '';
+ patches = optional jackSupport ./mumble-jack-support.patch;
configurePhase = ''
qmake CONFIG+=no-g15 CONFIG+=no-update CONFIG+=no-server \
CONFIG+=no-embed-qt-translations CONFIG+=packaged \
CONFIG+=bundled-celt CONFIG+=no-bundled-opus \
+ ${optionalString (!speechdSupport) "CONFIG+=no-speechd"} \
+ ${optionalString jackSupport "CONFIG+=no-oss CONFIG+=no-alsa CONFIG+=jackaudio"} \
CONFIG+=no-bundled-speex
- ''
- + stdenv.lib.optionalString jackSupport ''
- CONFIG+=no-oss CONFIG+=no-alsa CONFIG+=jackaudio
'';
- buildInputs = [ qt4 boost speechd protobuf libsndfile speex
+ buildInputs = [ qt4 boost protobuf libsndfile speex
libopus avahi pkgconfig ]
- ++ (stdenv.lib.optional jackSupport jackaudio);
+ ++ (optional jackSupport jackaudio)
+ ++ (optional speechdSupport speechd);
installPhase = ''
mkdir -p $out
cp -r ./release $out/bin
'';
- meta = {
- homepage = http://mumble.sourceforge.net/;
+ meta = with stdenv.lib; {
+ homepage = "http://mumble.sourceforge.net/";
description = "Low-latency, high quality voice chat software";
- license = "BSD";
- platforms = with stdenv.lib.platforms; linux;
- maintainers = with stdenv.lib.maintainers; [viric];
+ license = licenses.bsd3;
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ viric ];
};
}
diff --git a/pkgs/applications/networking/mumble/murmur.nix b/pkgs/applications/networking/mumble/murmur.nix
index b40632384c2bd0a50002a72695c4975dea1f414a..b886896c071fc1a8c84121a8b2a6e10e46bdc6ed 100644
--- a/pkgs/applications/networking/mumble/murmur.nix
+++ b/pkgs/applications/networking/mumble/murmur.nix
@@ -1,30 +1,46 @@
-{ stdenv, fetchurl, qt4, boost, protobuf, avahi, libcap, pkgconfig }:
+{ stdenv, fetchurl, qt4, boost, protobuf
+, avahi, libcap, pkgconfig
+, iceSupport ? false
+, zeroc_ice ? null
+}:
+assert iceSupport -> zeroc_ice != null;
+
+let
+ optional = stdenv.lib.optional;
+ optionalString = stdenv.lib.optionalString;
+in
stdenv.mkDerivation rec {
name = "murmur-" + version;
- version = "1.2.4";
+ version = "1.2.5";
src = fetchurl {
url = "mirror://sourceforge/mumble/mumble-${version}.tar.gz";
- sha256 = "16wwj6gwcnyjlnzh7wk0l255ldxmbwx0wi652sdp20lsv61q7kx1";
+ sha256 = "1bsgains6xgpgpd1b5bq682z0kswp5fcjh2cir4c4qkndya5clci";
};
+ patchPhase = optional iceSupport ''
+ sed -i 's,/usr/share/Ice/,${zeroc_ice}/,g' src/murmur/murmur.pro
+ '';
+
configurePhase = ''
- qmake CONFIG+=no-client CONFIG+=no-ice CONFIG+=no-embed-qt
+ qmake CONFIG+=no-client CONFIG+=no-embed-qt \
+ ${optionalString (!iceSupport) "CONFIG+=no-ice"}
'';
- buildInputs = [ qt4 boost protobuf avahi libcap pkgconfig ];
+ buildInputs = [ qt4 boost protobuf avahi libcap pkgconfig ]
+ ++ optional iceSupport [ zeroc_ice ];
installPhase = ''
mkdir -p $out
cp -r ./release $out/bin
'';
- meta = {
- homepage = http://mumble.sourceforge.net/;
+ meta = with stdenv.lib; {
+ homepage = "http://mumble.sourceforge.net/";
description = "Low-latency, high quality voice chat software";
- license = "BSD";
- platforms = with stdenv.lib.platforms; linux;
- maintainers = with stdenv.lib.maintainers; [viric];
+ license = licenses.bsd3;
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ viric ];
};
}
diff --git a/pkgs/applications/networking/newsreaders/liferea/default.nix b/pkgs/applications/networking/newsreaders/liferea/default.nix
index 093b801401dcaca8d3d011028ca63eb95c961e37..650e3237fe417c8fd6c369f0449bc16d0d2caae1 100644
--- a/pkgs/applications/networking/newsreaders/liferea/default.nix
+++ b/pkgs/applications/networking/newsreaders/liferea/default.nix
@@ -1,30 +1,57 @@
-{ stdenv, fetchurl, pkgconfig, intltool, glib, gtk2, gnome2 /*just GConf*/
-, libsoup, libunique, libxslt, webkit_gtk2, json_glib
-, libnotify /*optional*/ }:
+{ stdenv, fetchurl, pkgconfig, intltool, python, pygobject3
+, glib, gnome3, pango, libxml2, libxslt, sqlite, libsoup, glib_networking
+, webkitgtk, json_glib, gobjectIntrospection, gst_all_1
+, libnotify
+, makeWrapper
+}:
-let version = "1.8.15";
+let pname = "liferea";
+ version = "1.10.8";
in
stdenv.mkDerivation rec {
- name = "liferea-${version}";
+ name = "${pname}-${version}";
src = fetchurl {
- url = "mirror://sourceforge/liferea/Liferea%20Stable/${version}/${name}.tar.bz2";
- sha256 = "12hhdl5biwcvr9ds7pdhhvlp4vggjix6xm4z5pnfaz53ai2dnc99";
+ url = "https://github.com/lwindolf/${pname}/releases/download/v${version}/${name}.tar.bz2";
+ sha256 = "1d3icma90mj0nai20pfhxp4k4l33iwkkkcddb9vg5hi4yq4wpmwx";
};
- buildInputs = [
- pkgconfig intltool gtk2 gnome2.GConf
- libsoup libunique libxslt webkit_gtk2 json_glib
+ buildInputs = with gst_all_1; [
+ pkgconfig intltool python
+ glib gnome3.gtk pango libxml2 libxslt sqlite libsoup
+ webkitgtk json_glib gobjectIntrospection gnome3.gsettings_desktop_schemas
+ gnome3.libpeas gnome3.dconf
+ gst-plugins-base gst-plugins-good gst-plugins-bad
+ gnome3.libgnome_keyring
libnotify
+ makeWrapper
];
preFixup = ''
- rm $out/share/icons/hicolor/icon-theme.cache'';
+ rm $out/share/icons/hicolor/icon-theme.cache
+
+ for f in "$out"/bin/*; do
+ wrapProgram "$f" \
+ --prefix PYTHONPATH : "$(toPythonPath $out):$(toPythonPath ${pygobject3})" \
+ --prefix LD_LIBRARY_PATH : "${gnome3.libgnome_keyring}/lib" \
+ --prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
+ --prefix GIO_EXTRA_MODULES : "${gnome3.dconf}/lib/gio/modules:${glib_networking}/lib/gio/modules" \
+ --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS:${gnome3.gnome_icon_theme}/share:${gnome3.gtk}/share:$out/share:$GSETTINGS_SCHEMAS_PATH"
+ done
+ '';
meta = {
description = "A GTK-based news feed agregator";
homepage = http://lzone.de/liferea/;
- maintainers = [ stdenv.lib.maintainers.vcunat ];
+ license = stdenv.lib.licenses.gpl2Plus;
+ maintainers = with stdenv.lib.maintainers; [ vcunat romildo ];
platforms = stdenv.lib.platforms.linux;
+
+ longDescription = ''
+ Liferea (Linux Feed Reader) is an RSS/RDF feed reader.
+ It's intended to be a clone of the Windows-only FeedReader.
+ It can be used to maintain a list of subscribed feeds,
+ browse through their items, and show their contents.
+ '';
};
}
diff --git a/pkgs/applications/networking/newsreaders/slrn/default.nix b/pkgs/applications/networking/newsreaders/slrn/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c933460af43b967752afd4cd66a286939ac1565a
--- /dev/null
+++ b/pkgs/applications/networking/newsreaders/slrn/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl,
+slang, ncurses
+}:
+
+let version = "1.0.1"; in
+
+stdenv.mkDerivation {
+ name = "slrn-${version}";
+
+ src = fetchurl {
+ url = "http://www.jedsoft.org/slrn/download/slrn-1.0.1.tar.gz";
+ sha256 = "1rmaprfwvshzkv0c5vi43839cz3laqjpl306b9z0ghwyjdha1d06";
+ };
+
+ preConfigure = ''
+ sed -i -e "s|-ltermcap|-lncurses|" configure
+ sed -i autoconf/Makefile.in src/Makefile.in \
+ -e "s|/bin/cp|cp|" \
+ -e "s|/bin/rm|rm|"
+ '';
+
+ configureFlags = "--with-slang=${slang}";
+
+ buildInputs = [ slang ncurses ];
+
+ meta = {
+ description = "The slrn (S-Lang read news) newsreader";
+ homepage = http://slrn.sourceforge.net/index.html;
+ license = stdenv.lib.licenses.gpl2;
+ };
+}
diff --git a/pkgs/applications/networking/notbit/default.nix b/pkgs/applications/networking/notbit/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..db900f9ff256ba9c92054945ae155bc5e684f129
--- /dev/null
+++ b/pkgs/applications/networking/notbit/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchgit, autoconf, automake, pkgconfig, openssl }:
+
+stdenv.mkDerivation rec {
+ name = "notbit-0.2-28-g06f9160";
+
+ src = fetchgit {
+ url = "git://git.busydoingnothing.co.uk/notbit";
+ rev = "06f916081836de12f8e57a9f50c95d4d1b51627f";
+ sha256 = "d5c38eea1d9ca213bfbea5c88350478a5088b5532e939de9680d72e60aa65288";
+ };
+
+ buildInputs = [ autoconf automake pkgconfig openssl ];
+
+ preConfigure = "autoreconf -vfi";
+
+ meta = with stdenv.lib; {
+ homepage = http://busydoingnothing.co.uk/notbit/;
+ description = "A minimal bitmessage client";
+ license = licenses.mit;
+
+ # This is planned to change when the project officially supports other platforms
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/networking/p2p/gnunet/default.nix b/pkgs/applications/networking/p2p/gnunet/default.nix
index 045e6557730ef7cd36f026b5c7c9f7076f958790..bbb3561bae970e90be408861c4af649a2204f90d 100644
--- a/pkgs/applications/networking/p2p/gnunet/default.nix
+++ b/pkgs/applications/networking/p2p/gnunet/default.nix
@@ -4,11 +4,11 @@
, makeWrapper }:
stdenv.mkDerivation rec {
- name = "gnunet-0.10.0";
+ name = "gnunet-0.10.1";
src = fetchurl {
url = "mirror://gnu/gnunet/${name}.tar.gz";
- sha256 = "0zqpc47kywhjrpphl0palz849khv00ra2gjrfkysp6p0gfsbvd0i";
+ sha256 = "04wxzm3wkgqbn42b8ksr4cx6m5cckyig5cls1adh0nwdczwvnp7n";
};
buildInputs = [
diff --git a/pkgs/applications/networking/p2p/ktorrent/default.nix b/pkgs/applications/networking/p2p/ktorrent/default.nix
index b408f20b7110eba9a027797ead3d319cca23baf8..e53fda08911157e890739346d2930f106dec05e9 100644
--- a/pkgs/applications/networking/p2p/ktorrent/default.nix
+++ b/pkgs/applications/networking/p2p/ktorrent/default.nix
@@ -5,11 +5,11 @@ stdenv.mkDerivation rec {
name = pname + "-" + version;
pname = "ktorrent";
- version = "4.2.1";
+ version = "4.3.1";
src = fetchurl {
url = "${meta.homepage}/downloads/${version}/${name}.tar.bz2";
- sha256 = "1b6w7i1vvq8mlw9yrlxvb51hvaj6rpl8lv9b9zagyl3wcanz73zd";
+ sha256 = "66094f6833347afb0c49e332f0ec15ec48db652cbe66476840846ffd5ca0e4a1";
};
patches = [ ./find-workspace.diff ];
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
meta = {
description = "KDE integrated BtTorrent client";
- homepage = http://ktorrent.org;
+ homepage = http://ktorrent.pwsp.net;
maintainers = with stdenv.lib.maintainers; [ sander urkud ];
inherit (libktorrent.meta) platforms;
};
diff --git a/pkgs/applications/networking/p2p/mldonkey/default.nix b/pkgs/applications/networking/p2p/mldonkey/default.nix
index 2f739b056d4fc218d0a9c0ef6b9e1056a1a34466..57ea62485310ea630906ab3281ceecae9fe301d0 100644
--- a/pkgs/applications/networking/p2p/mldonkey/default.nix
+++ b/pkgs/applications/networking/p2p/mldonkey/default.nix
@@ -1,11 +1,11 @@
{stdenv, fetchurl, ocaml, zlib, bzip2, ncurses, file, gd, libpng }:
stdenv.mkDerivation (rec {
- name = "mldonkey-3.1.3";
+ name = "mldonkey-3.1.5";
src = fetchurl {
url = "mirror://sourceforge/mldonkey/${name}.tar.bz2";
- sha256 = "1qnr0qzliw4aynf2zhmm5hmrc9bd5vhdq3bi8n88j4nc86gry9bw";
+ sha256 = "1jqik6b09p27ckssppfiqpph7alxbgpnf9w1s0lalmi3qyyd9ybl";
};
meta = {
diff --git a/pkgs/applications/networking/p2p/ncdc/default.nix b/pkgs/applications/networking/p2p/ncdc/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..794f6fe430879be3348ed9eb7a497d75763e5baa
--- /dev/null
+++ b/pkgs/applications/networking/p2p/ncdc/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, fetchurl, ncurses, zlib, bzip2, sqlite, pkgconfig, glib, gnutls }:
+
+stdenv.mkDerivation rec {
+ name = "ncdc-${version}";
+ version = "1.19";
+
+ src = fetchurl {
+ url = "http://dev.yorhel.nl/download/ncdc-1.19.tar.gz";
+ sha256 = "1wgvqwfxq9kc729h2r528n55821w87sfbm4h21mr6pvkpfw30hf2";
+ };
+
+ buildInputs = [ ncurses zlib bzip2 sqlite pkgconfig glib gnutls ];
+
+ meta = {
+ description = "modern and lightweight direct connect client with a friendly ncurses interface";
+ homepage = http://dev.yorhel.nl/ncdc;
+ license = stdenv.lib.licenses.mit;
+ platforms = stdenv.lib.platforms.linux; # arbitrary
+ maintainers = [ stdenv.lib.maintainers.emery ];
+ };
+}
diff --git a/pkgs/applications/networking/p2p/retroshare/default.nix b/pkgs/applications/networking/p2p/retroshare/default.nix
index d4e3aa91cc0b93c303c29237d020cb0b9f523704..3ae4f2a74838f620b2b49cb936796148c22caca8 100644
--- a/pkgs/applications/networking/p2p/retroshare/default.nix
+++ b/pkgs/applications/networking/p2p/retroshare/default.nix
@@ -1,28 +1,38 @@
-{stdenv, fetchurl, qt, libupnp, gpgme, libgnome_keyring, glib}:
-
-throw "still fails to build"
+{ stdenv, fetchurl, cmake, qt, libupnp, gpgme, gnome3, glib, libssh, pkgconfig, protobuf, bzip2
+, libXScrnSaver, speex, curl, libxml2, libxslt }:
stdenv.mkDerivation {
- name = "retroshare-0.5.1d";
+ name = "retroshare-0.5.5c";
src = fetchurl {
- url = mirror://sourceforge/retroshare/RetroShare-v0.5.1d.tar.gz;
- sha256 = "15971wxx8djwcxn170jyn0mlh7cfzqsf031aa849wr9z234gwrcn";
+ url = mirror://sourceforge/project/retroshare/RetroShare/0.5.5c/retroshare_0.5.5-0.7068.tar.gz;
+ sha256 = "0l2n4pr1hq66q6qa073hrdx3s3d7iw54z8ay1zy82zhk2rwhsavp";
};
- buildInputs = [ qt libupnp gpgme libgnome_keyring glib ];
-
- buildPhase = ''
- cd libbitdht/src
- qmake libbitdht.pro PREFIX=$out
- make
- cd ../..
- cd libretroshare/src
- qmake libretroshare.pro PREFIX=$out
- make
- cd ../../src
- qmake libretroshare.pro PREFIX=$out
- make
+ NIX_CFLAGS_COMPILE = "-I${glib}/include/glib-2.0 -I${glib}/lib/glib-2.0/include -I${libxml2}/include/libxml2";
+
+ patchPhase = "sed -i 's/UpnpString_get_String(es_event->PublisherUrl)/es_event->PublisherUrl/' libretroshare/src/upnp/UPnPBase.cpp";
+
+ buildInputs = [ speex qt libupnp gpgme gnome3.libgnome_keyring glib libssh pkgconfig
+ protobuf bzip2 libXScrnSaver curl libxml2 libxslt ];
+
+ sourceRoot = "retroshare-0.5.5/src";
+
+ configurePhase = ''
+ qmake PREFIX=$out DESTDIR=$out RetroShare.pro
+ '';
+
+ postInstall = ''
+ mkdir -p $out/bin
+ ln -s $out/retroshare-nogui $out/bin
+ ln -s $out/RetroShare $out/bin
'';
+ meta = with stdenv.lib; {
+ description = "";
+ homepage = http://retroshare.sourceforge.net/;
+ #license = licenses.bsd2;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.iElectric ];
+ };
}
diff --git a/pkgs/applications/networking/p2p/transmission-remote-gtk/default.nix b/pkgs/applications/networking/p2p/transmission-remote-gtk/default.nix
index 894b1363cd0485330053f28cea9cad739416ef93..968aba20754aff4aa52e57ac7a526ed0f3579a57 100644
--- a/pkgs/applications/networking/p2p/transmission-remote-gtk/default.nix
+++ b/pkgs/applications/networking/p2p/transmission-remote-gtk/default.nix
@@ -1,15 +1,20 @@
-{ stdenv, fetchurl, pkgconfig, intltool, gtk, json_glib, curl }:
+{ stdenv, makeWrapper, fetchurl, pkgconfig, intltool, gtk3, json_glib, curl }:
stdenv.mkDerivation rec {
- name = "transmission-remote-gtk-1.0.1";
+ name = "transmission-remote-gtk-1.1.1";
src = fetchurl {
url = "http://transmission-remote-gtk.googlecode.com/files/${name}.tar.gz";
- sha256 = "b1ae032dd52b2d7975656913e4fe39e7f74d29ef8138292d8b82318ff9afed6f";
+ sha256 = "1jbh2pm4i740cmzqd2r7zxnqqipvv2v2ndmnmk53nqrxcbgc4nlz";
};
- buildInputs = [ pkgconfig intltool gtk json_glib curl ];
+ buildInputs = [ makeWrapper pkgconfig intltool gtk3 json_glib curl ];
+
+ preFixup = ''
+ wrapProgram "$out/bin/transmission-remote-gtk" \
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
+ '';
meta = {
description = "GTK remote control for the Transmission BitTorrent client";
diff --git a/pkgs/applications/networking/p2p/transmission/default.nix b/pkgs/applications/networking/p2p/transmission/default.nix
index cb439ddb4624426b78d5b3be27e962c34eeabe0b..29fb558c83d6643b41e5f9e5ca91d86b5d0028c4 100644
--- a/pkgs/applications/networking/p2p/transmission/default.nix
+++ b/pkgs/applications/networking/p2p/transmission/default.nix
@@ -27,10 +27,10 @@ stdenv.mkDerivation rec {
configureFlags = [ "--with-systemd-daemon" ]
++ optional enableGTK3 "--with-gtk";
- postInstall = optionalString enableGTK3 /* gsettings schemas for file dialogues */ ''
+ preFixup = optionalString enableGTK3 /* gsettings schemas for file dialogues */ ''
rm "$out/share/icons/hicolor/icon-theme.cache"
wrapProgram "$out/bin/transmission-gtk" \
- --prefix XDG_DATA_DIRS : "${gtk3}/share"
+ --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
'';
meta = with stdenv.lib; {
@@ -48,7 +48,7 @@ stdenv.mkDerivation rec {
'';
homepage = http://www.transmissionbt.com/;
license = licenses.gpl2; # parts are under MIT
- maintainers = with maintainers; [ astsmtl vcunat ];
+ maintainers = with maintainers; [ astsmtl vcunat wizeman ];
platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/networking/remote/freerdp/default.nix b/pkgs/applications/networking/remote/freerdp/default.nix
index 8f89d70405ad0f341aafde980b86543e0f523c9a..8785837fbb93518e3c28388c8905620b3e2b9899 100644
--- a/pkgs/applications/networking/remote/freerdp/default.nix
+++ b/pkgs/applications/networking/remote/freerdp/default.nix
@@ -61,7 +61,5 @@ stdenv.mkDerivation rec {
homepage = http://www.freerdp.com/;
license = "free-non-copyleft";
-
- maintainers = [ stdenv.lib.maintainers.shlevy ];
};
}
diff --git a/pkgs/applications/networking/remote/freerdp/unstable.nix b/pkgs/applications/networking/remote/freerdp/unstable.nix
index cce3d23d194548343f6b1a56233ff342b4c84719..6c133e9dbb4964109d5bfc1129614fc02303d31c 100644
--- a/pkgs/applications/networking/remote/freerdp/unstable.nix
+++ b/pkgs/applications/networking/remote/freerdp/unstable.nix
@@ -70,8 +70,6 @@ stdenv.mkDerivation rec {
homepage = http://www.freerdp.com/;
license = "free-non-copyleft";
-
- maintainers = [ stdenv.lib.maintainers.shlevy ];
};
}
diff --git a/pkgs/applications/networking/remote/rdesktop/default.nix b/pkgs/applications/networking/remote/rdesktop/default.nix
index c8c72160b3412d4e43d29e1a0d799510dc51af5b..9ba9e3aa3fc47e56f52ef4f4dc0d9e8332da9347 100644
--- a/pkgs/applications/networking/remote/rdesktop/default.nix
+++ b/pkgs/applications/networking/remote/rdesktop/default.nix
@@ -2,17 +2,21 @@
stdenv.mkDerivation (rec {
pname = "rdesktop";
- version = "1.7.1";
+ version = "1.8.1";
name = "${pname}-${version}";
src = fetchurl {
url = "mirror://sourceforge/${pname}/${name}.tar.gz";
- sha256 = "0yc4xz95w40m8ailpjgqp9h7bkc758vp0dlq4nj1pvr3xfnl7sni";
+ sha256 = "0il248cdsxvwjsl4bswf27ld9r1a7d48jf6bycr86kf3i55q7k3n";
};
buildInputs = [openssl libX11];
- configureFlags = [ "--with-openssl=${openssl}" ];
+ configureFlags = [
+ "--with-openssl=${openssl}"
+ "--disable-credssp"
+ "--disable-smartcard"
+ ];
meta = {
description = "rdesktop is an open source client for Windows Terminal Services";
diff --git a/pkgs/applications/networking/remote/ssvnc/default.nix b/pkgs/applications/networking/remote/ssvnc/default.nix
index b2c9b7c3e73a7c5add42d14f1385d12cbeb4c9ca..619925354f0665c18997ab9e132723b1d90a1bea 100644
--- a/pkgs/applications/networking/remote/ssvnc/default.nix
+++ b/pkgs/applications/networking/remote/ssvnc/default.nix
@@ -1,8 +1,9 @@
-{ stdenv, fetchurl, imake, zlib, openjdk, libX11, libXt, libXmu, libXaw, libXext, libXpm, openjpeg, openssl }:
+{ stdenv, fetchurl, imake, zlib, openjdk, libX11, libXt, libXmu
+, libXaw, libXext, libXpm, openjpeg, openssl, tcl, tk }:
-let version = "1.0.29"; in
stdenv.mkDerivation rec {
name = "ssvnc-${version}";
+ version = "1.0.29";
src = fetchurl {
url = "mirror://sourceforge/ssvnc/${name}.src.tar.gz";
@@ -13,6 +14,10 @@ stdenv.mkDerivation rec {
configurePhase = "makeFlags=PREFIX=$out";
+ postInstall = ''
+ sed -i -e 's|exec wish|exec ${tk}/bin/wish|' $out/lib/ssvnc/util/ssvnc.tcl
+ '';
+
meta = {
description = "VNC viewer that adds encryption security to VNC connections";
homepage = "http://www.karlrunge.com/x11vnc/ssvnc.html";
diff --git a/pkgs/applications/networking/remote/teamviewer/default.nix b/pkgs/applications/networking/remote/teamviewer/default.nix
index 8c62951976431af38c65aede80cd60841f71a221..1bf40eabfae4c9ac79f29461392b28f288c11de7 100644
--- a/pkgs/applications/networking/remote/teamviewer/default.nix
+++ b/pkgs/applications/networking/remote/teamviewer/default.nix
@@ -1,5 +1,5 @@
{ stdenv, fetchurl, libX11, libXtst, libXext, libXdamage, libXfixes, wine, makeWrapper
-, bash }:
+, bash, findutils, coreutils }:
assert stdenv.system == "i686-linux";
let
@@ -31,6 +31,13 @@ stdenv.mkDerivation {
cat > $out/bin/teamviewer << EOF
#!${bash}/bin/sh
+ # Teamviewer puts symlinks to nix store paths in ~/.teamviewer. When those
+ # paths become garbage collected, teamviewer crashes upon start because of
+ # those broken symlinks. An easy workaround to this behaviour is simply to
+ # delete all symlinks before we start teamviewer. Teamviewer will fixup the
+ # symlinks, just like it did the first time the user ran it.
+ ${findutils}/bin/find "\$HOME"/.teamviewer/*/*/"Program Files/TeamViewer/" -type l -print0 | ${findutils}/bin/xargs -0 ${coreutils}/bin/rm
+
export LD_LIBRARY_PATH=${toldpath}\''${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH}
export PATH=${topath}\''${PATH:+:\$PATH}
$out/share/teamviewer/wrapper wine "c:\Program Files\TeamViewer\Version7\TeamViewer.exe" "\$@"
diff --git a/pkgs/applications/networking/seafile-client/default.nix b/pkgs/applications/networking/seafile-client/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d24437aabb6b634fec8b04a8609d2e84b683c055
--- /dev/null
+++ b/pkgs/applications/networking/seafile-client/default.nix
@@ -0,0 +1,39 @@
+{stdenv, fetchurl, writeScript, pkgconfig, cmake, qt4, seafile-shared, ccnet, makeWrapper}:
+
+stdenv.mkDerivation rec
+{
+ version = "2.1.1";
+ name = "seafile-client-${version}";
+
+ src = fetchurl
+ {
+ url = "https://github.com/haiwen/seafile-client/archive/v${version}.tar.gz";
+ sha256 = "d98515ea229df702cbe973d85ec0bd5cf3f5282ef1022ba0157d5301b521c8e0";
+ };
+
+ buildInputs = [ pkgconfig cmake qt4 seafile-shared makeWrapper ];
+
+ builder = writeScript "${name}-builder.sh" ''
+ source $stdenv/setup
+
+ tar xvfz $src
+ cd seafile-client-*
+
+ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_SKIP_BUILD_RPATH=ON -DCMAKE_INSTALL_PREFIX="$out" .
+ make -j1
+
+ make install
+
+ wrapProgram $out/bin/seafile-applet \
+ --suffix PATH : ${ccnet}/bin:${seafile-shared}/bin
+ '';
+
+ meta =
+ {
+ homepage = "https://github.com/haiwen/seafile-clients";
+ description = "Desktop client for Seafile, the Next-generation Open Source Cloud Storage";
+ license = stdenv.lib.licenses.asl20;
+ platforms = stdenv.lib.platforms.linux;
+ maintainers = [ stdenv.lib.maintainers.calrama ];
+ };
+}
diff --git a/pkgs/applications/networking/sniffers/wireshark/default.nix b/pkgs/applications/networking/sniffers/wireshark/default.nix
index ed2ce4c12c00c8e75ea92d5eb7aaa50cb4e13e19..256681ec54e2653101722eed1a06cdb6f0da73fb 100644
--- a/pkgs/applications/networking/sniffers/wireshark/default.nix
+++ b/pkgs/applications/networking/sniffers/wireshark/default.nix
@@ -17,6 +17,10 @@ stdenv.mkDerivation {
geoip libnl c-ares gtk python
];
+ preConfigure = ''
+ sed -re 's/g_memmove/memmove/' -i $(grep -rl g_memmove .)
+ '';
+
configureFlags = "--disable-usr-local --disable-silent-rules --with-gtk2 --without-gtk3 --without-qt --with-ssl";
desktopItem = makeDesktopItem {
diff --git a/pkgs/applications/networking/sync/rsync/default.nix b/pkgs/applications/networking/sync/rsync/default.nix
index 5447b21009ffdd01d7c731d5198a540a9789aca1..5265faf87b6fe4c4538d2d088f762253ba7ba7ba 100644
--- a/pkgs/applications/networking/sync/rsync/default.nix
+++ b/pkgs/applications/networking/sync/rsync/default.nix
@@ -6,16 +6,17 @@
assert enableACLs -> acl != null;
stdenv.mkDerivation rec {
- name = "rsync-3.0.9";
+ name = "rsync-${version}";
+ version = "3.1.0";
mainSrc = fetchurl {
- url = http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz;
- sha256 = "01bw4klqsrlhh3i9lazd485sd9qx5djvnwa21lj2h3a9sn6hzw9h";
+ url = "http://rsync.samba.org/ftp/rsync/src/rsync-${version}.tar.gz";
+ sha256 = "0kirw8wglqvwi1v8bwxp373g03xg857h59j5k3mmgff9gzvj7jl1";
};
patchesSrc = fetchurl {
- url = http://rsync.samba.org/ftp/rsync/rsync-patches-3.0.9.tar.gz;
- sha256 = "0c1e9b56e99667dfc47641124460bac61a04c5d2ee89f575c6bc78c7a69005a9";
+ url = "http://rsync.samba.org/ftp/rsync/rsync-patches-${version}.tar.gz";
+ sha256 = "0sl8aadpjblvbb05vgais40z90yzhr09rwz0cykjdiv452gli75p";
};
srcs = [mainSrc] ++ stdenv.lib.optional enableCopyDevicesPatch patchesSrc;
@@ -30,6 +31,6 @@ stdenv.mkDerivation rec {
license = stdenv.lib.licenses.gpl3Plus;
platforms = stdenv.lib.platforms.unix;
- maintainers = [ stdenv.lib.maintainers.simons ];
+ maintainers = [ stdenv.lib.maintainers.simons stdenv.lib.maintainers.emery ];
};
}
diff --git a/pkgs/applications/networking/sync/unison/default.nix b/pkgs/applications/networking/sync/unison/default.nix
index 35dd2d2a7d028046aa9451d6da87808570d67b1c..744c8c01efa5e48945fe5f949332d26abed928e7 100644
--- a/pkgs/applications/networking/sync/unison/default.nix
+++ b/pkgs/applications/networking/sync/unison/default.nix
@@ -3,10 +3,10 @@
stdenv.mkDerivation (rec {
- name = "unison-2.40.63";
+ name = "unison-2.40.102";
src = fetchurl {
- url = "http://www.seas.upenn.edu/~bcpierce/unison/download/releases/${name}/${name}.tar.gz";
- sha256 = "17fd2bg5jxwbib87j6j2bjpwdm66whqm1fq46v70hfby79j00vkf";
+ url = "http://www.seas.upenn.edu/~bcpierce/unison/download/releases/stable/${name}.tar.gz";
+ sha256 = "0m78q5vnsric1virvkmxxx32ipaq0cnj0kbirdbg36395gq94jix";
};
buildInputs = [ ocaml makeWrapper ncurses ];
diff --git a/pkgs/applications/networking/syncthing/default.nix b/pkgs/applications/networking/syncthing/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..50bc61eeeff072a651b72883f881efabc5cad5df
--- /dev/null
+++ b/pkgs/applications/networking/syncthing/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, fetchgit, go }:
+
+stdenv.mkDerivation rec {
+ name = "syncthing-${version}";
+ version = "0.7.1";
+
+ src = fetchgit {
+ url = "git://github.com/calmh/syncthing.git";
+ rev = "refs/tags/v${version}";
+ sha256 = "1rja837kimiq15km8cridbm5yxvkm6mkvkwywdi76qf9rm0pcjl1";
+ };
+
+ buildInputs = [ go ];
+
+ buildPhase = ''
+ mkdir -p "./dependencies/src/github.com/calmh/syncthing"
+
+ cp -r "./auto" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./buffers" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./cid" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./discover" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./files" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./lamport" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./protocol" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./scanner" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./mc" "./dependencies/src/github.com/calmh/syncthing"
+ cp -r "./xdr" "./dependencies/src/github.com/calmh/syncthing"
+
+ export GOPATH="`pwd`/Godeps/_workspace:`pwd`/dependencies"
+
+ go test -cpu=1,2,4 ./...
+
+ mkdir ./bin
+
+ go build -o ./bin/syncthing -ldflags "-w -X main.Version v${version}" ./cmd/syncthing
+ go build -o ./bin/stcli -ldflags "-w -X main.Version v${version}" ./cmd/stcli
+ '';
+
+ installPhase = ''
+ ensureDir $out/bin
+ cp -r ./bin $out
+ '';
+
+ meta = {
+ homepage = http://syncthing.net/;
+ description = "Syncthing replaces Dropbox and BitTorrent Sync with something open, trustworthy and decentralized";
+ license = with stdenv.lib.licenses; mit;
+ maintainers = with stdenv.lib.maintainers; [ matejc ];
+ platforms = with stdenv.lib.platforms; linux;
+ };
+}
diff --git a/pkgs/applications/networking/yafc/default.nix b/pkgs/applications/networking/yafc/default.nix
index bdbb53d1675f158e5305b0f01ef3f9beebb1fcc0..752a7824e6f0520272dcf417ad81d42d5c24ea40 100644
--- a/pkgs/applications/networking/yafc/default.nix
+++ b/pkgs/applications/networking/yafc/default.nix
@@ -1,13 +1,13 @@
-{stdenv, fetchurl, readline, libssh, intltool}:
+{stdenv, fetchurl, readline, libssh, intltool, libbsd}:
stdenv.mkDerivation rec {
- name = "yafc-1.2.3";
+ name = "yafc-1.3.2";
src = fetchurl {
- url = "https://github.com/downloads/sebastinas/yafc/${name}.tar.xz";
- sha256 = "11h5r9ragfpil338kq981wxnifacflqfwgydhmy00b3fbdlnxzsi";
+ url = "http://www.yafc-ftp.com/upload/${name}.tar.xz";
+ sha256 = "0rrhik00xynxg5s3ffqlyynvy8ssv8zfaixkpb77baxa274gnbd7";
};
- buildInputs = [ readline libssh intltool ];
+ buildInputs = [ readline libssh intltool libbsd ];
meta = {
description = "ftp/sftp client with readline, autocompletion and bookmarks";
diff --git a/pkgs/applications/networking/znc/default.nix b/pkgs/applications/networking/znc/default.nix
index a43d8fa9d11d497234269c59370f5bcedfb71d7e..dbf886de978686a018fb7dfec5aac4e7b0041755 100644
--- a/pkgs/applications/networking/znc/default.nix
+++ b/pkgs/applications/networking/znc/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, openssl, pkgconfig
+{ stdenv, fetchurl, openssl, pkgconfig
, withPerl ? false, perl
, withPython ? false, python3
, withTcl ? false, tcl
@@ -7,10 +7,11 @@
with stdenv.lib;
stdenv.mkDerivation rec {
- name = "znc-1.0";
+ name = "znc-1.2";
+
src = fetchurl {
url = "http://znc.in/releases/${name}.tar.gz";
- sha256 = "0ah6890ngvj97kah3x7fd8yzi6dpdgrxw1b2skj2cyv98bd3jmd8";
+ sha256 = "07bh306wl5494sqsgz4a526wvyrylkc8vpnbr5pkxwjg90mcv8nr";
};
buildInputs = [ openssl pkgconfig ]
@@ -24,11 +25,11 @@ stdenv.mkDerivation rec {
+ optionalString withTcl "--enable-tcl --with-tcl=${tcl}/lib "
+ optionalString withCyrus "--enable-cyrus ";
- meta = {
+ meta = with stdenv.lib; {
description = "Advanced IRC bouncer";
homepage = http://wiki.znc.in/ZNC;
- maintainers = [ stdenv.lib.maintainers.viric ];
- license = "ASL2.0";
- platforms = stdenv.lib.platforms.unix;
+ maintainers = with maintainers; [ viric ];
+ license = licenses.asl20;
+ platforms = platforms.unix;
};
}
diff --git a/pkgs/applications/office/calligra/default.nix b/pkgs/applications/office/calligra/default.nix
index 137e7be019fac21368103422e14b866811a9c080..e87053d53264bc42b1687ec46c728de4eaea5425 100644
--- a/pkgs/applications/office/calligra/default.nix
+++ b/pkgs/applications/office/calligra/default.nix
@@ -6,11 +6,11 @@
}:
stdenv.mkDerivation rec {
- name = "calligra-2.7.2";
+ name = "calligra-2.7.5";
src = fetchurl {
url = "mirror://kde/stable/${name}/${name}.tar.xz";
- sha256 = "1awnvv62fp5bjhi6fys37s6lpzxaig4v15m1zjlgxq82ig61w6sq";
+ sha256 = "0png8ac10xywxsml1z18as18kc9k9162l6an67hi6lgx0rv27ldi";
};
nativeBuildInputs = [ cmake perl pkgconfig ];
diff --git a/pkgs/applications/office/gnucash/default.nix b/pkgs/applications/office/gnucash/default.nix
index c8ebe6e2b12c7a2c556e5b2feb514b2b49aa02d5..ee0475d45ec0443193fb7ad4291bd38d8a9931d5 100644
--- a/pkgs/applications/office/gnucash/default.nix
+++ b/pkgs/applications/office/gnucash/default.nix
@@ -1,7 +1,7 @@
{ fetchurl, stdenv, pkgconfig, libxml2, gconf, glib, gtk, libgnomeui, libofx
, libgtkhtml, gtkhtml, libgnomeprint, goffice, enchant, gettext, libbonoboui
, intltool, perl, guile, slibGuile, swig, isocodes, bzip2, makeWrapper, libglade
-, libgsf, libart_lgpl, perlPackages
+, libgsf, libart_lgpl, perlPackages, aqbanking, gwenhywfar
}:
/* If you experience GConf errors when running GnuCash on NixOS, see
@@ -21,10 +21,10 @@ stdenv.mkDerivation rec {
pkgconfig libxml2 gconf glib gtk libgnomeui libgtkhtml gtkhtml
libgnomeprint goffice enchant gettext intltool perl guile slibGuile
swig isocodes bzip2 makeWrapper libofx libglade libgsf libart_lgpl
- perlPackages.DateManip perlPackages.FinanceQuote
+ perlPackages.DateManip perlPackages.FinanceQuote aqbanking gwenhywfar
];
- configureFlags = "CFLAGS=-O3 CXXFLAGS=-O3 --disable-dbi --enable-ofx";
+ configureFlags = "CFLAGS=-O3 CXXFLAGS=-O3 --disable-dbi --enable-ofx --enable-aqbanking";
postInstall = ''
# Auto-updaters don't make sense in Nix.
diff --git a/pkgs/applications/office/gnumeric/default.nix b/pkgs/applications/office/gnumeric/default.nix
index 0108f934693e53a6ba7b1ec07efb112e1ae4095d..014aa5bf0fd2f1d88a2c61ca8d65b7652e6c83a6 100644
--- a/pkgs/applications/office/gnumeric/default.nix
+++ b/pkgs/applications/office/gnumeric/default.nix
@@ -3,11 +3,11 @@
}:
stdenv.mkDerivation rec {
- name = "gnumeric-1.12.9";
+ name = "gnumeric-1.12.12";
src = fetchurl {
url = "mirror://gnome/sources/gnumeric/1.12/${name}.tar.xz";
- sha256 = "1rv2ifw6rp0iza4fkf3bffvdkyi77dwvzdnvcbpqcyn2kxfsvlsc";
+ sha256 = "096i9x6b4i6x24vc4lsxx8fg2n2pjs2jb6x3bkg3ppa2c60w1jq0";
};
preConfigure = ''sed -i 's/\(SUBDIRS.*\) doc/\1/' Makefile.in''; # fails when installing docs
@@ -20,9 +20,12 @@ stdenv.mkDerivation rec {
goffice gtk3 makeWrapper
];
- postInstall = ''
- wrapProgram "$out"/bin/gnumeric-* \
- --prefix XDG_DATA_DIRS : "${gtk3}/share:${gnome_icon_theme}/share"
+ preFixup = ''
+ for f in "$out"/bin/gnumeric-*; do
+ wrapProgram $f \
+ --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH"
+ done
+ rm $out/share/icons/hicolor/icon-theme.cache
'';
meta = with stdenv.lib; {
diff --git a/pkgs/applications/office/homebank/default.nix b/pkgs/applications/office/homebank/default.nix
index d531a327d7cc9797c9c28c5e342349553cf99fd3..5e5c98e826019ed4c0668f8044ca510c547801a8 100644
--- a/pkgs/applications/office/homebank/default.nix
+++ b/pkgs/applications/office/homebank/default.nix
@@ -2,7 +2,7 @@
let
download_root = "http://homebank.free.fr/public/";
- name = "homebank-4.5.4";
+ name = "homebank-4.5.5";
lastrelease = download_root + name + ".tar.gz";
oldrelease = download_root + "old/" + name + ".tar.gz";
in
@@ -12,7 +12,7 @@ stdenv.mkDerivation {
src = fetchurl {
urls = [ lastrelease oldrelease ];
- sha256 = "10xh76mxwbl56xp118gg3b4isv16yvhsvqxwqc28pqqxkpr7vpdk";
+ sha256 = "05k4497qsb6fzr662h9yxz1amsavd287wh0sabrpr9jdbh3jcfkg";
};
buildInputs = [ pkgconfig gtk libofx intltool ];
diff --git a/pkgs/applications/office/kmymoney/default.nix b/pkgs/applications/office/kmymoney/default.nix
index d55c66a26246edc9b4878e435066c74f9502e822..87e3bfd531261f2adf0ea5d27625d53e8e7b9e15 100644
--- a/pkgs/applications/office/kmymoney/default.nix
+++ b/pkgs/applications/office/kmymoney/default.nix
@@ -1,20 +1,22 @@
{ stdenv, fetchurl, cmake, kdelibs, automoc4, kdepimlibs, gettext, pkgconfig
-, shared_mime_info, perl, boost, gpgme, gmpxx, libalkimia, libofx, libical }:
+, shared_mime_info, perl, boost, gpgme, gmpxx, libalkimia, libofx, libical
+, doxygen }:
stdenv.mkDerivation rec {
- name = "kmymoney-4.6.2";
+ name = "kmymoney-4.6.4";
src = fetchurl {
- url = "mirror://sourceforge/kmymoney2/${name}.tar.bz2";
- sha256 = "0x9bl4h2mk8dv49nnn7drv528fnl5ynvvyy7q4m22k0d5yxarn5d";
+ url = "mirror://sourceforge/kmymoney2/${name}.tar.xz";
+ sha256 = "04n0lgi2yrx67bgjzbdbcm10pxs7l53srmp240znzw59njnjyll9";
};
- buildInputs = [ kdepimlibs perl boost gpgme gmpxx libalkimia libofx libical ];
+ buildInputs = [ kdepimlibs perl boost gpgme gmpxx libalkimia libofx libical
+ doxygen ];
nativeBuildInputs = [ cmake automoc4 gettext shared_mime_info pkgconfig ];
KDEDIRS = libalkimia;
- patches = [ ./qgpgme.patch ./qt-4.8.patch ];
+ patches = [ ./qgpgme.patch ];
meta = {
homepage = http://kmymoney2.sourceforge.net/;
diff --git a/pkgs/applications/office/kmymoney/qt-4.8.patch b/pkgs/applications/office/kmymoney/qt-4.8.patch
deleted file mode 100644
index 7e9a44337cd9f5b0089053d4681a08c0bf6c99d8..0000000000000000000000000000000000000000
--- a/pkgs/applications/office/kmymoney/qt-4.8.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Christoph Feck
-Date: Thu, 10 Nov 2011 11:34:20 +0000
-Subject: Fix compile with Qt 4.8
-X-Git-Url: http://quickgit.kde.org/?p=kmymoney.git&a=commitdiff&h=8324cfb9657d8c03f83691402386e8c5bfb29981
----
-Fix compile with Qt 4.8
-
-Sideported commits f42a0a3d878afebb298609c9886851858c56cc15 and
-fe74b25bf3b78c42e95569fe467a397876bc9c04 from massif-visualizer
----
-
-
---- a/libkdchart/src/KDChartBackgroundAttributes.cpp
-+++ b/libkdchart/src/KDChartBackgroundAttributes.cpp
-@@ -22,6 +22,7 @@
-
- #include "KDChartBackgroundAttributes.h"
- #include
-+#include
-
- #include
-
-@@ -150,7 +151,7 @@ QDebug operator<<(QDebug dbg, const KDCh
- << "visible="<)
+
+ get_target_property(TARGETS_PUBLIC_HEADERS ${target} PUBLIC_HEADER)
++ set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
+ if (EXISTS "${TARGETS_PUBLIC_HEADERS}")
+ list(APPEND stp_public_headers "${TARGETS_PUBLIC_HEADERS}")
+ message("Adding public header(s) ${TARGETS_PUBLIC_HEADERS} to target libstp")
+diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt
+index 0735137..73039f5 100644
+--- a/src/main/CMakeLists.txt
++++ b/src/main/CMakeLists.txt
+@@ -3,12 +3,6 @@ include_directories(${CMAKE_BINARY_DIR}/src/AST/)
+
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/GitSHA1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" @ONLY)
+
+-add_library(globalstp OBJECT
+- Globals.cpp
+- ${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp
+-)
+-add_dependencies(globalstp ASTKind_header)
+-
+ # -----------------------------------------------------------------------------
+ # Create binary
+ # -----------------------------------------------------------------------------
diff --git a/pkgs/applications/science/logic/stp/fixrefs.diff b/pkgs/applications/science/logic/stp/fixrefs.diff
new file mode 100644
index 0000000000000000000000000000000000000000..60ad4949f076094934a289f22ed50dc765a3a4f1
--- /dev/null
+++ b/pkgs/applications/science/logic/stp/fixrefs.diff
@@ -0,0 +1,192 @@
+commit 53b6043e25b2eba264faab845077fbf6736cf22f
+Author: Petr Rockai
+Date: Tue Jan 7 13:30:07 2014 +0100
+
+ aig: Comment out unused functions with undefined references in them.
+
+diff --git a/src/extlib-abc/aig/aig/aigPart.c b/src/extlib-abc/aig/aig/aigPart.c
+index a4cc116..5bd5f08 100644
+--- a/src/extlib-abc/aig/aig/aigPart.c
++++ b/src/extlib-abc/aig/aig/aigPart.c
+@@ -869,6 +869,7 @@ Vec_Ptr_t * Aig_ManMiterPartitioned( Aig_Man_t * p1, Aig_Man_t * p2, int nPartSi
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
+ {
+ extern int Cmd_CommandExecute( void * pAbc, char * sCommand );
+@@ -981,6 +982,7 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
+ Aig_ManMarkValidChoices( pAig );
+ return pAig;
+ }
++#endif
+
+
+ ////////////////////////////////////////////////////////////////////////
+diff --git a/src/extlib-abc/aig/aig/aigShow.c b/src/extlib-abc/aig/aig/aigShow.c
+index ae8fa8b..f04eedc 100644
+--- a/src/extlib-abc/aig/aig/aigShow.c
++++ b/src/extlib-abc/aig/aig/aigShow.c
+@@ -326,6 +326,7 @@ void Aig_WriteDotAig( Aig_Man_t * pMan, char * pFileName, int fHaig, Vec_Ptr_t *
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ void Aig_ManShow( Aig_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold )
+ {
+ extern void Abc_ShowFile( char * FileNameDot );
+@@ -347,7 +348,7 @@ void Aig_ManShow( Aig_Man_t * pMan, int fHaig, Vec_Ptr_t * vBold )
+ // visualize the file
+ Abc_ShowFile( FileNameDot );
+ }
+-
++#endif
+
+ ////////////////////////////////////////////////////////////////////////
+ /// END OF FILE ///
+diff --git a/src/extlib-abc/aig/dar/darRefact.c b/src/extlib-abc/aig/dar/darRefact.c
+index d744b4f..23fc3d5 100644
+--- a/src/extlib-abc/aig/dar/darRefact.c
++++ b/src/extlib-abc/aig/dar/darRefact.c
+@@ -340,6 +340,7 @@ printf( "\n" );
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ int Dar_ManRefactorTryCuts( Ref_Man_t * p, Aig_Obj_t * pObj, int nNodesSaved, int Required )
+ {
+ Vec_Ptr_t * vCut;
+@@ -428,6 +429,7 @@ int Dar_ManRefactorTryCuts( Ref_Man_t * p, Aig_Obj_t * pObj, int nNodesSaved, in
+ }
+ return p->GainBest;
+ }
++#endif
+
+ /**Function*************************************************************
+
+@@ -461,6 +463,7 @@ int Dar_ObjCutLevelAchieved( Vec_Ptr_t * vCut, int nLevelMin )
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ int Dar_ManRefactor( Aig_Man_t * pAig, Dar_RefPar_t * pPars )
+ {
+ // Bar_Progress_t * pProgress;
+@@ -583,6 +586,7 @@ p->timeOther = p->timeTotal - p->timeCuts - p->timeEval;
+ return 1;
+
+ }
++#endif
+
+ ////////////////////////////////////////////////////////////////////////
+ /// END OF FILE ///
+diff --git a/src/extlib-abc/aig/dar/darScript.c b/src/extlib-abc/aig/dar/darScript.c
+index e60df00..1b9c24f 100644
+--- a/src/extlib-abc/aig/dar/darScript.c
++++ b/src/extlib-abc/aig/dar/darScript.c
+@@ -64,6 +64,7 @@ Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig )
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose )
+ //alias rwsat "st; rw -l; b -l; rw -l; rf -l"
+ {
+@@ -108,7 +109,7 @@ Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose )
+
+ return pAig;
+ }
+-
++#endif
+
+ /**Function*************************************************************
+
+@@ -121,6 +122,7 @@ Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose )
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose )
+ //alias compress2 "b -l; rw -l; rwz -l; b -l; rwz -l; b -l"
+ {
+@@ -180,6 +182,7 @@ Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, i
+
+ return pAig;
+ }
++#endif
+
+ /**Function*************************************************************
+
+@@ -192,6 +195,7 @@ Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, i
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose )
+ //alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l"
+ {
+@@ -285,6 +289,7 @@ Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel,
+ }
+ return pAig;
+ }
++#endif
+
+ /**Function*************************************************************
+
+@@ -297,6 +302,7 @@ Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel,
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Vec_Ptr_t * Dar_ManChoiceSynthesis( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fVerbose )
+ //alias resyn "b; rw; rwz; b; rwz; b"
+ //alias resyn2 "b; rw; rf; b; rw; rwz; b; rfz; rwz; b"
+@@ -311,6 +317,7 @@ Vec_Ptr_t * Dar_ManChoiceSynthesis( Aig_Man_t * pAig, int fBalance, int fUpdateL
+ Vec_PtrPush( vAigs, pAig );
+ return vAigs;
+ }
++#endif
+
+ /**Function*************************************************************
+
+diff --git a/src/extlib-abc/aig/kit/kitAig.c b/src/extlib-abc/aig/kit/kitAig.c
+index de301f2..7e5df0f 100644
+--- a/src/extlib-abc/aig/kit/kitAig.c
++++ b/src/extlib-abc/aig/kit/kitAig.c
+@@ -95,6 +95,7 @@ Aig_Obj_t * Kit_GraphToAig( Aig_Man_t * pMan, Aig_Obj_t ** pFanins, Kit_Graph_t
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Aig_Obj_t * Kit_TruthToAig( Aig_Man_t * pMan, Aig_Obj_t ** pFanins, unsigned * pTruth, int nVars, Vec_Int_t * vMemory )
+ {
+ Aig_Obj_t * pObj;
+@@ -113,6 +114,7 @@ Aig_Obj_t * Kit_TruthToAig( Aig_Man_t * pMan, Aig_Obj_t ** pFanins, unsigned * p
+ Kit_GraphFree( pGraph );
+ return pObj;
+ }
++#endif
+
+ ////////////////////////////////////////////////////////////////////////
+ /// END OF FILE ///
+diff --git a/src/extlib-abc/aig/kit/kitGraph.c b/src/extlib-abc/aig/kit/kitGraph.c
+index 39ef587..0485c66 100644
+--- a/src/extlib-abc/aig/kit/kitGraph.c
++++ b/src/extlib-abc/aig/kit/kitGraph.c
+@@ -349,6 +349,7 @@ unsigned Kit_GraphToTruth( Kit_Graph_t * pGraph )
+ SeeAlso []
+
+ ***********************************************************************/
++#if 0
+ Kit_Graph_t * Kit_TruthToGraph( unsigned * pTruth, int nVars, Vec_Int_t * vMemory )
+ {
+ Kit_Graph_t * pGraph;
+@@ -365,6 +366,7 @@ Kit_Graph_t * Kit_TruthToGraph( unsigned * pTruth, int nVars, Vec_Int_t * vMemor
+ pGraph = Kit_SopFactor( vMemory, RetValue, nVars, vMemory );
+ return pGraph;
+ }
++#endif
+
+ /**Function*************************************************************
+
diff --git a/pkgs/applications/science/logic/z3/default.nix b/pkgs/applications/science/logic/z3/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..eeef03eb161935edb095c8f2a8967e33b9f731e0
--- /dev/null
+++ b/pkgs/applications/science/logic/z3/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, python, unzip, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+ name = "z3-${version}";
+ version = "4.3.1";
+ src = fetchurl {
+ url = "http://download-codeplex.sec.s-msft.com/Download/SourceControlFileDownload.ashx\?ProjectName\=z3\&changeSetId\=89c1785b73225a1b363c0e485f854613121b70a7";
+ name = "${name}.zip";
+ sha256 = "3b94465c52ec174350d8707dd6a1fb0cef42f0fa23f148cc1808c14f3c2c7f76";
+ };
+
+ buildInputs = [ python unzip autoreconfHook ];
+ enableParallelBuilding = true;
+
+ # The zip file doesn't unpack a directory, just the code itself.
+ unpackPhase = "mkdir ${name} && cd ${name} && unzip $src";
+ postConfigure = ''
+ python scripts/mk_make.py
+ cd build
+ '';
+
+ # z3's install phase is stupid because it tries to calculate the
+ # python package store location itself, meaning it'll attempt to
+ # write files into the nix store, and fail.
+ soext = if stdenv.system == "x86_64-darwin" then ".dylib" else ".so";
+ installPhase = ''
+ mkdir -p $out/bin $out/lib/${python.libPrefix}/site-packages $out/include
+ cp ../src/api/z3.h $out/include
+ cp ../src/api/z3_api.h $out/include
+ cp ../src/api/z3_v1.h $out/include
+ cp ../src/api/z3_macros.h $out/include
+ cp ../src/api/c++/z3++.h $out/include
+ cp z3 $out/bin
+ cp libz3${soext} $out/lib
+ cp libz3${soext} $out/lib/${python.libPrefix}/site-packages
+ cp z3*.pyc $out/lib/${python.libPrefix}/site-packages
+ '';
+
+ meta = {
+ description = "Z3 is a high-performance theorem prover and SMT solver";
+ homepage = "http://z3.codeplex.com";
+ license = stdenv.lib.licenses.unfreeRedistributable;
+ platforms = stdenv.lib.platforms.unix;
+ maintainers = [ stdenv.lib.maintainers.thoughtpolice ];
+ };
+}
diff --git a/pkgs/applications/science/math/R/default.nix b/pkgs/applications/science/math/R/default.nix
index 6c8ec9e68c53b74fd12f77de4e2423e9c56887ec..4a58c15941c80efcd23ab1541c3693bc7602727a 100644
--- a/pkgs/applications/science/math/R/default.nix
+++ b/pkgs/applications/science/math/R/default.nix
@@ -5,11 +5,11 @@
}:
stdenv.mkDerivation rec {
- name = "R-3.0.2";
+ name = "R-3.1.0";
src = fetchurl {
url = "http://cran.r-project.org/src/base/R-3/${name}.tar.gz";
- sha256 = "0jq2vk6bgksbvgmdjvv7vfj6llp091d0nhl5j825aya4c2nhavlm";
+ sha256 = "1qjzbw341bvi1h4jwbvdkvq8j0z9l3m85mpgrlfw0n2cz2806s4a";
};
buildInputs = [ blas bzip2 gfortran liblapack libX11 libXmu libXt
diff --git a/pkgs/applications/science/math/fricas/default.nix b/pkgs/applications/science/math/fricas/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1817c43ed7bef9e79e3f4e70f503c10ca345fbb2
--- /dev/null
+++ b/pkgs/applications/science/math/fricas/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, sbcl, libX11, libXpm, libICE, libSM, libXt, libXau, libXdmcp }:
+
+stdenv.mkDerivation rec {
+ name = "fricas-1.2.2";
+
+ src = fetchurl {
+ url = "http://sourceforge.net/projects/fricas/files/fricas/1.2.2/${name}-full.tar.bz2";
+ sha256 = "87db64a1fd4211f3b776793acea931b4271d2e7a28396414c7d7397d833defe1";
+ };
+
+ buildInputs = [ sbcl libX11 libXpm libICE libSM libXt libXau libXdmcp ];
+
+ dontStrip = true;
+
+ meta = {
+ homepage = http://fricas.sourceforge.net/;
+ description = "Fricas CAS";
+ license = stdenv.lib.licenses.bsd3;
+
+ hydraPlatforms = stdenv.lib.platforms.linux;
+ maintainers = stdenv.lib.maintainers.sprock;
+ };
+}
diff --git a/pkgs/applications/science/math/maxima/default.nix b/pkgs/applications/science/math/maxima/default.nix
index 684ac321900f1ca5b77a38f383107b4a037fb9fb..7123b476f3560ef5047ccceb0b2da0523ad707a7 100644
--- a/pkgs/applications/science/math/maxima/default.nix
+++ b/pkgs/applications/science/math/maxima/default.nix
@@ -2,7 +2,7 @@
let
name = "maxima";
- version = "5.32.1";
+ version = "5.33.0";
searchPath =
stdenv.lib.makeSearchPath "bin"
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
src = fetchurl {
url = "mirror://sourceforge/${name}/${name}-${version}.tar.gz";
- sha256 = "0krxha1jckgw5s52bjasf7bnkcnq81qyi2k1bcglgqzfp79b44gw";
+ sha256 = "13axm11xw0f3frx5b0qdidi7igkn1524fzz77s9rbpl2yy2nrbz2";
};
buildInputs = [sbcl texinfo perl makeWrapper];
diff --git a/pkgs/applications/science/math/pssp/default.nix b/pkgs/applications/science/math/pssp/default.nix
index 587f41fe998b9410522b9076e10b9ff06b1622ff..0a9e0e4735d090bb24c4381a448b251f73154ef9 100644
--- a/pkgs/applications/science/math/pssp/default.nix
+++ b/pkgs/applications/science/math/pssp/default.nix
@@ -3,11 +3,11 @@
}:
stdenv.mkDerivation rec {
- name = "pspp-0.8.1";
+ name = "pspp-0.8.2";
src = fetchurl {
url = "mirror://gnu/pspp/${name}.tar.gz";
- sha256 = "0qhxsdbwxd3cn1shc13wxvx2lg32lp4z6sz24kv3jz7p5xfi8j7x";
+ sha256 = "1w7h3dglgx0jlq1wb605b8pgfsk2vr1q2q2rj7bsajh9ihbcsixr";
};
buildInputs = [ libxml2 readline zlib perl cairo gtk gsl pkgconfig
diff --git a/pkgs/applications/science/math/sloane/default.nix b/pkgs/applications/science/math/sloane/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1e318bd8a79f039e671b8ed50b598260b63d8166
--- /dev/null
+++ b/pkgs/applications/science/math/sloane/default.nix
@@ -0,0 +1,21 @@
+{ cabal, ansiTerminal, cmdargs, HTTP, terminalSize, url }:
+
+cabal.mkDerivation (self: {
+ pname = "sloane";
+ version = "1.6";
+ sha256 = "0my3j53bda3s8zxnm6is1align4k082wwsfg2y1i75js5z9kwmzy";
+ isLibrary = false;
+ isExecutable = true;
+ buildDepends = [ ansiTerminal cmdargs HTTP terminalSize url ];
+ postInstall = ''
+ mkdir -p $out/share/man/man1
+ cp sloane.1 $out/share/man/man1/
+ '';
+ meta = {
+ homepage = "http://github.com/akc/sloane";
+ description = "A command line interface to Sloane's On-Line Encyclopedia of Integer Sequences";
+ license = self.stdenv.lib.licenses.bsd3;
+ platforms = self.ghc.meta.platforms;
+ maintainers = with self.stdenv.lib.maintainers; [ akc ];
+ };
+})
diff --git a/pkgs/applications/science/misc/megam/default.nix b/pkgs/applications/science/misc/megam/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a0ee505dc97f2711799ddf9e8a01b73873371a59
--- /dev/null
+++ b/pkgs/applications/science/misc/megam/default.nix
@@ -0,0 +1,46 @@
+{ fetchurl, stdenv, ocaml, makeWrapper, ncurses }:
+
+let version = "0.92"; in
+stdenv.mkDerivation rec {
+ name = "megam-${version}";
+
+ src = fetchurl {
+ url = "http://hal3.name/megam/megam_src.tgz";
+ sha256 = "dc0e9f59ff8513449fe3bd40b260141f89c88a4edf6ddc8b8a394c758e49724e";
+ };
+
+ patches = [ ./ocaml-includes.patch ./ocaml-3.12.patch ];
+
+ buildInputs = [ ocaml ncurses ];
+
+ nativeBuildInputs = [ makeWrapper ];
+
+ makeFlags = "CAML_INCLUDES=${ocaml}/lib/ocaml/caml";
+
+ # see https://bugzilla.redhat.com/show_bug.cgi?id=435559
+ dontStrip = true;
+
+ installPhase = ''
+ mkdir -pv $out/bin
+ cp -Rv megam $out/bin
+ '';
+
+
+ meta = {
+ description = "MEGA Model Optimization Package";
+
+ longDescription =
+ '' The software here is an implementation of maximum likelihood
+ and maximum a posterior optimization of the parameters of
+ these models. The algorithms used are much more efficient
+ than the iterative scaling techniques used in almost every
+ other maxent package out there. '';
+
+ homepage = http://www.umiacs.umd.edu/~hal/megam;
+
+ license = "non-commercial";
+
+ maintainers = [ ];
+ platforms = stdenv.lib.platforms.gnu; # arbitrary choice
+ };
+}
diff --git a/pkgs/applications/science/misc/megam/ocaml-3.12.patch b/pkgs/applications/science/misc/megam/ocaml-3.12.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8265acf6e4a7bec085e464de8c7a602716f1607d
--- /dev/null
+++ b/pkgs/applications/science/misc/megam/ocaml-3.12.patch
@@ -0,0 +1,12 @@
+diff -ru megam_0.92/Makefile megam_0.92-b/Makefile
+--- megam_0.92/Makefile 2007-10-08 18:06:04.000000000 +0100
++++ megam_0.92-b/Makefile 2013-11-25 10:14:20.000000000 +0000
+@@ -59,7 +59,7 @@
+
+ WITHUNIX =unix.cma -cclib -lunix
+
+-WITHSTR =str.cma -cclib -lstr
++WITHSTR =str.cma -cclib -lcamlstr
+
+ WITHBIGARRAY =bigarray.cma -cclib -lbigarray
+
diff --git a/pkgs/applications/science/misc/megam/ocaml-includes.patch b/pkgs/applications/science/misc/megam/ocaml-includes.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b3a56643448cabd4f499a23370312bb60065c3d3
--- /dev/null
+++ b/pkgs/applications/science/misc/megam/ocaml-includes.patch
@@ -0,0 +1,21 @@
+diff -ru megam_0.92/Makefile megam_0.92-b/Makefile
+--- megam_0.92/Makefile 2007-10-08 18:06:04.000000000 +0100
++++ megam_0.92-b/Makefile 2013-11-25 10:14:20.000000000 +0000
+@@ -41,7 +41,7 @@
+ #
+ # The Caml compilers. #
+ # You may fix here the path to access the Caml compiler on your machine
+-CAMLC = ocamlc -g
++CAMLC = ocamlc -g $(WITHCLIBS)
+ CAMLOPT = ocamlopt -unsafe -ccopt -O4 -ccopt -ffast-math -inline 99999
+ CAMLDEP = ocamldep
+ CAMLLEX = ocamllex
+@@ -70,7 +70,7 @@
+ WITHDBM =dbm.cma -cclib -lmldbm -cclib -lndbm
+
+ #WITHCLIBS =-I /usr/lib/ocaml/3.09.2/caml
+-WITHCLIBS =-I /usr/lib/ocaml/caml
++WITHCLIBS =-I $(CAML_INCLUDES)
+
+ ################ End of user's variables #####################
+
diff --git a/pkgs/applications/science/misc/root/cmake.patch b/pkgs/applications/science/misc/root/cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b6efd7444fe9db1826efd0be7f70e13bc4ea436b
--- /dev/null
+++ b/pkgs/applications/science/misc/root/cmake.patch
@@ -0,0 +1,11 @@
+--- cmake/modules/RootBuildOptions.cmake 1969-12-31 20:30:01.000000000 -0330
++++ cmake/modules/RootBuildOptions.cmake 2014-01-10 14:09:29.424937408 -0330
+@@ -149,7 +149,7 @@
+
+ #---General Build options----------------------------------------------------------------------
+ # use, i.e. don't skip the full RPATH for the build tree
+-set(CMAKE_SKIP_BUILD_RPATH FALSE)
++set(CMAKE_SKIP_BUILD_RPATH TRUE)
+ # when building, don't use the install RPATH already (but later on when installing)
+ set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+ # add the automatically determined parts of the RPATH
diff --git a/pkgs/applications/science/misc/root/default.nix b/pkgs/applications/science/misc/root/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..53a045ac6f0ee11f9e0115c5d95611879c30ed5c
--- /dev/null
+++ b/pkgs/applications/science/misc/root/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, cmake, mesa, libX11, gfortran, libXpm, libXft, libXext, zlib }:
+
+stdenv.mkDerivation rec {
+ name = "root-${version}";
+ version = "5.34.15";
+
+ src = fetchurl {
+ url = "ftp://root.cern.ch/root/root_v${version}.source.tar.gz";
+ sha256 = "1bkiggcyya39a794d3d2rzzmmkbdymf86hbqhh0l1pl4f38xvp6i";
+ };
+
+ buildInputs = [ cmake gfortran mesa libX11 libXpm libXft libXext zlib ];
+
+ # CMAKE_INSTALL_RPATH_USE_LINK_PATH is set to FALSE in
+ # /cmake/modules/RootBuildOptions.cmake.
+ # This patch sets it to TRUE.
+ patches = [ ./cmake.patch ];
+ patchFlags = "-p0";
+
+ enableParallelBuilding = true;
+
+ meta = {
+ homepage = "http://root.cern.ch/drupal/";
+ description = "A data analysis framework";
+ platforms = stdenv.lib.platforms.mesaPlatforms;
+ };
+}
diff --git a/pkgs/applications/taxes/aangifte-2005/builder.sh b/pkgs/applications/taxes/aangifte-2005/builder.sh
deleted file mode 100644
index 8d284176d4447d14d1ed96d60692777d45ac48d2..0000000000000000000000000000000000000000
--- a/pkgs/applications/taxes/aangifte-2005/builder.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-source $stdenv/setup
-
-buildPhase() {
- for i in bin/*; do
- patchelf \
- --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
- --set-rpath $libX11/lib:$libXext/lib \
- $i
- done
-}
-
-installPhase() {
- mkdir -p $out
- cp -prvd * $out/
-}
-
-genericBuild
diff --git a/pkgs/applications/taxes/aangifte-2005/default.nix b/pkgs/applications/taxes/aangifte-2005/default.nix
deleted file mode 100644
index 03ba20b11dae991d50bbc6dbad161c41c366dc4b..0000000000000000000000000000000000000000
--- a/pkgs/applications/taxes/aangifte-2005/default.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-{stdenv, fetchurl, libX11, libXext}:
-
-stdenv.mkDerivation {
- name = "aangifte2005-1";
- builder = ./builder.sh;
-
- src = fetchurl {
- url = http://download.belastingdienst.nl/belastingdienst/apps/linux/ib2005_linux.tar.gz;
- md5 = "9cc709b8ad041f4b20154ff1491d0436";
- };
-
- inherit libX11 libXext;
-}
diff --git a/pkgs/applications/taxes/aangifte-2006/default.nix b/pkgs/applications/taxes/aangifte-2006/default.nix
index 8bf5ddeee40d57e4a235943720438ac010c8547d..72d6999fa1d7ba181cd95b4bf3ff49a0dcd8b01d 100644
--- a/pkgs/applications/taxes/aangifte-2006/default.nix
+++ b/pkgs/applications/taxes/aangifte-2006/default.nix
@@ -14,5 +14,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2006";
url = "http://www.belastingdienst.nl/download/1341.html";
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2007/default.nix b/pkgs/applications/taxes/aangifte-2007/default.nix
index 3cd472b51c259c977af524aeba09bece591c89eb..15c826feb6e7174607c92dc4729bfcc4a6f06cb1 100644
--- a/pkgs/applications/taxes/aangifte-2007/default.nix
+++ b/pkgs/applications/taxes/aangifte-2007/default.nix
@@ -17,5 +17,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2007";
url = "http://www.belastingdienst.nl/download/1341.html";
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2008/default.nix b/pkgs/applications/taxes/aangifte-2008/default.nix
index 85d5b3045be004302dafa02c0b3e8774f8730821..905471cb76b80dd4f0befff2e792fc006d465df0 100644
--- a/pkgs/applications/taxes/aangifte-2008/default.nix
+++ b/pkgs/applications/taxes/aangifte-2008/default.nix
@@ -18,5 +18,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2008 (Dutch Tax Return Program)";
url = http://www.belastingdienst.nl/particulier/aangifte2008/aangifte_2008/aangifte_2008.html;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2009/default.nix b/pkgs/applications/taxes/aangifte-2009/default.nix
index eeeb4a1d1e53504bf52e7881a8a3c61e1a6af093..9aa7a81727110b1af8d677f57c6ae5221fb6ec95 100644
--- a/pkgs/applications/taxes/aangifte-2009/default.nix
+++ b/pkgs/applications/taxes/aangifte-2009/default.nix
@@ -33,5 +33,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2009 (Dutch Tax Return Program)";
url = http://www.belastingdienst.nl/particulier/aangifte2009/download/;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2010/default.nix b/pkgs/applications/taxes/aangifte-2010/default.nix
index 65ff561ee9ef644c9b2b02ca0db2bd865bf00469..23338c01ec3ed0f2c9bc021fbb0f4753a5e61ba8 100644
--- a/pkgs/applications/taxes/aangifte-2010/default.nix
+++ b/pkgs/applications/taxes/aangifte-2010/default.nix
@@ -33,5 +33,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2010 (Dutch Tax Return Program)";
url = http://www.belastingdienst.nl/particulier/aangifte2009/download/;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2011/default.nix b/pkgs/applications/taxes/aangifte-2011/default.nix
index 0bffad95d50be2f1a5403dd3e15ccb8aaa145348..e5bc233affa09e50e30cb3efad50fc3de49f4efd 100644
--- a/pkgs/applications/taxes/aangifte-2011/default.nix
+++ b/pkgs/applications/taxes/aangifte-2011/default.nix
@@ -33,5 +33,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2011 (Dutch Tax Return Program)";
url = http://www.belastingdienst.nl/particulier/aangifte2009/download/;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2012/default.nix b/pkgs/applications/taxes/aangifte-2012/default.nix
index 8f36fd485dddfd27a404cdc655fe1ad9d311c485..544fe4ec55f92585ea455c1bb46729df3ac1e715 100644
--- a/pkgs/applications/taxes/aangifte-2012/default.nix
+++ b/pkgs/applications/taxes/aangifte-2012/default.nix
@@ -34,5 +34,8 @@ stdenv.mkDerivation {
meta = {
description = "Elektronische aangifte IB 2012 (Dutch Tax Return Program)";
url = http://www.belastingdienst.nl/particulier/aangifte2012/download/;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
};
}
diff --git a/pkgs/applications/taxes/aangifte-2013/default.nix b/pkgs/applications/taxes/aangifte-2013/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5cf90320adc719a6972edf2ccde6ee9565f8a80b
--- /dev/null
+++ b/pkgs/applications/taxes/aangifte-2013/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, makeWrapper, xdg_utils, libX11, libXext, libSM }:
+
+stdenv.mkDerivation {
+ name = "aangifte2013-1";
+
+ src = fetchurl {
+ url = http://download.belastingdienst.nl/belastingdienst/apps/linux/ib2013_linux.tar.gz;
+ sha256 = "05biqxz39gwln960xj31yg8s2chdn9vs0lzm4rlcwcavxy8lam1c";
+ };
+
+ dontStrip = true;
+ dontPatchELF = true;
+
+ buildInputs = [ makeWrapper ];
+
+ buildPhase =
+ ''
+ for i in bin/*; do
+ patchelf \
+ --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
+ --set-rpath ${stdenv.lib.makeLibraryPath [ libX11 libXext libSM ]}:$(cat $NIX_GCC/nix-support/orig-gcc)/lib \
+ $i
+ done
+ '';
+
+ installPhase =
+ ''
+ mkdir -p $out
+ cp -prvd * $out/
+ wrapProgram $out/bin/ib2013ux --prefix PATH : ${xdg_utils}/bin \
+ --prefix LD_PRELOAD : $(cat $NIX_GCC/nix-support/orig-gcc)/lib/libgcc_s.so.1
+ '';
+
+ meta = {
+ description = "Elektronische aangifte IB 2013 (Dutch Tax Return Program)";
+ url = http://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/themaoverstijgend/programmas_en_formulieren/aangifteprogramma_2013_linux;
+ license = stdenv.lib.licenses.unfree;
+ platforms = stdenv.lib.platforms.linux;
+ hydraPlatforms = [];
+ };
+}
diff --git a/pkgs/applications/version-management/bazaar/add_certificates.patch b/pkgs/applications/version-management/bazaar/add_certificates.patch
new file mode 100644
index 0000000000000000000000000000000000000000..332f42aa89cc608d96d99989af11a2ace6fd4b84
--- /dev/null
+++ b/pkgs/applications/version-management/bazaar/add_certificates.patch
@@ -0,0 +1,11 @@
+diff -ru orig/bzrlib/transport/http/_urllib2_wrappers.py bzr-2.6.0/bzrlib/transport/http/_urllib2_wrappers.py
+--- orig/bzrlib/transport/http/_urllib2_wrappers.py 2013-07-27 13:50:53.000000000 +0200
++++ bzr-2.6.0/bzrlib/transport/http/_urllib2_wrappers.py 2014-02-04 18:34:15.838622492 +0100
+@@ -86,6 +86,7 @@
+ u"/usr/local/share/certs/ca-root-nss.crt", # FreeBSD
+ # XXX: Needs checking, can't trust the interweb ;) -- vila 2012-01-25
+ u'/etc/openssl/certs/ca-certificates.crt', # Solaris
++ u'@certPath@',
+ ]
+ def default_ca_certs():
+ if sys.platform == 'win32':
diff --git a/pkgs/applications/version-management/bazaar/default.nix b/pkgs/applications/version-management/bazaar/default.nix
index 1eb114ecd8ceb1df353f46c243631989eadbbced..2ea916052a387f746f90515469f4ffc1148283cf 100644
--- a/pkgs/applications/version-management/bazaar/default.nix
+++ b/pkgs/applications/version-management/bazaar/default.nix
@@ -1,20 +1,28 @@
-{ stdenv, fetchurl, pythonPackages }:
+{ stdenv, fetchurl, pythonPackages, cacert }:
stdenv.mkDerivation rec {
- version = "2.5";
- release = ".1";
+ version = "2.6";
+ release = ".0";
name = "bazaar-${version}${release}";
src = fetchurl {
url = "http://launchpad.net/bzr/${version}/${version}${release}/+download/bzr-${version}${release}.tar.gz";
- sha256 = "10krjbzia2avn09p0cdlbx2wya0r5v11w5ymvyl72af5dkx4cwwn";
+ sha256 = "1c6sj77h5f97qimjc14kr532kgc0jk3wq778xrkqi0pbh9qpk509";
};
- buildInputs = [ pythonPackages.python pythonPackages.wrapPython ];
+ buildInputs = [ pythonPackages.python pythonPackages.wrapPython cacert ];
# Readline support is needed by bzrtools.
pythonPath = [ pythonPackages.readline ];
+ # Bazaar can't find the certificates alone
+ patches = [ ./add_certificates.patch ];
+ postPatch = ''
+ substituteInPlace bzrlib/transport/http/_urllib2_wrappers.py \
+ --subst-var-by "certPath" "${cacert}/etc/ca-bundle.crt"
+ '';
+
+
installPhase = ''
python setup.py install --prefix=$out
wrapPythonPrograms
diff --git a/pkgs/applications/version-management/codeville/0.8.0.nix b/pkgs/applications/version-management/codeville/0.8.0.nix
index 5c1910d6c6f6ce824d926b07c24bb86239fa1aa5..0c0f3c4c19c0336c61d693582391de5398b1d51e 100644
--- a/pkgs/applications/version-management/codeville/0.8.0.nix
+++ b/pkgs/applications/version-management/codeville/0.8.0.nix
@@ -1,6 +1,6 @@
args : with args;
-if (! python ? db4Support) || (! python.db4Support) then
+if (! python ? dbSupport) || (! python.dbSupport) then
throw ''Python DB4 support is required for codeville.''
else
diff --git a/pkgs/applications/version-management/fossil/default.nix b/pkgs/applications/version-management/fossil/default.nix
index 2a669729a9c609662416cca1329a074f0c1658d7..c2793190e892575a0030f9751139a0a59fe87a45 100644
--- a/pkgs/applications/version-management/fossil/default.nix
+++ b/pkgs/applications/version-management/fossil/default.nix
@@ -1,11 +1,11 @@
{stdenv, fetchurl, zlib, openssl, tcl, readline, sqlite, withJson ? true}:
stdenv.mkDerivation {
- name = "fossil-1.27";
+ name = "fossil-1.28";
src = fetchurl {
- url = http://www.fossil-scm.org/download/fossil-src-20130911114349.tar.gz;
- sha256 = "0n40z8bx2311i11zjx2x15lw3q8vzjwvfqzikrjlqnpal4vzd72f";
+ url = http://www.fossil-scm.org/download/fossil-src-20140127173344.tar.gz;
+ sha256 = "105a3f3wiqshmkw8q7f7ask3nm0jkjf0h3h2283qiqlsqfkwb9xc";
};
buildInputs = [ zlib openssl readline sqlite ];
diff --git a/pkgs/applications/version-management/git-and-tools/cgit/default.nix b/pkgs/applications/version-management/git-and-tools/cgit/default.nix
index ce4d9f98596f74ce9aca7a3d694b0c4287d4635f..47fa80cb901389fa1ffc6f2a043d962677b81849 100644
--- a/pkgs/applications/version-management/git-and-tools/cgit/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/cgit/default.nix
@@ -4,20 +4,23 @@
}:
stdenv.mkDerivation rec {
- name = "cgit-0.10";
+ name = "cgit-${version}";
+ version = "0.10.1";
src = fetchurl {
url = "http://git.zx2c4.com/cgit/snapshot/${name}.tar.xz";
- sha256 = "0ynywva0lrsasdm3nlk3dmd8k5bnrd9qlvmk4n42dfw9g1xj5i4h";
+ sha256 = "0bci1p9spf79wirc4lk36cndcx2b9wj0fq1l58rlp6r563is77l3";
};
# cgit is is tightly coupled with git and needs a git source tree to build.
# The cgit-0.10 Makefile has GIT_VER = 1.8.5, so use that version.
# IMPORTANT: Remember to check which git version cgit needs on every version
# bump.
+ # NOTE: as of 0.10.1, the git version is compatible from 1.9.0 to
+ # 1.9.2 (see the repository history)
gitSrc = fetchurl {
- url = https://git-core.googlecode.com/files/git-1.8.5.tar.gz;
- sha256 = "08vbq8y3jx1da417hkqmrkdkysac1sqjvrjmaj1v56dmkghm43w7";
+ url = "https://www.kernel.org/pub/software/scm/git/git-1.9.2.tar.xz";
+ sha256 = "1x4rb06vw4ckdflmn01r5l9spvn7cng4i5mm3sbd0n8cz0n6xz13";
};
buildInputs = [
@@ -53,6 +56,7 @@ stdenv.mkDerivation rec {
meta = {
homepage = http://git.zx2c4.com/cgit/about/;
+ repositories.git = git://git.zx2c4.com/cgit;
description = "Web frontend for git repositories";
license = stdenv.lib.licenses.gpl2;
platforms = stdenv.lib.platforms.linux;
diff --git a/pkgs/applications/version-management/git-and-tools/default.nix b/pkgs/applications/version-management/git-and-tools/default.nix
index ee1de54a4fb0ff67f2465854520805c2c2385ae4..96e4631889c79a6575fb9319c4d0f5ef817f621c 100644
--- a/pkgs/applications/version-management/git-and-tools/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/default.nix
@@ -4,10 +4,8 @@
args: with args; with pkgs;
let
inherit (pkgs) stdenv fetchgit fetchurl subversion;
-in
-rec {
- git = lib.makeOverridable (import ./git) {
+ gitBase = lib.makeOverridable (import ./git) {
inherit fetchurl stdenv curl openssl zlib expat perl python gettext gnugrep
asciidoc xmlto docbook2x docbook_xsl docbook_xml_dtd_45 libxslt cpio tcl
tk makeWrapper subversionClient gzip;
@@ -24,6 +22,9 @@ rec {
];
};
+in
+rec {
+
# support for bugzilla
gitBz = import ./git-bz {
inherit fetchgit stdenv makeWrapper python asciidoc xmlto # docbook2x docbook_xsl docbook_xml_dtd_45 libxslt
@@ -31,17 +32,19 @@ rec {
inherit (pythonPackages) pysqlite;
};
+ git = appendToName "minimal" gitBase;
+
# Git with SVN support, but without GUI.
- gitSVN = lowPrio (appendToName "with-svn" (git.override {
+ gitSVN = lowPrio (appendToName "with-svn" (gitBase.override {
svnSupport = true;
}));
# The full-featured Git.
- gitFull = appendToName "full" (git.override {
+ gitFull = gitBase.override {
svnSupport = true;
guiSupport = true;
sendEmailSupport = !stdenv.isDarwin;
- });
+ };
gitAnnex = pkgs.haskellPackages.gitAnnex;
diff --git a/pkgs/applications/version-management/git-and-tools/git-annex/default.nix b/pkgs/applications/version-management/git-and-tools/git-annex/default.nix
index 28b64c118bae333e8b954ec9019719d77a768d83..dcf76160ec61636cbbc052e514bb2abcb6a62050 100644
--- a/pkgs/applications/version-management/git-and-tools/git-annex/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/git-annex/default.nix
@@ -1,34 +1,37 @@
-{ cabal, aeson, async, blazeBuilder, bloomfilter, bup
+{ cabal, aeson, async, blazeBuilder, bloomfilter, bup, byteable
, caseInsensitive, clientsession, cryptoApi, cryptohash, curl
, dataDefault, dataenc, DAV, dbus, dlist, dns, editDistance
-, extensibleExceptions, feed, filepath, git, gnupg1, gnutls, hamlet
-, hinotify, hS3, hslogger, HTTP, httpConduit, httpTypes, IfElse
-, json, lsof, MissingH, MonadCatchIOTransformers, monadControl, mtl
-, network, networkConduit, networkInfo, networkMulticast
-, networkProtocolXmpp, openssh, perl, QuickCheck, random, regexTdfa
-, rsync, SafeSemaphore, SHA, stm, tasty, tastyHunit
-, tastyQuickcheck, text, time, transformers, unixCompat, utf8String
-, uuid, wai, waiLogger, warp, which, xmlConduit, xmlTypes, yesod
-, yesodCore, yesodDefault, yesodForm, yesodStatic
+, extensibleExceptions, fdoNotify, feed, filepath, git, gnupg1
+, gnutls, hamlet, hinotify, hS3, hslogger, HTTP, httpClient
+, httpConduit, httpTypes, IfElse, json, liftedBase, lsof, MissingH
+, MonadCatchIOTransformers, monadControl, mtl, network
+, networkConduit, networkInfo, networkMulticast
+, networkProtocolXmpp, openssh, optparseApplicative, perl
+, QuickCheck, random, regexTdfa, rsync, SafeSemaphore, securemem
+, SHA, stm, tasty, tastyHunit, tastyQuickcheck, tastyRerun, text
+, time, transformers, unixCompat, utf8String, uuid, wai, waiLogger
+, warp, warpTls, which, xmlTypes, yesod, yesodCore, yesodDefault
+, yesodForm, yesodStatic
}:
cabal.mkDerivation (self: {
pname = "git-annex";
- version = "5.20140108";
- sha256 = "17j1avmg66lda52p93689n4mas46rfbjdvss1rvmdh10cj7hg8jy";
+ version = "5.20140405";
+ sha256 = "0nbfnv9z2jhx2jr2nma0y1znvbaa09rv1drl6wk27j6xsbiq3p3k";
isLibrary = false;
isExecutable = true;
buildDepends = [
- aeson async blazeBuilder bloomfilter caseInsensitive clientsession
- cryptoApi cryptohash dataDefault dataenc DAV dbus dlist dns
- editDistance extensibleExceptions feed filepath gnutls hamlet
- hinotify hS3 hslogger HTTP httpConduit httpTypes IfElse json
- MissingH MonadCatchIOTransformers monadControl mtl network
- networkConduit networkInfo networkMulticast networkProtocolXmpp
- QuickCheck random regexTdfa SafeSemaphore SHA stm tasty tastyHunit
- tastyQuickcheck text time transformers unixCompat utf8String uuid
- wai waiLogger warp xmlConduit xmlTypes yesod yesodCore yesodDefault
- yesodForm yesodStatic
+ aeson async blazeBuilder bloomfilter byteable caseInsensitive
+ clientsession cryptoApi cryptohash dataDefault dataenc DAV dbus
+ dlist dns editDistance extensibleExceptions fdoNotify feed filepath
+ gnutls hamlet hinotify hS3 hslogger HTTP httpClient httpConduit
+ httpTypes IfElse json liftedBase MissingH MonadCatchIOTransformers
+ monadControl mtl network networkConduit networkInfo
+ networkMulticast networkProtocolXmpp optparseApplicative QuickCheck
+ random regexTdfa SafeSemaphore securemem SHA stm tasty tastyHunit
+ tastyQuickcheck tastyRerun text time transformers unixCompat
+ utf8String uuid wai waiLogger warp warpTls xmlTypes yesod yesodCore
+ yesodDefault yesodForm yesodStatic
];
buildTools = [ bup curl git gnupg1 lsof openssh perl rsync which ];
configureFlags = "-fS3
@@ -51,6 +54,7 @@ cabal.mkDerivation (self: {
cp dist/build/git-annex/git-annex git-annex
./git-annex test
'';
+ propagatedUserEnvPkgs = [git lsof];
meta = {
homepage = "http://git-annex.branchable.com/";
description = "manage files with git, without checking their contents into git";
diff --git a/pkgs/applications/version-management/git-and-tools/git/cert-path.patch b/pkgs/applications/version-management/git-and-tools/git/cert-path.patch
new file mode 100644
index 0000000000000000000000000000000000000000..846752f5bfe3a887bdd66b84d56579cf5817764b
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git/cert-path.patch
@@ -0,0 +1,12 @@
+diff -ru -x '*~' git-1.9.2-orig/git-send-email.perl git-1.9.2/git-send-email.perl
+--- git-1.9.2-orig/git-send-email.perl 2014-04-09 21:09:34.000000000 +0200
++++ git-1.9.2/git-send-email.perl 2014-04-16 18:35:05.861132282 +0200
+@@ -1094,6 +1094,8 @@
+ return;
+ }
+
++ $smtp_ssl_cert_path //= $ENV{'OPENSSL_X509_CERT_FILE'};
++
+ if (!defined $smtp_ssl_cert_path) {
+ # use the OpenSSL defaults
+ return (SSL_verify_mode => SSL_VERIFY_PEER());
diff --git a/pkgs/applications/version-management/git-and-tools/git/default.nix b/pkgs/applications/version-management/git-and-tools/git/default.nix
index dd8821711de16fed87ffab73948ca9e8cbe8cce9..861030bae99443a616c41f3e111705080f6e67fb 100644
--- a/pkgs/applications/version-management/git-and-tools/git/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/git/default.nix
@@ -10,7 +10,7 @@
let
- version = "1.8.5.2";
+ version = "1.9.2";
svn = subversionClient.override { perlBindings = true; };
@@ -20,11 +20,11 @@ stdenv.mkDerivation {
name = "git-${version}";
src = fetchurl {
- url = "http://git-core.googlecode.com/files/git-${version}.tar.gz";
- sha256 = "12iyj6f89dmb1cn2pvym5lrf23g4m71mp9pwkbi1zscb9d998ih2";
+ url = "https://www.kernel.org/pub/software/scm/git/git-${version}.tar.xz";
+ sha256 = "1x4rb06vw4ckdflmn01r5l9spvn7cng4i5mm3sbd0n8cz0n6xz13";
};
- patches = [ ./docbook2texi.patch ./symlinks-in-bin.patch ];
+ patches = [ ./docbook2texi.patch ./symlinks-in-bin.patch ./cert-path.patch ];
buildInputs = [curl openssl zlib expat gettext cpio makeWrapper]
++ stdenv.lib.optionals withManual [ asciidoc texinfo xmlto docbook2x
@@ -35,7 +35,10 @@ stdenv.mkDerivation {
NIX_LDFLAGS = stdenv.lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
makeFlags = "prefix=\${out} sysconfdir=/etc/ PERL_PATH=${perl}/bin/perl SHELL_PATH=${stdenv.shell} "
- + (if pythonSupport then "PYTHON_PATH=${python}/bin/python" else "NO_PYTHON=1");
+ + (if pythonSupport then "PYTHON_PATH=${python}/bin/python" else "NO_PYTHON=1")
+ + (if stdenv.isSunOS then " INSTALL=install NO_INET_NTOP= NO_INET_PTON=" else "")
+ + (if stdenv.isDarwin then " NO_APPLE_COMMON_CRYPTO=1" else "");
+
# FIXME: "make check" requires Sparse; the Makefile must be tweaked
# so that `SPARSE_FLAGS' corresponds to the current architecture...
@@ -46,8 +49,7 @@ stdenv.mkDerivation {
postInstall =
''
notSupported() {
- echo -e "#\!/bin/sh\necho '`basename $1` not supported, $2'\nexit 1" > "$1"
- chmod +x $1
+ unlink $1 || true
}
# Install git-subtree.
@@ -65,7 +67,7 @@ stdenv.mkDerivation {
mkdir -p $out/etc/bash_completion.d
ln -s $out/share/git/contrib/completion/git-completion.bash $out/etc/bash_completion.d/
- # grep is a runtime dependence, need to patch so that it's found
+ # grep is a runtime dependency, need to patch so that it's found
substituteInPlace $out/libexec/git-core/git-sh-setup \
--replace ' grep' ' ${gnugrep}/bin/grep' \
--replace ' egrep' ' ${gnugrep}/bin/egrep'
@@ -76,7 +78,7 @@ stdenv.mkDerivation {
-e 's| perl -e| ${perl}/bin/perl -e|g' \
$out/libexec/git-core/{git-am,git-submodule}
- # gzip (and optionally bzip2, xz, zip) are a runtime dependencies for
+ # gzip (and optionally bzip2, xz, zip) are runtime dependencies for
# gitweb.cgi, need to patch so that it's found
sed -i -e "s|'compressor' => \['gzip'|'compressor' => ['${gzip}/bin/gzip'|" \
$out/share/gitweb/gitweb.cgi
@@ -93,7 +95,7 @@ stdenv.mkDerivation {
--set GITPERLLIB "$gitperllib" \
--prefix PATH : "${svn}/bin" ''
else '' # replace git-svn by notification script
- notSupported $out/libexec/git-core/git-svn "reinstall with config git = { svnSupport = true } set"
+ notSupported $out/libexec/git-core/git-svn
'')
+ (if sendEmailSupport then
@@ -105,7 +107,7 @@ stdenv.mkDerivation {
wrapProgram $out/libexec/git-core/git-send-email \
--set GITPERLLIB "$gitperllib" ''
else '' # replace git-send-email by notification script
- notSupported $out/libexec/git-core/git-send-email "reinstall with config git = { sendEmailSupport = true } set"
+ notSupported $out/libexec/git-core/git-send-email
'')
+ stdenv.lib.optionalString withManual ''# Install man pages and Info manual
@@ -122,8 +124,7 @@ stdenv.mkDerivation {
'' else ''
# Don't wrap Tcl/Tk, replace them by notification scripts
for prog in bin/gitk libexec/git-core/git-gui; do
- notSupported "$out/$prog" \
- "reinstall with config git = { guiSupport = true; } set"
+ notSupported "$out/$prog"
done
'');
diff --git a/pkgs/applications/version-management/git-and-tools/gitflow/default.nix b/pkgs/applications/version-management/git-and-tools/gitflow/default.nix
index 26a7826d4f0cafba1fded7ce298c11f098b04905..0898345c30b64a700578ee54b2b78d3c47cf041f 100644
--- a/pkgs/applications/version-management/git-and-tools/gitflow/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/gitflow/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "gitflow-${version}";
- version = "1.6.1";
+ version = "1.7.0";
src = fetchurl {
url = "https://github.com/petervanderdoes/gitflow/archive/${version}.tar.gz";
- sha256 = "1f4879ahi8diddn7qvhr0dkj96gh527xnfihbf1ha83fn9cvvcls";
+ sha256 = "0rppgyqgk0drip6852bdm2479zks16cb3mj1jdw6jq80givrqnjx";
};
preBuild = ''
diff --git a/pkgs/applications/version-management/git-and-tools/hub/default.nix b/pkgs/applications/version-management/git-and-tools/hub/default.nix
index b9a053211faeb1d0e859f32ad46b7ac20c7a0d7d..28484322d351a7ac827bc3a97ea2356cfee853f6 100644
--- a/pkgs/applications/version-management/git-and-tools/hub/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/hub/default.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "hub-${version}";
- version = "1.10.6";
+ version = "1.12.0";
src = fetchurl {
url = "https://github.com/github/hub/archive/v${version}.tar.gz";
- sha256 = "0vfl1iq1927in81vd7zvp7yqqzay7pciyj87s83qfxrqyjpxn609";
+ sha256 = "1lbl4dl7483q320qw4jm6mqq4dbbk3xncypxgg86zcdigxvw6igv";
};
buildInputs = [ rake makeWrapper ];
diff --git a/pkgs/applications/version-management/git-and-tools/stgit/default.nix b/pkgs/applications/version-management/git-and-tools/stgit/default.nix
index 6518f32ef7c6ae4525450fc96bb4d5d20ffa4109..d4b74390c4ccf7eedcac859e1a32513ae96fa404 100644
--- a/pkgs/applications/version-management/git-and-tools/stgit/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/stgit/default.nix
@@ -1,14 +1,14 @@
{ stdenv, fetchurl, python, git }:
let
- name = "stgit-0.16";
+ name = "stgit-0.17.1";
in
stdenv.mkDerivation {
inherit name;
src = fetchurl {
url = "http://download.gna.org/stgit/${name}.tar.gz";
- sha256 = "0hla6401g2kicaakz4awk67yf8fhqbw1shn1p9ma5x6ca29s3w82";
+ sha256 = "1pka0ns9x0kabn036zsf0mwmwiynckhnva51kgxsch9fqah6acyl";
};
buildInputs = [ python git ];
diff --git a/pkgs/applications/version-management/git-and-tools/svn2git/default.nix b/pkgs/applications/version-management/git-and-tools/svn2git/default.nix
index 0053a1dfafbe9fd076825951baa35197766249f9..b0cfcaeb110804f9f04a0aea73e5e54d8a08a60b 100644
--- a/pkgs/applications/version-management/git-and-tools/svn2git/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/svn2git/default.nix
@@ -1,14 +1,14 @@
{ stdenv, fetchurl, ruby, makeWrapper, git }:
let
- version = "2.2.2";
+ version = "2.2.5";
in
stdenv.mkDerivation {
name = "svn2git-${version}";
src = fetchurl {
url = "https://github.com/nirvdrum/svn2git/archive/v${version}.tar.gz";
- sha256 = "14zinkpgybz15jvbfw0sb432w6f5w4sa5pdqycjwva8v8lxqn9mh";
+ sha256 = "1afmrr80357pg3kawyghhc55z1pszaq8fyrrjmxa6nr9dcrqjwwh";
};
buildInputs = [ ruby makeWrapper ];
diff --git a/pkgs/applications/version-management/git-and-tools/tig/default.nix b/pkgs/applications/version-management/git-and-tools/tig/default.nix
index 23009efdbd54938b78b8a17ea8bdd62fcc8b3da8..fd9011130e3480ea76959a73b3ee49f122b991c9 100644
--- a/pkgs/applications/version-management/git-and-tools/tig/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/tig/default.nix
@@ -26,6 +26,6 @@ stdenv.mkDerivation rec {
description = "Text-mode interface for git";
maintainers = with maintainers; [ garbas bjornfor iElectric ];
license = licenses.gpl2;
- platforms = platforms.linux;
+ platforms = platforms.unix;
};
}
diff --git a/pkgs/applications/version-management/gource/default.nix b/pkgs/applications/version-management/gource/default.nix
index 3b6d19e8fcf2e0f4bda36a33f5d77f639919d354..13c554767743095e63f1a335ce72e95c6ea0454b 100644
--- a/pkgs/applications/version-management/gource/default.nix
+++ b/pkgs/applications/version-management/gource/default.nix
@@ -16,6 +16,8 @@ stdenv.mkDerivation rec {
configureFlags = "--with-boost-libdir=${boost}/lib";
+ NIX_CFLAGS_COMPILE = "-fpermissive"; # fix build with newer gcc versions
+
meta = {
homepage = "http://code.google.com/p/gource/";
description = "software version control visualization tool";
diff --git a/pkgs/applications/version-management/kdesvn/default.nix b/pkgs/applications/version-management/kdesvn/default.nix
index 6373eb9f7f97131c3b9cc1844c79d1bb5069c1ae..60f5d8bb9e08d8acc20b4fb4947c46265084fffc 100644
--- a/pkgs/applications/version-management/kdesvn/default.nix
+++ b/pkgs/applications/version-management/kdesvn/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, gettext, apr, aprutil, subversion, db4, kdelibs, expat }:
+{ stdenv, fetchurl, gettext, apr, aprutil, subversion, db, kdelibs, expat }:
# the homepage mentions this is the final release.
# from now on, kdesvn will be part of the official kde software distribution
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
sed -i -e "s|/usr|${subversion}|g" src/svnqt/cmakemodules/FindSubversion.cmake
'';
- buildInputs = [ apr aprutil subversion db4 kdelibs expat ];
+ buildInputs = [ apr aprutil subversion db kdelibs expat ];
nativeBuildInputs = [ gettext ];
diff --git a/pkgs/applications/version-management/mercurial/default.nix b/pkgs/applications/version-management/mercurial/default.nix
index fae0c6a5ed6bef6fe1f3d5adffac0e0ead521f1b..5fdafe8ac2aa5a1f0e93b183ad77423a003d7af7 100644
--- a/pkgs/applications/version-management/mercurial/default.nix
+++ b/pkgs/applications/version-management/mercurial/default.nix
@@ -2,7 +2,7 @@
, guiSupport ? false, tk ? null, curses }:
let
- name = "mercurial-2.8.2";
+ name = "mercurial-2.9.2";
in
stdenv.mkDerivation {
@@ -10,7 +10,7 @@ stdenv.mkDerivation {
src = fetchurl {
url = "http://mercurial.selenic.com/release/${name}.tar.gz";
- sha256 = "0vxyxx91k6z0knfqslbwxswbc52abrg2pdf395kwvij026ibm9f8";
+ sha256 = "0lwgncim4cy91ly8389h2bbhl4nbi8xjgp0kx37kgq8q2lx2nil6";
};
inherit python; # pass it so that the same version can be used in hg2git
diff --git a/pkgs/applications/version-management/mr/default.nix b/pkgs/applications/version-management/mr/default.nix
index 9e8024d7b1918ea9dc2043353a271a4df56509f0..e89cea6aadcea0ce59d5e140df4ee3dae4dcc05a 100644
--- a/pkgs/applications/version-management/mr/default.nix
+++ b/pkgs/applications/version-management/mr/default.nix
@@ -17,13 +17,14 @@ stdenv.mkDerivation rec {
'';
installPhase = ''
- mkdir -pv $out/bin $out/share/man/man1
+ mkdir -pv $out/bin $out/share/man/man1 $out/share/mr
cp -v mr $out/bin
cp -v webcheckout $out/bin
cp -v mr.1 $out/share/man/man1
cp -v webcheckout.1 $out/share/man/man1
+ cp -v lib/* $out/share/mr
'';
-
+
meta = {
description = "Multiple Repository management tool";
longDescription = ''The mr(1) command can checkout, update, or perform other actions on a
@@ -53,4 +54,3 @@ stdenv.mkDerivation rec {
maintainers = [ stdenv.lib.maintainers.antono ];
};
}
-
diff --git a/pkgs/applications/version-management/rcs/default.nix b/pkgs/applications/version-management/rcs/default.nix
index 5f88bbc74cc60c1a67e5b020d8da5062d7a8dc27..90bca9b07124cf4f8803e5ae917efba2ab035707 100644
--- a/pkgs/applications/version-management/rcs/default.nix
+++ b/pkgs/applications/version-management/rcs/default.nix
@@ -1,13 +1,15 @@
-{ stdenv, fetchurl }:
+{ stdenv, fetchurl, ed }:
stdenv.mkDerivation rec {
- name = "rcs-5.8.2";
+ name = "rcs-5.9.2";
src = fetchurl {
- url = "mirror://gnu/rcs/${name}.tar.gz";
- sha256 = "1p4kqqrvc7plc3n6ls4xwp6d3mw1jcx9p36pilwd65q31mgbs07a";
+ url = "mirror://gnu/rcs/${name}.tar.xz";
+ sha256 = "0wdmmplga9k05d9k7wjqv4zb6xvvzsli8hmn206pvangki1g66k5";
};
+ buildInputs = [ ed ];
+
doCheck = true;
meta = {
diff --git a/pkgs/applications/version-management/subversion/default.nix b/pkgs/applications/version-management/subversion/default.nix
index 67346ef8389b1cbf1454e6e4c864c71eeffc4aa2..e699b82f2b0a996093b32faf321990cec76350d3 100644
--- a/pkgs/applications/version-management/subversion/default.nix
+++ b/pkgs/applications/version-management/subversion/default.nix
@@ -17,13 +17,13 @@ assert javahlBindings -> jdk != null && perl != null;
stdenv.mkDerivation rec {
- version = "1.8.5";
+ version = "1.8.8";
name = "subversion-${version}";
src = fetchurl {
url = "mirror://apache/subversion/${name}.tar.bz2";
- sha256 = "0r3mxrrlr1l9s2nh829bf0qmrfaafkq3di6ndr10j76sxkqjnlpx";
+ sha256 = "1cqxwydjidyf59y4lgkxl7bra1sy28abqm2mi5971qjsv0f96s8m";
};
buildInputs = [ zlib apr aprutil sqlite ]
@@ -77,6 +77,6 @@ stdenv.mkDerivation rec {
description = "A version control system intended to be a compelling replacement for CVS in the open source community";
homepage = http://subversion.apache.org/;
maintainers = with stdenv.lib.maintainers; [ eelco lovek323 ];
- platforms = stdenv.lib.platforms.linux ++ stdenv.lib.platforms.darwin;
+ hydraPlatforms = stdenv.lib.platforms.linux ++ stdenv.lib.platforms.darwin;
};
}
diff --git a/pkgs/applications/version-management/vcsh/default.nix b/pkgs/applications/version-management/vcsh/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d438cb1bc6cdd738938bc0717a17f7aa7597bb61
--- /dev/null
+++ b/pkgs/applications/version-management/vcsh/default.nix
@@ -0,0 +1,28 @@
+{stdenv, fetchgit}:
+
+stdenv.mkDerivation rec {
+ rev = "75c4c554eefbefb714fabd356933858edbce3b1e";
+ version = "1.20131229";
+ name = "vcsh-${version}_${rev}";
+
+ src = fetchgit {
+ inherit rev;
+ url = "https://github.com/RichiH/vcsh";
+ sha256 = "0rc82a8vnnk9q6q88z9s10873gqgdpppbpwy2yw8a7hydqrpn0hs";
+ };
+
+ phases = [ "unpackPhase" "installPhase" "fixupPhase" ];
+
+ installPhase = ''
+ mkdir -p $out/bin
+ cp vcsh $out/bin
+ '';
+
+ meta = {
+ description = "Version Control System for $HOME";
+ homepage = https://github.com/RichiH/vcsh;
+ license = stdenv.lib.licenses.gpl2Plus;
+ maintainers = [ stdenv.lib.maintainers.garbas ];
+ platforms = stdenv.lib.platforms.unix;
+ };
+}
diff --git a/pkgs/applications/video/aegisub/default.nix b/pkgs/applications/video/aegisub/default.nix
index cbbb23b04a05e4a82010d528eb809990c6d41db2..9bbc7c9e73958b1add0d3b4f1ab3100794769a3e 100644
--- a/pkgs/applications/video/aegisub/default.nix
+++ b/pkgs/applications/video/aegisub/default.nix
@@ -5,7 +5,7 @@
, libass, fftw, ffms
, ffmpeg, pkgconfig, zlib # Undocumented (?) dependencies
, spellChecking ? true, hunspell ? null
-, automationSupport ? true, lua ? null
+, automationSupport ? true, lua ? null
, openalSupport ? false, openal ? null
, alsaSupport ? true, alsaLib ? null
, pulseaudioSupport ? true, pulseaudio ? null
@@ -39,11 +39,11 @@ stdenv.mkDerivation rec {
;
NIX_LDFLAGS = "-liconv -lavutil -lavformat -lavcodec -lswscale -lz -lm";
-
- preConfigure = "cd aegisub";
-
+
+ preConfigure = "cd aegisub";
+
postInstall = "ln -s $out/bin/aegisub-3.0 $out/bin/aegisub";
-
+
meta = {
description = "An advanced subtitle editor";
longDescription = ''
@@ -53,7 +53,12 @@ stdenv.mkDerivation rec {
built-in real-time video preview.
'';
homepage = http://www.aegisub.org/;
- license = "BSD"; # The Aegisub sources are itself BSD/ISC, but they are linked against GPL'd softwares
+ license = stdenv.lib.licenses.bsd3;
+ # The Aegisub sources are itself BSD/ISC,
+ # but they are linked against GPL'd softwares
+ # - so the resulting program will be GPL
+ maintainers = [ stdenv.lib.maintainers.AndersonTorres ];
platforms = stdenv.lib.platforms.linux;
+
};
}
diff --git a/pkgs/applications/video/avidemux/default.nix b/pkgs/applications/video/avidemux/default.nix
index d706d16241cea8f7cde989277836d1488f904cac..485d8c54eb366791104b2adf423a5a61f95ecdbd 100644
--- a/pkgs/applications/video/avidemux/default.nix
+++ b/pkgs/applications/video/avidemux/default.nix
@@ -1,20 +1,23 @@
{stdenv, fetchurl, cmake, pkgconfig, libxml2, qt4, gtk, gettext, SDL,
libXv, pixman, libpthreadstubs, libXau, libXdmcp, libxslt, x264,
-alsaLib, lame, faac, faad2, libvorbis, yasm, libvpx, xvidcore, libva }:
+alsaLib, lame, faad2, libvorbis, yasm, libvpx, xvidcore, libva,
+faac ? null, faacSupport ? false }:
assert stdenv ? glibc;
+assert faacSupport -> faac != null;
stdenv.mkDerivation {
name = "avidemux-2.5.6";
-
+
src = fetchurl {
url = mirror://sourceforge/avidemux/avidemux_2.5.6.tar.gz;
sha256 = "12wvxz0n2g85f079d8mdkkp2zm279d34m9v7qgcqndh48cn7znnn";
};
-
+
buildInputs = [ cmake pkgconfig libxml2 qt4 gtk gettext SDL libXv
- pixman libpthreadstubs libXau libXdmcp libxslt x264 alsaLib
- lame faac faad2 libvorbis yasm libvpx xvidcore libva ];
+ pixman libpthreadstubs libXau libXdmcp libxslt x264 alsaLib
+ lame faad2 libvorbis yasm libvpx xvidcore libva
+ ] ++ stdenv.lib.optional faacSupport faac;
cmakeFlags = "-DPTHREAD_INCLUDE_DIR=${stdenv.glibc}/include" +
" -DGETTEXT_INCLUDE_DIR=${gettext}/include" +
@@ -34,7 +37,7 @@ stdenv.mkDerivation {
make install
'';
- meta = {
+ meta = {
homepage = http://fixounet.free.fr/avidemux/;
description = "Free video editor designed for simple video editing tasks";
maintainers = with stdenv.lib.maintainers; [viric];
diff --git a/pkgs/applications/video/bangarang/default.nix b/pkgs/applications/video/bangarang/default.nix
index 5dde88076a1e1df8e70227314a13b8c4d9c89e70..1058243c0e08d74f70862f8a3b53542d02a1b2e6 100644
--- a/pkgs/applications/video/bangarang/default.nix
+++ b/pkgs/applications/video/bangarang/default.nix
@@ -10,6 +10,8 @@ stdenv.mkDerivation rec {
buildInputs = [ kdelibs phonon soprano shared_desktop_ontologies kdemultimedia taglib gettext ];
nativeBuildInputs = [ cmake ];
+ patches = [ ./gcc-4.7.patch ];
+
meta = with stdenv.lib; {
description = "A media player for KDE based on Nepomuk and Phonon";
longDescription = ''
diff --git a/pkgs/applications/video/bangarang/gcc-4.7.patch b/pkgs/applications/video/bangarang/gcc-4.7.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d4f650b9caf5ee263dc3d0c6d093429b6ef8437b
--- /dev/null
+++ b/pkgs/applications/video/bangarang/gcc-4.7.patch
@@ -0,0 +1,45 @@
+commit b893fcdb7ddfc8c59fd29a29b7265a713c3dbab1
+Author: Alex Fiestas
+Date: Thu Mar 29 10:09:22 2012 +0200
+
+ Build fix: Add unistd.h include since sleep is defined there
+
+diff --git a/src/platform/infofetchers/lastfminfofetcher.cpp b/src/platform/infofetchers/lastfminfofetcher.cpp
+index 0c49d69..fcc4cd3 100644
+--- a/src/platform/infofetchers/lastfminfofetcher.cpp
++++ b/src/platform/infofetchers/lastfminfofetcher.cpp
+@@ -32,6 +32,8 @@
+ #include
+ #include
+
++#include
++
+ LastfmInfoFetcher::LastfmInfoFetcher(QObject *parent) :
+ InfoFetcher(parent)
+ {
+diff --git a/src/platform/infofetchers/tmdbinfofetcher.cpp b/src/platform/infofetchers/tmdbinfofetcher.cpp
+index 7801644..3c01960 100644
+--- a/src/platform/infofetchers/tmdbinfofetcher.cpp
++++ b/src/platform/infofetchers/tmdbinfofetcher.cpp
+@@ -30,6 +30,8 @@
+ #include
+ #include
+
++#include
++
+ TMDBInfoFetcher::TMDBInfoFetcher(QObject *parent) :
+ InfoFetcher(parent)
+ {
+diff --git a/src/platform/infofetchers/tvdbinfofetcher.cpp b/src/platform/infofetchers/tvdbinfofetcher.cpp
+index ff351b0..670ed18 100644
+--- a/src/platform/infofetchers/tvdbinfofetcher.cpp
++++ b/src/platform/infofetchers/tvdbinfofetcher.cpp
+@@ -30,6 +30,8 @@
+ #include
+ #include
+
++#include
++
+ TVDBInfoFetcher::TVDBInfoFetcher(QObject *parent) :
+ InfoFetcher(parent)
+ {
diff --git a/pkgs/applications/video/dvswitch/default.nix b/pkgs/applications/video/dvswitch/default.nix
deleted file mode 100644
index 8803fe0a78685e343a97fcf41ea5a90d09e8c8cd..0000000000000000000000000000000000000000
--- a/pkgs/applications/video/dvswitch/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ stdenv, fetchurl, alsaLib, boost, cmake, gtkmm, libXau, libXdmcp
-, libXv, libav, pixman, libpthreadstubs, pkgconfig
-}:
-
-stdenv.mkDerivation rec {
- name = "dvswitch-${version}";
- version = "0.8.3.6";
-
- src = fetchurl {
- url = "https://alioth.debian.org/frs/download.php/3615/${name}.tar.gz";
- sha256 = "7bd196389f9913ae08e12a29e168d79324c508bb545eab114df77b0375cd87f0";
- };
-
- buildInputs = [
- alsaLib boost cmake gtkmm libXau libXdmcp libXv libav
- libpthreadstubs pixman pkgconfig
- ];
-
- patchPhase = ''
- sed -e "s@prefix /usr/local@prefix $out@" -i CMakeLists.txt
- '';
-
- meta = with stdenv.lib; {
- description = "interactive live video mixer for DV streams";
- homepage = "http://dvswitch.alioth.debian.org";
- license = licenses.gpl2Plus;
- maintainers = [ maintainers.goibhniu ];
- };
-}
diff --git a/pkgs/applications/video/gnash/default.nix b/pkgs/applications/video/gnash/default.nix
index 4f2addcc99b0c4c218ca13da1151239d643ff1d0..ef40d614a397dd58674af8413871a5abef103a42 100644
--- a/pkgs/applications/video/gnash/default.nix
+++ b/pkgs/applications/video/gnash/default.nix
@@ -10,7 +10,13 @@
assert stdenv ? glibc;
-let version = "0.8.10"; in
+let version = "0.8.10";
+ patch_CVE = fetchurl {
+ url = "http://git.savannah.gnu.org/cgit/gnash.git/patch/?id=bb4dc77eecb6ed1b967e3ecbce3dac6c5e6f1527";
+ sha256 = "1g7ymbq9vxi0mwcgs2dpyd2sf30gaam7blza0ywiwj32f5wk62v1";
+ name = "CVE-2012-1175.patch";
+ };
+in
stdenv.mkDerivation rec {
name = "gnash-${version}";
@@ -21,6 +27,8 @@ stdenv.mkDerivation rec {
};
patchPhase = ''
+ patch -p1 < ${patch_CVE}
+
# Add all libs to `macros/libslist', a list of library search paths.
for lib in ${lib.concatStringsSep " "
(map (lib: "\"${lib}\"/lib")
@@ -73,6 +81,8 @@ stdenv.mkDerivation rec {
echo "\$GST_PLUGIN_PATH set to \`$GST_PLUGIN_PATH'"
'';
+ postConfigure = "echo '#define nullptr NULL' >> gnashconfig.h";
+
# Make sure `gtk-gnash' gets `libXext' in its `RPATH'.
NIX_LDFLAGS="-lX11 -lXext";
@@ -87,9 +97,7 @@ stdenv.mkDerivation rec {
# (e.g., gst-ffmpeg is needed to watch movies such as YouTube's).
for prog in "$out/bin/"*
do
- wrapProgram "$prog" --prefix \
- GST_PLUGIN_PATH ":" \
- "${gst_plugins_base}/lib/gstreamer-0.10:${gst_plugins_good}/lib/gstreamer-0.10:${gst_ffmpeg}/lib/gstreamer-0.10"
+ wrapProgram "$prog" --prefix GST_PLUGIN_SYSTEM_PATH ":" "$GST_PLUGIN_SYSTEM_PATH"
done
'';
diff --git a/pkgs/applications/video/kazam/bug_1190693.patch b/pkgs/applications/video/kazam/bug_1190693.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9f00c6b607915ab9022b3c02af30407bb26b9a5a
--- /dev/null
+++ b/pkgs/applications/video/kazam/bug_1190693.patch
@@ -0,0 +1,14 @@
+=== modified file 'kazam/frontend/indicator.py'
+--- a/kazam/frontend/indicator.py 2013-01-26 01:53:53 +0000
++++ b/kazam/frontend/indicator.py 2013-06-13 18:18:37 +0000
+@@ -291,3 +291,9 @@
+ def start_recording(self):
+ logger.debug("Recording started.")
+ self.indicator.set_from_icon_name("kazam-recording")
++
++ def hide_it(self):
++ self.indicator.set_visible(False)
++
++ def show_it(self):
++ self.indicator.set_visible(True)
+
diff --git a/pkgs/applications/video/kazam/datadir.patch b/pkgs/applications/video/kazam/datadir.patch
new file mode 100644
index 0000000000000000000000000000000000000000..114d4228be2dfb66647365f4bc8152a6465696bf
--- /dev/null
+++ b/pkgs/applications/video/kazam/datadir.patch
@@ -0,0 +1,11 @@
+--- a/bin/kazam 2014-02-03 23:11:38.465614061 +0100
++++ b/bin/kazam-1 2014-02-03 23:12:28.447058700 +0100
+@@ -68,7 +68,7 @@
+ # when base install path is not /usr
+ curpath = os.path.abspath(__file__)
+ curpath = os.path.realpath(curpath)
+- datadir = curpath.split('bin/')[0] + "share/kazam/"
++ datadir = os.path.realpath(os.path.join(curpath, "./../../", "share/kazam/"))
+
+ try:
+ import platform
diff --git a/pkgs/applications/video/kazam/default.nix b/pkgs/applications/video/kazam/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..17bf282a459ade2c5a5c6637cae7b06bf047c819
--- /dev/null
+++ b/pkgs/applications/video/kazam/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, python3Packages, gst_all_1, makeWrapper, gobjectIntrospection
+, gtk3, libwnck3, keybinder, intltool, libcanberra }:
+
+
+python3Packages.buildPythonPackage rec {
+ name = "kazam-${version}";
+ version = "1.4.3";
+ namePrefix = "";
+
+ src = fetchurl {
+ url = "https://launchpad.net/kazam/stable/${version}/+download/kazam-${version}.tar.gz";
+ sha256 = "00bcn0yj9xrv87sf6xd3wpilsjgjpsj15zzpjh351ffpjnr0ica8";
+ };
+
+ # TODO: keybinder, appindicator3
+ buildInputs = with python3Packages;
+ [ pygobject3 pyxdg pycairo gst_all_1.gstreamer gst_all_1.gst-plugins-base
+ gst_all_1.gst-plugins-good gobjectIntrospection gtk3 libwnck3 distutils_extra
+ intltool dbus ];
+
+ # TODO: figure out why PYTHONPATH is not passed automatically for those programs
+ pythonPath = with python3Packages;
+ [ pygobject3 pyxdg pycairo dbus ];
+
+ patches = [ ./datadir.patch ./bug_1190693.patch ];
+ prePatch = ''
+ rm setup.cfg
+ substituteInPlace kazam/backend/grabber.py --replace "/usr/bin/canberra-gtk-play" "${libcanberra}/bin/canberra-gtk-play"
+ '';
+
+ # no tests
+ doCheck = false;
+
+ preFixup = ''
+ wrapProgram $out/bin/kazam \
+ --prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
+ --prefix LD_LIBRARY_PATH ":" "${gtk3}/lib:${gst_all_1.gstreamer}/lib:${keybinder}/lib" \
+ --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH" \
+ --prefix XDG_DATA_DIRS : "${gtk3}/share" \
+ --set GST_REGISTRY "/tmp/kazam.gstreamer.registry";
+ '';
+
+
+ meta = with stdenv.lib; {
+ description = "Cross-platform, Friend-2-Friend and secure decentralised communication platform";
+ homepage = https://code.launchpad.net/kazam;
+ #license = licenses.bsd2;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.iElectric ];
+ };
+}
diff --git a/pkgs/applications/video/miro/default.nix b/pkgs/applications/video/miro/default.nix
index 5ca6c80dc7c1dddac07aeb0b84d740a931e229a7..528eeff7e2391dda345baaa22a7fee4600eb5a37 100644
--- a/pkgs/applications/video/miro/default.nix
+++ b/pkgs/applications/video/miro/default.nix
@@ -1,7 +1,7 @@
{ stdenv, fetchurl, python, buildPythonPackage, pythonPackages, pkgconfig
-, pyrex096, ffmpeg, boost, glib, pygobject, gtk2, webkit_gtk2, libsoup, pygtk
+, pyrex096, ffmpeg, boost, glib, pygobject, gtk2, webkitgtk2, libsoup, pygtk
, taglib, pysqlite, pycurl, mutagen, pycairo, pythonDBus, pywebkitgtk
-, libtorrentRasterbar
+, libtorrentRasterbar, glib_networking, gsettings_desktop_schemas
, gst_python, gst_plugins_base, gst_plugins_good, gst_ffmpeg
}:
@@ -22,9 +22,6 @@ buildPythonPackage rec {
patches = [ ./gconf.patch ];
postPatch = ''
- sed -i -e '2i import os; os.environ["GST_PLUGIN_PATH"] = \\\
- '"'$GST_PLUGIN_PATH'" miro.real
-
sed -i -e 's/\$(shell which python)/python/' Makefile
sed -i -e 's|/usr/bin/||' -e 's|/usr||' \
-e 's/BUILD_TIME[^,]*/BUILD_TIME=0/' setup.py
@@ -40,10 +37,6 @@ buildPythonPackage rec {
plat/resources.py
'';
- installCommand = ''
- python setup.py install --prefix= --root="$out"
- '';
-
# Disabled for now, because it requires networking and even if we skip those
# tests, the whole test run takes around 10-20 minutes.
doCheck = false;
@@ -51,12 +44,22 @@ buildPythonPackage rec {
HOME="$TEMPDIR" LANG=en_US.UTF-8 python miro.real --unittest
'';
+ preInstall = ''
+ # see https://bitbucket.org/pypa/setuptools/issue/130/install_data-doesnt-respect-prefix
+ ${python}/bin/${python.executable} setup.py install_data --root=$out
+ sed -i '/data_files=data_files/d' setup.py
+ '';
+
postInstall = ''
mv "$out/bin/miro.real" "$out/bin/miro"
+ wrapProgram "$out/bin/miro" \
+ --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH" \
+ --prefix GIO_EXTRA_MODULES : "${glib_networking}/lib/gio/modules" \
+ --prefix XDG_DATA_DIRS : "${gsettings_desktop_schemas}/share:$out/share"
'';
buildInputs = [
- pkgconfig pyrex096 ffmpeg boost glib pygobject gtk2 webkit_gtk2 libsoup
+ pkgconfig pyrex096 ffmpeg boost glib pygobject gtk2 webkitgtk2 libsoup
pygtk taglib
];
diff --git a/pkgs/applications/video/mpv/default.nix b/pkgs/applications/video/mpv/default.nix
index a20dc0cf590e3613bfa9f80750a9d468f94ef04d..903b9afdc4a75d447c817c4e06a540042727c15c 100644
--- a/pkgs/applications/video/mpv/default.nix
+++ b/pkgs/applications/video/mpv/default.nix
@@ -1,5 +1,6 @@
{ stdenv, fetchurl, fetchgit, freetype, pkgconfig, freefont_ttf, ffmpeg, libass
-, lua5, perl, libpthreadstubs
+, lua, perl, libpthreadstubs
+, lua5_sockets
, python3, docutils, which
, x11Support ? true, libX11 ? null, libXext ? null, mesa ? null, libXxf86vm ? null
, xineramaSupport ? true, libXinerama ? null
@@ -46,26 +47,25 @@ assert cacaSupport -> libcaca != null;
# but by purity reasons it should be avoided; thanks the-kenny to point it out!
# Now, it will just download and package Waf, mimetizing bootstrap.py behaviour
-let
+let
waf = fetchurl {
- url = https://waf.googlecode.com/files/waf-1.7.13;
- sha256 = "03cc750049350ee01cdbc584b70924e333fcc17ba4a2d04648dab1535538a873";
+ url = https://waf.googlecode.com/files/waf-1.7.15;
+ sha256 = "e5ae7028f9b2d8ce1acb9fe1092e8010a90ba764d3ac065ea4e846743290b1d6";
};
- version = "0.3.2";
-
in
stdenv.mkDerivation rec {
name = "mpv-${version}";
+ version = "0.3.7";
src = fetchurl {
url = "https://github.com/mpv-player/mpv/archive/v${version}.tar.gz";
- sha256 = "1vzdhzry2adyp2yh2dmy1qznqhnzar7g24rhi0vv624jgd20qax2";
+ sha256 = "1qmwmjvgdwh88l2caw2xy1d2h1cdg2w1hl4q5iwx2c0q7a99h41m";
};
buildInputs = with stdenv.lib;
- [ waf freetype pkgconfig ffmpeg libass docutils which libpthreadstubs ]
+ [ waf freetype pkgconfig ffmpeg libass docutils which libpthreadstubs lua5_sockets ]
++ optionals x11Support [ libX11 libXext mesa libXxf86vm ]
++ optional alsaSupport alsaLib
++ optional xvSupport libXv
@@ -86,7 +86,7 @@ stdenv.mkDerivation rec {
++ optional cacaSupport libcaca
;
- nativeBuildInputs = [ python3 lua5 perl ];
+ nativeBuildInputs = [ python3 lua perl ];
# There are almost no need of "configure flags", but some libraries
@@ -109,7 +109,7 @@ stdenv.mkDerivation rec {
python3 ${waf} install
# Maybe not needed, but it doesn't hurt anyway: a standard font
mkdir -p $out/share/mpv
- ln -s ${freefont_ttf}/share/fonts/truetype/FreeSans.ttf $out/share/mpv/subfont.ttf
+ ln -s ${freefont_ttf}/share/fonts/truetype/FreeSans.ttf $out/share/mpv/subfont.ttf
'';
meta = {
@@ -118,7 +118,8 @@ stdenv.mkDerivation rec {
mpv is a free and open-source general-purpose video player, based on the MPlayer and mplayer2 projects, with great improvements above both.
'';
homepage = "http://mpv.io";
- license = "GPLv2+";
+ license = stdenv.lib.licenses.gpl2Plus;
+ maintainers = [ stdenv.lib.maintainers.AndersonTorres ];
platforms = stdenv.lib.platforms.linux;
};
}
@@ -126,6 +127,6 @@ stdenv.mkDerivation rec {
# Heavily based on mplayer2 expression
# TODO: Wayland support
-# TODO: investigate libquvi support: it isn't detected by Waf script!
-# TODO: investigate caca support: it isn't detected by Waf script!
-# TODO: a more systematic way to test this package
+# TODO: investigate libquvi support
+# TODO: investigate caca support
+# TODO: investigate lua5_sockets bug
diff --git a/pkgs/applications/video/pitivi/default.nix b/pkgs/applications/video/pitivi/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7f53aa07db6031459fb9698759122ff12d868292
--- /dev/null
+++ b/pkgs/applications/video/pitivi/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, makeWrapper
+, pythonPackages, gst, clutter-gst, clutter-gtk
+, gobjectIntrospection, clutter, gtk3, librsvg
+, gnome_icon_theme, gnome_icon_theme_symbolic, gnome3
+}:
+
+let
+ version = "0.93";
+in stdenv.mkDerivation rec {
+ name = "pitivi-${version}";
+
+ src = fetchurl {
+ url = "mirror://gnome/sources/pitivi/${version}/${name}.tar.xz";
+ sha256 = "0z89dwrd7akhkap270i372yszqib8yqcymv78lhdmn3a8bsa7jhp";
+ };
+
+ meta = with stdenv.lib; {
+ description = "Non-Linear video editor utilizing the power of GStreamer";
+ homepage = "http://pitivi.org/";
+ longDescription = ''
+ Pitivi is a video editor built upon the GStreamer Editing Services.
+ It aims to be an intuitive and flexible application
+ that can appeal to newbies and professionals alike.
+ '';
+ license = licenses.lgpl21Plus;
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ iyzsong ];
+ };
+
+ nativeBuildInputs = [ pkgconfig intltool itstool makeWrapper ];
+
+ buildInputs = [
+ gobjectIntrospection clutter-gst clutter-gtk librsvg
+ ] ++ (with gst; [
+ gst-python gst-editing-services
+ gst-plugins-base gst-plugins-good
+ gst-plugins-bad gst-plugins-ugly gst-libav
+ ]) ++ (with pythonPackages; [
+ python pygobject3 pyxdg numpy pycairo sqlite3
+ ]);
+
+ preFixup = with stdenv.lib; with gst; let
+ libraryPath = makeLibraryPath [
+ gstreamer gst-editing-services
+ clutter-gst clutter-gtk clutter gtk3
+ gnome3.gnome_desktop
+ ];
+ in ''
+ wrapProgram "$out/bin/pitivi" \
+ --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
+ --prefix LD_LIBRARY_PATH : "${libraryPath}" \
+ --prefix GST_PLUGIN_SYSTEM_PATH_1_0 : "$GST_PLUGIN_SYSTEM_PATH_1_0" \
+ --prefix XDG_DATA_DIRS : "\$XDG_ICON_DIRS:$out/share:$GSETTINGS_SCHEMAS_PATH"
+ rm $out/share/icons/hicolor/icon-theme.cache
+ '';
+}
diff --git a/pkgs/applications/video/quvi/library.nix b/pkgs/applications/video/quvi/library.nix
index 49207ad066158eddf69ade692b465140d72dfc75..0fdd78fe106847e7231399921f86770e12afff86 100644
--- a/pkgs/applications/video/quvi/library.nix
+++ b/pkgs/applications/video/quvi/library.nix
@@ -1,15 +1,15 @@
-{stdenv, fetchurl, pkgconfig, lua5, curl, quvi_scripts}:
+{stdenv, fetchurl, pkgconfig, lua5, curl, quvi_scripts, libproxy, libgcrypt}:
stdenv.mkDerivation rec {
name = "libquvi-${version}";
- version="0.4.0";
+ version="0.9.4";
src = fetchurl {
- url = "mirror://sourceforge/quvi/libquvi-${version}.tar.gz";
- sha256 = "15cm9j8dssn2zhplqvlw49piwfw511lia6b635byiwfniqf6dnwp";
+ url = "mirror://sourceforge/quvi/libquvi-${version}.tar.xz";
+ sha256 = "1cl1kbgxl1jnx2nwx4z90l0lap09lnnj1fg7hxsxk3m6aj4y4grd";
};
- buildInputs = [ pkgconfig lua5 curl quvi_scripts ];
+ buildInputs = [ pkgconfig lua5 curl quvi_scripts libproxy libgcrypt ];
meta = {
description = "Web video downloader";
diff --git a/pkgs/applications/video/quvi/scripts.nix b/pkgs/applications/video/quvi/scripts.nix
index cc82158ae829d593144ff1cf1a011af8d6ed02c8..68b61fc453deb67dc18f8cb860c9bbdf99fa5204 100644
--- a/pkgs/applications/video/quvi/scripts.nix
+++ b/pkgs/applications/video/quvi/scripts.nix
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
name = "quvi-scripts-${version}";
- version="0.4.0";
+ version="0.9.20131130";
src = fetchurl {
- url = "mirror://sourceforge/quvi/libquvi-scripts-${version}.tar.gz";
- sha256 = "14p1sn7id4n35isaw3i3h8vsgfqlym09fih9k5xfqwsg6n7xdvq5";
+ url = "mirror://sourceforge/quvi/libquvi-scripts-${version}.tar.xz";
+ sha256 = "1qvp6z5k1qgcys7vf7jd6fm0g07xixmciwj14ypn1kqhmjgizwhp";
};
buildInputs = [ pkgconfig ];
diff --git a/pkgs/applications/video/quvi/tool.nix b/pkgs/applications/video/quvi/tool.nix
index f8b6aad43106fe5bf10414969d2339181a100744..807e3954d6feae0cf05cd908b1a8017c5a27779b 100644
--- a/pkgs/applications/video/quvi/tool.nix
+++ b/pkgs/applications/video/quvi/tool.nix
@@ -1,22 +1,25 @@
-{stdenv, fetchurl, pkgconfig, lua5, curl, quvi_scripts, libquvi}:
+{stdenv, fetchurl, pkgconfig, lua5, curl, quvi_scripts, libquvi, lua5_sockets, glib, makeWrapper}:
stdenv.mkDerivation rec {
name = "quvi-${version}";
- version="0.4.0";
+ version="0.9.5";
src = fetchurl {
- url = "mirror://sourceforge/quvi/quvi-${version}.tar.gz";
- sha256 = "0qzyj55py4z7pg97794jjycq8nvrlr02072rgjzg8jgknw49hgfv";
+ url = "mirror://sourceforge/quvi/quvi-${version}.tar.xz";
+ sha256 = "1h52s265rp3af16dvq1xlscp2926jqap2l4ah94vrfchv6m1hffb";
};
- buildInputs = [ pkgconfig lua5 curl quvi_scripts libquvi ];
+ buildInputs = [ pkgconfig lua5 curl quvi_scripts libquvi glib makeWrapper ];
+ postInstall = ''
+ wrapProgram $out/bin/quvi --set LUA_PATH "${lua5_sockets}/share/lua/${lua5.luaversion}/?.lua"
+ '';
- meta = {
+ meta = {
description = "Web video downloader";
homepage = http://quvi.sf.net;
license = "LGPLv2.1+";
platforms = stdenv.lib.platforms.linux;
- maintainers = [ stdenv.lib.maintainers.mornfall ];
+ maintainers = [ stdenv.lib.maintainers.mornfall ];
};
}
diff --git a/pkgs/applications/video/simplescreenrecorder/default.nix b/pkgs/applications/video/simplescreenrecorder/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3251127c7a1917daa22b9c9dbd72f98feb4129ae
--- /dev/null
+++ b/pkgs/applications/video/simplescreenrecorder/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, alsaLib, ffmpeg, jackaudio, libX11, libXext
+, libXfixes, mesa, pkgconfig, pulseaudio, qt4
+}:
+
+stdenv.mkDerivation rec {
+ name = "simplescreenrecorder-${version}";
+ version = "0.2.2";
+
+ src = fetchurl {
+ url = "https://github.com/MaartenBaert/ssr/archive/${version}.tar.gz";
+ sha256 = "0k1r1ilpk05qmwpnld95zxxk57qvyaq2r9f4i3la7y0xh9bz1gls";
+ };
+
+ buildInputs = [
+ alsaLib ffmpeg jackaudio libX11 libXext libXfixes mesa pkgconfig
+ pulseaudio qt4
+ ];
+
+ meta = with stdenv.lib; {
+ description = "A screen recorder for Linux";
+ homepage = http://www.maartenbaert.be/simplescreenrecorder;
+ license = licenses.gpl3;
+ platforms = platforms.linux;
+ maintainers = [ maintainers.goibhniu ];
+ };
+}
diff --git a/pkgs/applications/video/vlc/default.nix b/pkgs/applications/video/vlc/default.nix
index d75cca14b3a031189360fd5c708734f074acff9c..2c5b53c596a6bdf6bd66b2c82f7bcd2199a98059 100644
--- a/pkgs/applications/video/vlc/default.nix
+++ b/pkgs/applications/video/vlc/default.nix
@@ -6,15 +6,16 @@
, mpeg2dec, udev, gnutls, avahi, libcddb, jackaudio, SDL, SDL_image
, libmtp, unzip, taglib, libkate, libtiger, libv4l, samba, liboggz
, libass, libva, libdvbpsi, libdc1394, libraw1394, libopus
+, libvdpau
}:
stdenv.mkDerivation rec {
name = "vlc-${version}";
- version = "2.1.2";
+ version = "2.1.4";
src = fetchurl {
url = "http://download.videolan.org/pub/videolan/vlc/${version}/${name}.tar.xz";
- sha256 = "1i4fzjv2x8mzx0bg52mgh1rrlircmb81jr58z90blbmww4mq36r1";
+ sha256 = "1lymhbb2bns73qivdaqanhggjjhyc9fwfgf5ikhng0a74msnqmiy";
};
buildInputs =
@@ -24,7 +25,7 @@ stdenv.mkDerivation rec {
udev gnutls avahi libcddb jackaudio SDL SDL_image libmtp unzip taglib
libkate libtiger libv4l samba liboggz libass libdvbpsi libva
xlibs.xlibs xlibs.libXv xlibs.libXvMC xlibs.libXpm xlibs.xcbutilkeysyms
- libdc1394 libraw1394 libopus libebml libmatroska
+ libdc1394 libraw1394 libopus libebml libmatroska libvdpau
];
nativeBuildInputs = [ pkgconfig ];
@@ -33,6 +34,8 @@ stdenv.mkDerivation rec {
[ "--enable-alsa"
"--with-kde-solid=$out/share/apps/solid/actions"
"--enable-dc1394"
+ "--enable-ncurses"
+ "--enable-vdpau"
];
preConfigure = ''sed -e "s@/bin/echo@echo@g" -i configure'';
@@ -49,5 +52,6 @@ stdenv.mkDerivation rec {
description = "Cross-platform media player and streaming server";
homepage = http://www.videolan.org/vlc/;
platforms = platforms.linux;
+ license = licenses.lgpl21Plus;
};
}
diff --git a/pkgs/applications/virtualization/8086tiny/builder.sh b/pkgs/applications/virtualization/8086tiny/builder.sh
new file mode 100644
index 0000000000000000000000000000000000000000..36c381bececc30a14182563249fe2e2c2d5c6a08
--- /dev/null
+++ b/pkgs/applications/virtualization/8086tiny/builder.sh
@@ -0,0 +1,19 @@
+
+source $stdenv/setup
+
+mkdir -p ./$name $out/bin $out/share/$name $out/share/doc/$name/images
+
+cd $name
+tar xf $src
+make 8086tiny
+
+install 8086tiny $out/bin
+install bios $out/share/$name/8086tiny-bios
+install fd.img $out/share/$name/8086tiny-floppy.img
+install bios_source/bios.asm $out/share/$name/8086tiny-bios-src.asmn
+install docs/8086tiny.css $out/share/doc/$name
+install docs/doc.html $out/share/doc/$name
+for i in docs/images/*.gif
+do
+ install $i $out/share/doc/$name/images
+done
diff --git a/pkgs/applications/virtualization/8086tiny/default.nix b/pkgs/applications/virtualization/8086tiny/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8e5108b44109331578786a6325df4dd6165f03ab
--- /dev/null
+++ b/pkgs/applications/virtualization/8086tiny/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl
+, localBios ? false, nasm ? null
+, sdlSupport ? true, SDL ? null
+}:
+
+
+assert sdlSupport -> (SDL != null);
+
+
+stdenv.mkDerivation rec {
+
+ name = "8086tiny-${version}";
+ version = "1.20";
+
+ src = fetchurl {
+ url ="http://www.megalith.co.uk/8086tiny/downloads/8086tiny_120.tar.bz2";
+ sha256 = "0yapnr8wvlx7h1q1w98yfy2vsbf0rlp4wd99r3xb0b7l70b36mpw";
+ };
+
+ buildInputs = with stdenv.lib;
+ optionals localBios [ nasm ]
+ ++ optionals sdlSupport [ SDL ];
+
+ builder = ./builder.sh;
+
+ meta = {
+ description = "An open-source 8086 emulator";
+ longDescription = ''
+ 8086tiny is a tiny, open source (MIT), portable (little-endian hosts) Intel PC emulator, powerful enough to run DOS, Windows 3.0, Excel, MS Flight Simulator, AutoCAD, Lotus 1-2-3, and similar applications. 8086tiny emulates a "late 80's era" PC XT-type machine.
+
+ 8086tiny is based on an IOCCC 2013 winning entry. In fact that is the "unobfuscated" version :)
+ '';
+ homepage = http://www.megalith.co.uk/8086tiny/index.html;
+ license = stdenv.lib.licenses.mit;
+ maintainers = [ stdenv.lib.maintainers.AndersonTorres ];
+ platforms = stdenv.lib.platforms.linux;
+ };
+}
+
+# TODO: add support for a locally made BIOS
diff --git a/pkgs/applications/virtualization/OVMF/default.nix b/pkgs/applications/virtualization/OVMF/default.nix
index e6d0b7cb40dd46b09465c59c9c4db11b182233dc..54d697d4275108c7e28037436b93a2284d6f2fe0 100644
--- a/pkgs/applications/virtualization/OVMF/default.nix
+++ b/pkgs/applications/virtualization/OVMF/default.nix
@@ -12,7 +12,7 @@ let
in
stdenv.mkDerivation (edk2.setup "OvmfPkg/OvmfPkg${targetArch}.dsc" {
- name = "OVMF-2012-10-09";
+ name = "OVMF-2014-02-01";
unpackPhase = ''
for file in \
diff --git a/pkgs/applications/virtualization/bochs/default.nix b/pkgs/applications/virtualization/bochs/default.nix
index 6b8cf5dc0356fdbd19297c0c160e9fcccf55f61a..75afcb41f808445fa8f845902ecc2b2b8bc46ed6 100644
--- a/pkgs/applications/virtualization/bochs/default.nix
+++ b/pkgs/applications/virtualization/bochs/default.nix
@@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
url = "http://downloads.sourceforge.net/project/bochs/bochs/${version}/${name}.tar.gz";
sha256 = "042blm1xb9ig4fh2bv8nrrfpgkcxy4hq8yrkx7mrdpm5g4mvfwyr";
};
-
+
buildInputs = with stdenv.lib;
[ libX11 mesa ]
++ optionals sdlSupport [ SDL ]
@@ -33,7 +33,7 @@ stdenv.mkDerivation rec {
++ optionals curlSupport [ curl ];
configureFlags = ''
- --with-x11
+ --with-x11
--with-term=${if termSupport then "yes" else "no"}
--with-sdl=${if sdlSupport then "yes" else "no"}
--with-svga=no
@@ -42,11 +42,11 @@ stdenv.mkDerivation rec {
--enable-plugins=no
--enable-disasm
--enable-debugger
- --enable-ne2000
- --enable-e1000
- --enable-sb16
- --enable-voodoo
- --enable-usb
+ --enable-ne2000
+ --enable-e1000
+ --enable-sb16
+ --enable-voodoo
+ --enable-usb
--enable-pnic
'';
@@ -56,7 +56,8 @@ stdenv.mkDerivation rec {
Bochs is an open-source (LGPL), highly portable IA-32 PC emulator, written in C++, that runs on most popular platforms. It includes emulation of the Intel x86 CPU, common I/O devices, and a custom BIOS.
'';
homepage = http://bochs.sourceforge.net/;
- license = "LGPL";
+ license = stdenv.lib.licenses.lgpl2Plus;
+ maintainers = [ stdenv.lib.maintainers.AndersonTorres ];
platforms = stdenv.lib.platforms.linux;
};
}
diff --git a/pkgs/applications/virtualization/docker/default.nix b/pkgs/applications/virtualization/docker/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..40385d9d36af6e5f7d0e30ecc924e79efc0398d4
--- /dev/null
+++ b/pkgs/applications/virtualization/docker/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl, makeWrapper, go, lxc, sqlite, iproute, bridge_utils, devicemapper,
+btrfsProgs, iptables, bash}:
+
+stdenv.mkDerivation rec {
+ name = "docker-${version}";
+ version = "0.9.1";
+
+ src = fetchurl {
+ url = "https://github.com/dotcloud/docker/archive/v${version}.tar.gz";
+ sha256 = "0m4s21dxd1bj08xrmi7iw77djj3cpxvjsin12p6v6v1qnigm18ww";
+ };
+
+ phases = ["unpackPhase" "preBuild" "buildPhase" "installPhase"];
+
+ buildInputs = [ makeWrapper go sqlite lxc iproute bridge_utils devicemapper btrfsProgs iptables ];
+
+ preBuild = ''
+ patchShebangs ./hack
+ '';
+
+ buildPhase = ''
+ export AUTO_GOPATH=1
+ export DOCKER_GITCOMMIT="867b2a90c228f62cdcd44907ceef279a2d8f1ac5"
+ ./hack/make.sh dynbinary
+ '';
+
+ installPhase = ''
+ install -Dm755 ./bundles/${version}/dynbinary/docker-${version} $out/bin/docker
+ install -Dm755 ./bundles/${version}/dynbinary/dockerinit-${version} $out/bin/dockerinit
+ wrapProgram $out/bin/docker --prefix PATH : "${iproute}/sbin:sbin:${lxc}/bin:${iptables}/sbin"
+
+ # systemd
+ install -Dm644 ./contrib/init/systemd/docker.service $out/etc/systemd/system/docker.service
+
+ # completion
+ install -Dm644 ./contrib/completion/bash/docker $out/share/bash-completion/completions/docker
+ install -Dm644 ./contrib/completion/zsh/_docker $out/share/zsh/site-functions/_docker
+ '';
+
+ meta = with stdenv.lib; {
+ homepage = http://www.docker.io/;
+ description = "An open source project to pack, ship and run any application as a lightweight container";
+ license = licenses.asl20;
+ maintainers = with maintainers; [ offline ];
+ platforms = platforms.linux;
+ };
+}
diff --git a/pkgs/applications/virtualization/qemu/default.nix b/pkgs/applications/virtualization/qemu/default.nix
index dcf5b4e50097d7e60f75d93f217ce042307c2fcb..b6e28d444111feb1f6665dc1856a729966afb69a 100644
--- a/pkgs/applications/virtualization/qemu/default.nix
+++ b/pkgs/applications/virtualization/qemu/default.nix
@@ -1,29 +1,29 @@
{ stdenv, fetchurl, python, zlib, pkgconfig, glib, ncurses, perl, pixman
-, attr, libcap, vde2, alsaLib, texinfo, libuuid
+, attr, libcap, vde2, alsaLib, texinfo, libuuid, flex, bison
, makeWrapper
, sdlSupport ? true, SDL
, vncSupport ? true, libjpeg, libpng
-, spiceSupport ? true, spice, spice_protocol
+, spiceSupport ? true, spice, spice_protocol, usbredir
, x86Only ? false
}:
-let n = "qemu-1.5.2"; in
+let n = "qemu-1.7.1"; in
stdenv.mkDerivation rec {
name = n + (if x86Only then "-x86-only" else "");
src = fetchurl {
url = "http://wiki.qemu.org/download/${n}.tar.bz2";
- sha256 = "0l52jwlxmwp9g3jpq0g7ix9dq4qgh46nd2h58lh47f0a35yi8qgn";
+ sha256 = "1x5y06zhp0gc97g1sb98vf7dkawg63xywv0mbnpfnbi20jh452fn";
};
buildInputs =
[ python zlib pkgconfig glib ncurses perl pixman attr libcap
- vde2 alsaLib texinfo libuuid makeWrapper
+ vde2 alsaLib texinfo libuuid flex bison makeWrapper
]
++ stdenv.lib.optionals sdlSupport [ SDL ]
++ stdenv.lib.optionals vncSupport [ libjpeg libpng ]
- ++ stdenv.lib.optionals spiceSupport [ spice_protocol spice ];
+ ++ stdenv.lib.optionals spiceSupport [ spice_protocol spice usbredir ];
enableParallelBuilding = true;
@@ -43,11 +43,11 @@ stdenv.mkDerivation rec {
fi
'';
- meta = {
+ meta = with stdenv.lib; {
homepage = http://www.qemu.org/;
description = "A generic and open source machine emulator and virtualizer";
- license = "GPLv2+";
- maintainers = with stdenv.lib.maintainers; [ viric shlevy eelco ];
- platforms = stdenv.lib.platforms.linux;
+ license = licenses.gpl2Plus;
+ maintainers = with maintainers; [ viric shlevy eelco ];
+ platforms = platforms.linux;
};
}
diff --git a/pkgs/applications/virtualization/virt-manager/default.nix b/pkgs/applications/virtualization/virt-manager/default.nix
index fb2dde66442f08f429e2a9751d186124e202e668..dba0d11b425ae9137bd64fe94666be36f7f796ed 100644
--- a/pkgs/applications/virtualization/virt-manager/default.nix
+++ b/pkgs/applications/virtualization/virt-manager/default.nix
@@ -1,74 +1,67 @@
{ stdenv, fetchurl, pythonPackages, intltool, libxml2Python, curl, python
, makeWrapper, virtinst, pyGtkGlade, pythonDBus, gnome_python, gtkvnc, vte
-, spiceSupport ? true, spice_gtk
+, gtk3, gobjectIntrospection, libvirt-glib, gsettings_desktop_schemas, glib
+, avahi, dconf, spiceSupport ? true, spice_gtk
}:
with stdenv.lib;
+with pythonPackages;
-let version = "0.9.5"; in
-
-stdenv.mkDerivation rec {
+buildPythonPackage rec {
name = "virt-manager-${version}";
+ version = "1.0.1";
+ namePrefix = "";
src = fetchurl {
- url = "http://virt-manager.et.redhat.com/download/sources/virt-manager/virt-manager-${version}.tar.gz";
- sha256 = "0gc06cdbq6c2a06l939516lvjii7lr0wng90kqgl1i5q5wlgnajx";
+ url = "http://virt-manager.org/download/sources/virt-manager/${name}.tar.gz";
+ sha256 = "1n248kack1fni8y17ysgq5xhvffcgy4l62hnd0zvr4kjw0579qq8";
};
- pythonPath = with pythonPackages;
- [ setuptools eventlet greenlet gflags netaddr sqlalchemy carrot routes
+ propagatedBuildInputs =
+ [ eventlet greenlet gflags netaddr sqlalchemy carrot routes
paste_deploy m2crypto ipy boto_1_9 twisted sqlalchemy_migrate
distutils_extra simplejson readline glance cheetah lockfile httplib2
- # !!! should libvirt be a build-time dependency? Note that
- # libxml2Python is a dependency of libvirt.py.
- libvirt libxml2Python urlgrabber virtinst pyGtkGlade pythonDBus gnome_python
- gtkvnc vte
+ urlgrabber virtinst pyGtkGlade pythonDBus gnome_python pygobject3
+ libvirt libxml2Python ipaddr vte
] ++ optional spiceSupport spice_gtk;
buildInputs =
- [ pythonPackages.python
- pythonPackages.wrapPython
- pythonPackages.mox
- pythonPackages.urlgrabber
+ [ mox
intltool
- pyGtkGlade
- pythonDBus
- gnome_python
gtkvnc
- ] ++ pythonPath;
-
- buildPhase = "make";
-
- nativeBuildInputs = [ makeWrapper pythonPackages.wrapPython ];
+ gtk3
+ libvirt-glib
+ avahi
+ glib
+ gobjectIntrospection
+ ];
- # TODO
- # virt-manager -> import gtk.glade -> No module named glade --> fixed by removing 'pygtk' and by only using pyGtkGlade
- # -> import gconf -> ImportError: No module named gconf
- # -> pfad um gtk-2.0 erweitern in virt-manger runner -> /nix/store/hnyxc9i4yz2mc42n44ms13mn8n486s5h-gnome-python-2.28.1/lib/python2.7/site-packages/gtk-2.0
- # -> Error starting Virtual Machine Manager: Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information. (Details - 1: GetIOR failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.GConf was not provided by any .service files)
-
-#Traceback (most recent call last):
-# File "/nix/store/y9rcdiv6686sqcv4r39p575s37jzc2cz-virt-manager-0.9.1/share/virt-manager/virt-manager.py", line 383, in
-# main()
-# File "/nix/store/y9rcdiv6686sqcv4r39p575s37jzc2cz-virt-manager-0.9.1/share/virt-manager/virt-manager.py", line 315, in main
-# config = virtManager.config.vmmConfig(appname, appversion, glade_dir)
-# File "/nix/store/y9rcdiv6686sqcv4r39p575s37jzc2cz-virt-manager-0.9.1/share/virt-manager/virtManager/config.py", line 98, in __init__
-# self.conf.add_dir(self.conf_dir, gconf.CLIENT_PRELOAD_NONE)
-#GError: Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information. (Details - 1: GetIOR failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.GConf was not provided by any .service files)
-# -> fixed by http://nixos.org/wiki/Solve_GConf_errors_when_running_GNOME_applications & a restart
- # virt-manager-tui -> ImportError: No module named newt_syrup.dialogscreen
+ configurePhase = ''
+ sed -i 's/from distutils.core/from setuptools/g' setup.py
+ sed -i 's/from distutils.command.install/from setuptools.command.install/g' setup.py
+ python setup.py configure --prefix=$out
+ '';
- installPhase = ''
- make install
+ buildPhase = "true";
- # A hack, but the most reliable method so far
- echo "#!/usr/bin/env python" | cat - src/virt-manager.py > $out/bin/virt-manager
- echo "#!/usr/bin/env python" | cat - src/virt-manager-tui.py > $out/bin/virt-manager-tui
+ postInstall = ''
+ # GI_TYPELIB_PATH is needed at runtime for GObject stuff to work
+ for file in "$out"/bin/*; do
+ wrapProgram "$file" \
+ --prefix GI_TYPELIB_PATH : $GI_TYPELIB_PATH \
+ --prefix GIO_EXTRA_MODULES : "${dconf}/lib/gio/modules" \
+ --prefix GSETTINGS_SCHEMA_DIR : $out/share/glib-2.0/schemas \
+ --prefix LD_LIBRARY_PATH : ${gtk3}/lib/:${libvirt-glib}/lib/:${vte}/lib:${gtkvnc}/lib${optionalString spiceSupport ":${spice_gtk}/lib"} \
+ --prefix XDG_DATA_DIRS : "$out/share:${gsettings_desktop_schemas}/share:${gtk3}/share:\$XDG_DATA_DIRS"
+ done
- wrapPythonPrograms
+ ${glib}/bin/glib-compile-schemas "$out"/share/glib-2.0/schemas
'';
- meta = {
+ # Failed tests
+ doCheck = false;
+
+ meta = with stdenv.lib; {
homepage = http://virt-manager.org;
description = "Desktop user interface for managing virtual machines";
longDescription = ''
@@ -76,7 +69,7 @@ stdenv.mkDerivation rec {
virtual machines through libvirt. It primarily targets KVM VMs, but also
manages Xen and LXC (linux containers).
'';
- license = "GPLv2";
- maintainers = with stdenv.lib.maintainers; [qknight];
+ license = licenses.gpl2;
+ maintainers = with maintainers; [qknight offline];
};
}
diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 2ce134090fe5dea8cad352afba62d37b04a193bc..266ab11a39fbec62bfdeb9fe8c0c810e1d7ad62e 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -1,6 +1,6 @@
{ stdenv, fetchurl, lib, iasl, dev86, pam, libxslt, libxml2, libX11, xproto, libXext
, libXcursor, libXmu, qt4, libIDL, SDL, libcap, zlib, libpng, glib, kernel, lvm2
-, which, alsaLib, curl, gawk
+, which, alsaLib, curl, libvpx, gawk
, xorriso, makeself, perl, pkgconfig
, javaBindings ? false, jdk ? null
, pythonBindings ? false, python ? null
@@ -11,7 +11,7 @@ with stdenv.lib;
let
- version = "4.2.18"; # changes ./guest-additions as well
+ version = "4.3.10"; # changes ./guest-additions as well
forEachModule = action: ''
for mod in \
@@ -31,13 +31,13 @@ let
'';
# See https://github.com/NixOS/nixpkgs/issues/672 for details
- extpackRevision = "88780";
+ extpackRevision = "93012";
extensionPack = requireFile rec {
name = "Oracle_VM_VirtualBox_Extension_Pack-${version}-${extpackRevision}.vbox-extpack";
# IMPORTANT: Hash must be base16 encoded because it's used as an input to
# VBoxExtPackHelperApp!
- # Tip: see http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/SHA256SUMS
- sha256 = "1d1737b59d0f30f5d42beeabaff168bdc0a75b8b28df685979be6173e5adbbba";
+ # Tip: see http://dlc.sun.com.edgesuite.net/virtualbox/4.3.10/SHA256SUMS
+ sha256 = "ec3f2a98373d5e228acb4756ac07f44212c4d53f6b83deee81b791abb0d2608a";
message = ''
In order to use the extension pack, you need to comply with the VirtualBox Personal Use
and Evaluation License (PUEL) by downloading the related binaries from:
@@ -56,12 +56,12 @@ in stdenv.mkDerivation {
src = fetchurl {
url = "http://download.virtualbox.org/virtualbox/${version}/VirtualBox-${version}.tar.bz2";
- sha256 = "9dbddf393b029c549249f627d12040c1d257972bc09292969b8819a31ab78d74";
+ sha256 = "739835aee3274a663b23eeb748bd0430e8a5d8ba2f4d0eae5dc47ff2c485e23b";
};
buildInputs =
[ iasl dev86 libxslt libxml2 xproto libX11 libXext libXcursor qt4 libIDL SDL
- libcap glib lvm2 python alsaLib curl pam xorriso makeself perl
+ libcap glib lvm2 python alsaLib curl libvpx pam xorriso makeself perl
pkgconfig which libXmu ]
++ optional javaBindings jdk
++ optional pythonBindings python;
diff --git a/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix b/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
index 805e0b867d97418aa4221d3b7b614979b7fc9743..5fc75590417057ed0c57800388ff55da90007058 100644
--- a/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
@@ -12,7 +12,7 @@ stdenv.mkDerivation {
src = fetchurl {
url = "http://download.virtualbox.org/virtualbox/${version}/VBoxGuestAdditions_${version}.iso";
- sha256 = "f11a7f13dfe7bf9f246fb877144bb467fe6deadcd876568ec79b6ccd3b59d767";
+ sha256 = "247e15e9a205dcd4761f6cb547ceca2a61e8d6905c1930870939fd323f4cd1ae";
};
KERN_DIR = "${kernel.dev}/lib/modules/*/build";
diff --git a/pkgs/applications/window-managers/dwm/confnotify-6.0.patch b/pkgs/applications/window-managers/dwm/confnotify-6.0.patch
deleted file mode 100644
index 5b5e2ebb68a72d86d0839e302939ac39322f8887..0000000000000000000000000000000000000000
--- a/pkgs/applications/window-managers/dwm/confnotify-6.0.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-Fix SDL fullscreen problems when the resolution changes:
-https://groups.google.com/d/msg/wmii/nJBrSjrnnq8/ZEYWOWE5pj4J
-
-diff -r ec4baab78314 dwm.c
---- a/dwm.c Mon Dec 19 15:38:30 2011 +0100
-+++ b/dwm.c Sat Jan 14 12:35:50 2012 +0100
-@@ -397,9 +397,10 @@
- showhide(m->stack);
- else for(m = mons; m; m = m->next)
- showhide(m->stack);
-- if(m)
-+ if(m) {
- arrangemon(m);
-- else for(m = mons; m; m = m->next)
-+ restack(m);
-+ } else for(m = mons; m; m = m->next)
- arrangemon(m);
- }
-
-@@ -408,7 +409,6 @@
- strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
- if(m->lt[m->sellt]->arrange)
- m->lt[m->sellt]->arrange(m);
-- restack(m);
- }
-
- void
-@@ -1827,6 +1827,8 @@
- .event_mask = ButtonPressMask|ExposureMask
- };
- for(m = mons; m; m = m->next) {
-+ if (m->barwin)
-+ continue;
- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
- CopyFromParent, DefaultVisual(dpy, screen),
- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
diff --git a/pkgs/applications/window-managers/dwm/default.nix b/pkgs/applications/window-managers/dwm/default.nix
index 82eb9e56935f63e6fea6d40cc4a57fd449b40d65..b69dd9d8a492860f87ad0f1f907e5fd046233fe5 100644
--- a/pkgs/applications/window-managers/dwm/default.nix
+++ b/pkgs/applications/window-managers/dwm/default.nix
@@ -16,7 +16,7 @@ stdenv.mkDerivation {
prePatch = ''sed -i "s@/usr/local@$out@" config.mk'';
# Allow users set their own list of patches
- patches = [ ./confnotify-6.0.patch ] ++ patches;
+ inherit patches;
buildPhase = " make ";
diff --git a/pkgs/applications/window-managers/i3/default.nix b/pkgs/applications/window-managers/i3/default.nix
index f6d2dc4cfe5e05706e1cdbef267f59ca7b8307a1..ebdc7b143c3787fda518754b4afb592e3b1e45aa 100644
--- a/pkgs/applications/window-managers/i3/default.nix
+++ b/pkgs/applications/window-managers/i3/default.nix
@@ -1,18 +1,18 @@
{ fetchurl, stdenv, which, pkgconfig, libxcb, xcbutilkeysyms, xcbutil,
xcbutilwm, libstartup_notification, libX11, pcre, libev, yajl,
- libXcursor, coreutils, perl, pango }:
+ xcb-util-cursor, coreutils, perl, pango }:
stdenv.mkDerivation rec {
name = "i3-${version}";
- version = "4.6";
+ version = "4.7.2";
src = fetchurl {
url = "http://i3wm.org/downloads/${name}.tar.bz2";
- sha256 = "1qand44hjqz84f2xzd0mmyk9vpsm7iwz6446s4ivdj6f86213lpm";
+ sha256 = "14zkn5jgm0b7ablvxcxh9gdzq6mjdd6i1kl9dbmifl2a6rg5dr3g";
};
buildInputs = [ which pkgconfig libxcb xcbutilkeysyms xcbutil xcbutilwm
- libstartup_notification libX11 pcre libev yajl libXcursor perl pango ];
+ libstartup_notification libX11 pcre libev yajl xcb-util-cursor perl pango ];
patchPhase = ''
patchShebangs .
diff --git a/pkgs/applications/window-managers/openbox/default.nix b/pkgs/applications/window-managers/openbox/default.nix
index 487a8a5b387a5982cba251212c320dd30e0c201b..56a5f0e3e2cea4bf25c3e1e62df088d61c938bdc 100644
--- a/pkgs/applications/window-managers/openbox/default.nix
+++ b/pkgs/applications/window-managers/openbox/default.nix
@@ -1,6 +1,6 @@
{ stdenv, fetchurl, pkgconfig
, libxml2, libXinerama, libXcursor, libXau, libXrandr
-, imlib2, pango, libstartup_notification }:
+, imlib2, pango, libstartup_notification, makeWrapper}:
stdenv.mkDerivation rec {
name = "openbox-3.5.2";
@@ -9,6 +9,7 @@ stdenv.mkDerivation rec {
pkgconfig libxml2
libXinerama libXcursor libXau libXrandr
imlib2 pango libstartup_notification
+ makeWrapper
];
src = fetchurl {
@@ -16,6 +17,14 @@ stdenv.mkDerivation rec {
sha256 = "0cxgb334zj6aszwiki9g10i56sm18i7w1kw52vdnwgzq27pv93qj";
};
+ # Openbox needs XDG_DATA_DIRS set or it can't find its default theme
+ postInstall = ''
+ wrapProgram "$out/bin/openbox" --prefix XDG_DATA_DIRS : "$out/share"
+ wrapProgram "$out/bin/openbox-session" --prefix XDG_DATA_DIRS : "$out/share"
+ wrapProgram "$out/bin/openbox-gnome-session" --prefix XDG_DATA_DIRS : "$out/share"
+ wrapProgram "$out/bin/openbox-kde-session" --prefix XDG_DATA_DIRS : "$out/share"
+ '';
+
meta = {
description = "X window manager for non-desktop embedded systems";
homepage = http://openbox.org/;
diff --git a/pkgs/applications/window-managers/trayer/default.nix b/pkgs/applications/window-managers/trayer/default.nix
index b8ecf81f7fc795608f06a58da7a8fa07f71040bd..9b9017420c020accefa07edfdf5e595e78db8985 100644
--- a/pkgs/applications/window-managers/trayer/default.nix
+++ b/pkgs/applications/window-managers/trayer/default.nix
@@ -20,8 +20,6 @@ stdenv.mkDerivation rec {
description = "A lightweight GTK2-based systray for UNIX desktop";
- maintainers = [ stdenv.lib.maintainers.shlevy ];
-
platforms = stdenv.lib.platforms.linux;
};
}
diff --git a/pkgs/applications/window-managers/weston/default.nix b/pkgs/applications/window-managers/weston/default.nix
index 913235287ac5575f3558cc2d86739afce10cb808..4880029119eb694521e4202ae4efca91914cd004 100644
--- a/pkgs/applications/window-managers/weston/default.nix
+++ b/pkgs/applications/window-managers/weston/default.nix
@@ -1,20 +1,20 @@
{ stdenv, fetchurl, pkgconfig, wayland, mesa, libxkbcommon
, cairo, libxcb, libXcursor, x11, udev, libdrm, mtdev
-, libjpeg, pam, autoconf, automake, libtool }:
+, libjpeg, pam, autoconf, automake, libtool, dbus }:
-let version = "1.3.1"; in
+let version = "1.4.0"; in
stdenv.mkDerivation rec {
name = "weston-${version}";
src = fetchurl {
url = "http://wayland.freedesktop.org/releases/${name}.tar.xz";
- sha256 = "1isvh66irrz707r69495767n5yxp07dvy0xx6mj1mbj1n4s1657p";
+ sha256 = "0r7dz72ys9p3f697ajgmihkar2da36bnjna6yanb3kg9k2fk38kl";
};
buildInputs = [
pkgconfig wayland mesa libxkbcommon
- cairo libxcb libXcursor x11 udev libdrm mtdev libjpeg pam
+ cairo libxcb libXcursor x11 udev libdrm mtdev libjpeg pam dbus.libs
];
NIX_CFLAGS_COMPILE = "-I${libdrm}/include/libdrm";
diff --git a/pkgs/applications/window-managers/xmonad/default.nix b/pkgs/applications/window-managers/xmonad/default.nix
index 54ef0b274aa81f0e7ac67c327ffa6eb955012257..c80c8f1c9db0c1ec23b24c925b206c844ee37519 100644
--- a/pkgs/applications/window-managers/xmonad/default.nix
+++ b/pkgs/applications/window-managers/xmonad/default.nix
@@ -10,8 +10,9 @@ cabal.mkDerivation (self: {
extensibleExceptions filepath mtl utf8String X11
];
postInstall = ''
+ shopt -s globstar
mkdir -p $out/share/man/man1
- mv $out/share/xmonad-*/man/*.1 $out/share/man/man1/
+ mv "$out/"**"/man/"*.1 $out/share/man/man1/
'';
patches = [
diff --git a/pkgs/build-support/build-fhs-chrootenv/default.nix b/pkgs/build-support/build-fhs-chrootenv/default.nix
index 8756c4835b29ad80d68dcb60af6e360d3dbb0ef3..2f3aa14c6a0fe389e5fb7688d40c1cbc76b028dd 100644
--- a/pkgs/build-support/build-fhs-chrootenv/default.nix
+++ b/pkgs/build-support/build-fhs-chrootenv/default.nix
@@ -1,10 +1,12 @@
{stdenv, glibc, glibcLocales, gcc, coreutils, diffutils, findutils, gnused, gnugrep, gnutar, gzip, bzip2,
-bashInteractive, xz, shadow, gawk, less, buildEnv}:
+bashInteractive, xz, shadow, gawk, less, su, buildEnv}:
{name, pkgs ? [], profile ? ""}:
let
- basePkgs = [ glibc glibcLocales gcc coreutils diffutils findutils gnused gnugrep gnutar gzip bzip2
-bashInteractive xz shadow gawk less ];
+ basePkgs = [
+ glibc glibcLocales gcc coreutils diffutils findutils gnused gnugrep gnutar
+ gzip bzip2 bashInteractive xz shadow gawk less su
+ ];
# Compose a global profile for the chroot environment
profilePkg = stdenv.mkDerivation {
@@ -31,16 +33,16 @@ bashInteractive xz shadow gawk less ];
mountSh = ./mount.sh.in;
loadSh = ./load.sh.in;
umountSh = ./umount.sh.in;
- destroySh = ./destroy.sh.in;
-in
-stdenv.mkDerivation {
- name = "${name}-chrootenv";
- buildCommand = ''
- mkdir -p $out/sw
- cd $out/sw
-
- for i in ${staticUsrProfile}/{etc,bin,lib{,32,64},sbin,var}
- do
+ destroySh = ./destroy.sh.in;
+in
+stdenv.mkDerivation {
+ name = "${name}-chrootenv";
+ buildCommand = ''
+ mkdir -p $out/sw
+ cd $out/sw
+
+ for i in ${staticUsrProfile}/{etc,bin,lib{,32,64},sbin,var}
+ do
if [ -x "$i" ]
then
ln -s "$i"
diff --git a/pkgs/build-support/build-pecl.nix b/pkgs/build-support/build-pecl.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d84497e8019c7635ee2e4e72d4f907b6c752e2e7
--- /dev/null
+++ b/pkgs/build-support/build-pecl.nix
@@ -0,0 +1,9 @@
+{ stdenv, php, autoreconfHook }:
+
+args: stdenv.mkDerivation (args // {
+ buildInputs = [ php autoreconfHook ] ++ args.buildInputs or [];
+
+ makeFlags = [ "EXTENSION_DIR=$(out)/lib/php/extensions" ] ++ args.makeFlags or [];
+
+ autoreconfPhase = "phpize";
+})
diff --git a/pkgs/build-support/cabal/default.nix b/pkgs/build-support/cabal/default.nix
index 6dc83963d19ddd8e113838fc5961f1c06f7b2dce..ed7ca30db132c115219d46f6372711d15f4399bf 100644
--- a/pkgs/build-support/cabal/default.nix
+++ b/pkgs/build-support/cabal/default.nix
@@ -195,10 +195,6 @@ assert !enableStaticLibraries -> versionOlder "7.7" ghc.version;
done
done
- ${optionalString self.enableSharedExecutables ''
- configureFlags+=" --ghc-option=-optl=-Wl,-rpath=$out/lib/${ghc.ghc.name}/${self.pname}-${self.version}";
- ''}
-
echo "configure flags: $extraConfigureFlags $configureFlags"
./Setup configure --verbose --prefix="$out" --libdir='$prefix/lib/$compiler' \
--libsubdir='$pkgid' $extraConfigureFlags $configureFlags 2>&1 \
@@ -220,7 +216,7 @@ assert !enableStaticLibraries -> versionOlder "7.7" ghc.version;
./Setup build ${self.buildTarget}
export GHC_PACKAGE_PATH=$(${ghc.GHCPackages})
- test -n "$noHaddock" || ./Setup haddock
+ test -n "$noHaddock" || ./Setup haddock --html --hoogle
eval "$postBuild"
'';
diff --git a/pkgs/build-support/clang-wrapper/default.nix b/pkgs/build-support/clang-wrapper/default.nix
index 05b8194697e162e17d7e8e4b6459f7c364c8b9a8..4b2a5a1182ea64f244861080299511f1150109c2 100644
--- a/pkgs/build-support/clang-wrapper/default.nix
+++ b/pkgs/build-support/clang-wrapper/default.nix
@@ -18,21 +18,21 @@ let
clangVersion = (builtins.parseDrvName clang.name).version;
clangName = (builtins.parseDrvName clang.name).name;
-
+
in
stdenv.mkDerivation {
name =
(if name != "" then name else clangName + "-wrapper") +
(if clang != null && clangVersion != "" then "-" + clangVersion else "");
-
+
builder = ./builder.sh;
setupHook = ./setup-hook.sh;
clangWrapper = ./clang-wrapper.sh;
ldWrapper = ./ld-wrapper.sh;
utils = ./utils.sh;
addFlags = ./add-flags;
-
+
inherit nativeTools nativeLibc nativePrefix clang clangVersion libcxx;
libcxxabi = libcxx.abi or null;
@@ -42,7 +42,7 @@ stdenv.mkDerivation {
binutils = if nativeTools then null else binutils;
# The wrapper scripts use 'cat', so we may need coreutils
coreutils = if nativeTools then null else coreutils;
-
+
langC = true;
langCC = true;
shell = if shell == "" then stdenv.shell else
@@ -65,7 +65,7 @@ stdenv.mkDerivation {
if stdenv.lib.hasSuffix "pc-gnu" stdenv.cross.config then "ld.so.1" else
abort "don't know the name of the dynamic linker for this platform");
};
-
+
meta =
let clang_ = if clang != null then clang else {}; in
(if clang_ ? meta then removeAttrs clang.meta ["priority"] else {}) //
@@ -84,4 +84,6 @@ stdenv.mkDerivation {
if stdenv.system == "mips64el-linux" then "ld.so.1" else
abort "don't know the name of the dynamic linker for this platform")
else "";
+
+ preferLocalBuild = true;
}
diff --git a/pkgs/build-support/clang-wrapper/setup-hook.sh b/pkgs/build-support/clang-wrapper/setup-hook.sh
index 74365a527043895d98a08e9c708bb71e07389436..f7687651eaf6c6a7522d42fbd024da5763ac3c26 100644
--- a/pkgs/build-support/clang-wrapper/setup-hook.sh
+++ b/pkgs/build-support/clang-wrapper/setup-hook.sh
@@ -1,6 +1,6 @@
addCVars () {
if test -d $1/include; then
- export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I$1/include"
+ export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -isystem $1/include"
fi
if test -d $1/lib64; then
@@ -31,3 +31,6 @@ fi
if test -n "@coreutils@"; then
addToSearchPath PATH @coreutils@/bin
fi
+
+: ${CXX:=clang++}
+export CXX
diff --git a/pkgs/build-support/fetchgit/builder.sh b/pkgs/build-support/fetchgit/builder.sh
index 5c7d92698cc3265d72ac9976cb77d8df5e3fe457..9050cce6ee8fe296b4da203a1081b588652953e5 100644
--- a/pkgs/build-support/fetchgit/builder.sh
+++ b/pkgs/build-support/fetchgit/builder.sh
@@ -6,6 +6,8 @@ source $stdenv/setup
header "exporting $url (rev $rev) into $out"
-$fetcher --builder --url "$url" --out "$out" --rev "$rev" ${leaveDotGit:+--leave-dotGit}
+$fetcher --builder --url "$url" --out "$out" --rev "$rev" \
+ ${leaveDotGit:+--leave-dotGit} \
+ ${fetchSubmodules:+--fetch-submodules}
stopNest
diff --git a/pkgs/build-support/fetchgit/default.nix b/pkgs/build-support/fetchgit/default.nix
index e94e4185936bf05cc5810d6bc3296b82090aeeb5..a17daf9a2c5753173e0fdfa7c984408d970268a2 100644
--- a/pkgs/build-support/fetchgit/default.nix
+++ b/pkgs/build-support/fetchgit/default.nix
@@ -1,5 +1,5 @@
{stdenv, git, cacert}:
-{url, rev ? "HEAD", md5 ? "", sha256 ? "", leaveDotGit ? false }:
+{url, rev ? "HEAD", md5 ? "", sha256 ? "", leaveDotGit ? false, fetchSubmodules ? true}:
/* NOTE:
fetchgit has one problem: git fetch only works for refs.
@@ -23,6 +23,8 @@
server admins start using the new version?
*/
+assert md5 != "" || sha256 != "";
+
stdenv.mkDerivation {
name = "git-export";
builder = ./builder.sh;
@@ -33,7 +35,7 @@ stdenv.mkDerivation {
outputHashMode = "recursive";
outputHash = if sha256 == "" then md5 else sha256;
- inherit url rev leaveDotGit;
+ inherit url rev leaveDotGit fetchSubmodules;
GIT_SSL_CAINFO = "${cacert}/etc/ca-bundle.crt";
@@ -44,5 +46,7 @@ stdenv.mkDerivation {
# by definition pure.
"http_proxy" "https_proxy" "ftp_proxy" "all_proxy" "no_proxy"
];
+
+ preferLocalBuild = true;
}
diff --git a/pkgs/build-support/fetchgit/nix-prefetch-git b/pkgs/build-support/fetchgit/nix-prefetch-git
index 8d0de055c756f7acda54f91832d33d1cd88da972..6e79f82eae867e68af1cc9a9c94a24fff32ee167 100755
--- a/pkgs/build-support/fetchgit/nix-prefetch-git
+++ b/pkgs/build-support/fetchgit/nix-prefetch-git
@@ -6,6 +6,7 @@ expHash=
hashType=$NIX_HASH_ALGO
deepClone=$NIX_PREFETCH_GIT_DEEP_CLONE
leaveDotGit=$NIX_PREFETCH_GIT_LEAVE_DOT_GIT
+fetchSubmodules=
builder=
if test -n "$deepClone"; then
@@ -33,6 +34,7 @@ for arg; do
--deepClone) deepClone=true;;
--no-deepClone) deepClone=false;;
--leave-dotGit) leaveDotGit=true;;
+ --fetch-submodules) fetchSubmodules=true;;
--builder) builder=true;;
*)
argi=$(($argi + 1))
@@ -66,6 +68,7 @@ Options:
--deepClone Clone submodules recursively.
--no-deepClone Do not clone submodules.
--leave-dotGit Keep the .git directories.
+ --fetch-submodules Fetch submodules.
--builder Clone as fetchgit does, but url, rev, and out option are mandatory.
"
exit 1
@@ -178,7 +181,9 @@ clone(){
)
# Checkout linked sources.
- init_submodules;
+ if test -n "$fetchSubmodules"; then
+ init_submodules;
+ fi
if [ -z "$builder" -a -f .topdeps ]; then
if tg help 2>&1 > /dev/null
diff --git a/pkgs/build-support/fetchsvn/default.nix b/pkgs/build-support/fetchsvn/default.nix
index 30625a758f8c893381de89543192d9a28164b25c..228a5eaa58047aee5eacba498d7d172f0d180f31 100644
--- a/pkgs/build-support/fetchsvn/default.nix
+++ b/pkgs/build-support/fetchsvn/default.nix
@@ -40,4 +40,6 @@ stdenv.mkDerivation {
# by definition pure.
"http_proxy" "https_proxy" "ftp_proxy" "all_proxy" "no_proxy"
];
+
+ preferLocalBuild = true;
}
diff --git a/pkgs/build-support/fetchurl/default.nix b/pkgs/build-support/fetchurl/default.nix
index 294d9a43ef7d58a01c484190b39cbc202ec90746..af4a6700153c21941c04ec920201eed986593197 100644
--- a/pkgs/build-support/fetchurl/default.nix
+++ b/pkgs/build-support/fetchurl/default.nix
@@ -66,6 +66,7 @@ in
showURLs ? false
}:
+assert builtins.isList urls;
assert urls != [] -> url == "";
assert url != "" -> urls == [];
diff --git a/pkgs/build-support/fetchurl/mirrors.nix b/pkgs/build-support/fetchurl/mirrors.nix
index c6c294d5504241f3e6940893c686f1c722a180f3..c4841c50d94c8cc0911bb1729522f1fc1192798e 100644
--- a/pkgs/build-support/fetchurl/mirrors.nix
+++ b/pkgs/build-support/fetchurl/mirrors.nix
@@ -159,7 +159,7 @@ rec {
# Debian.
debian = [
- #ftp://ftp.au.debian.org/debian/
+ ftp://ftp.au.debian.org/debian/
ftp://ftp.de.debian.org/debian/
ftp://ftp.es.debian.org/debian/
ftp://ftp.fr.debian.org/debian/
diff --git a/pkgs/build-support/gcc-cross-wrapper/builder.sh b/pkgs/build-support/gcc-cross-wrapper/builder.sh
index 5a5bd45a8f812131cad74c74458a65e98849f2cf..2dfa315d168f24f97b0a764e66b45031725d2ffb 100644
--- a/pkgs/build-support/gcc-cross-wrapper/builder.sh
+++ b/pkgs/build-support/gcc-cross-wrapper/builder.sh
@@ -87,6 +87,8 @@ mkGccWrapper $out/bin/$crossConfig-gcc $gccPath/$crossConfig-gcc
mkGccWrapper $out/bin/$crossConfig-g++ $gccPath/$crossConfig-g++
ln -s $crossConfig-g++ $out/bin/$crossConfig-c++
+mkGccWrapper $out/bin/$crossConfig-cpp $gccPath/$crossConfig-cpp
+
mkGccWrapper $out/bin/$crossConfig-g77 $gccPath/$crossConfig-g77
ln -s $crossConfig-g77 $out/bin/$crossConfig-f77
diff --git a/pkgs/build-support/gcc-wrapper/builder.sh b/pkgs/build-support/gcc-wrapper/builder.sh
index ed7ad0a50b735a1460cbf49bc6bbeabc1bbece92..c79680712ee7ce8e65dc428504be5ac87782c755 100644
--- a/pkgs/build-support/gcc-wrapper/builder.sh
+++ b/pkgs/build-support/gcc-wrapper/builder.sh
@@ -66,13 +66,23 @@ else
echo "$gccCFlags" > $out/nix-support/gcc-cflags
gccPath="$gcc/bin"
- ldPath="$binutils/bin"
+ # On Illumos/Solaris we might prefer native ld
+ if test -n "$nativePrefix"; then
+ ldPath="$nativePrefix/bin"
+ else
+ ldPath="$binutils/bin"
+ fi;
fi
doSubstitute() {
local src=$1
local dst=$2
+ local ld="$ldPath/ld"
+ if $ld -V 2>&1 |grep Solaris; then
+ # Use Solaris specific linker wrapper
+ ld="$out/bin/ld-solaris"
+ fi
# Can't use substitute() here, because replace may not have been
# built yet (in the bootstrap).
sed \
@@ -85,7 +95,7 @@ doSubstitute() {
-e "s^@binutils@^$binutils^g" \
-e "s^@coreutils@^$coreutils^g" \
-e "s^@libc@^$libc^g" \
- -e "s^@ld@^$ldPath/ld^g" \
+ -e "s^@ld@^$ld^g" \
< "$src" > "$dst"
}
@@ -144,6 +154,8 @@ then
ln -sv g++ $out/bin/c++
fi
+mkGccWrapper $out/bin/cpp $gccPath/cpp || true
+
if mkGccWrapper $out/bin/gfortran $gccPath/gfortran
then
ln -sv gfortran $out/bin/g77
@@ -174,6 +186,13 @@ ln -s $ldPath/as $out/bin/as
doSubstitute "$ldWrapper" "$out/bin/ld"
chmod +x "$out/bin/ld"
+# Copy solaris ld wrapper if needed
+if $ldPath/ld -V 2>&1 |grep Solaris; then
+ # Use Solaris specific linker wrapper
+ sed -e "s^@ld@^$ldPath/ld^g" < "$ldSolarisWrapper" > "$out/bin/ld-solaris"
+ chmod +x "$out/bin/ld-solaris"
+fi
+
# Emit a setup hook. Also store the path to the original GCC and
# Glibc.
diff --git a/pkgs/build-support/gcc-wrapper/default.nix b/pkgs/build-support/gcc-wrapper/default.nix
index 992c0f9af371a426625c18628f0ef42857f748bc..8e8b0b90945423eddf3204a1cb28710cfd563fe1 100644
--- a/pkgs/build-support/gcc-wrapper/default.nix
+++ b/pkgs/build-support/gcc-wrapper/default.nix
@@ -29,22 +29,23 @@ stdenv.mkDerivation {
name =
(if name != "" then name else gccName + "-wrapper") +
(if gcc != null && gccVersion != "" then "-" + gccVersion else "");
-
+
builder = ./builder.sh;
setupHook = ./setup-hook.sh;
gccWrapper = ./gcc-wrapper.sh;
gnatWrapper = ./gnat-wrapper.sh;
gnatlinkWrapper = ./gnatlink-wrapper.sh;
ldWrapper = ./ld-wrapper.sh;
+ ldSolarisWrapper = ./ld-solaris-wrapper.sh;
utils = ./utils.sh;
addFlags = ./add-flags;
-
+
inherit nativeTools nativeLibc nativePrefix gcc;
libc = if nativeLibc then null else libc;
binutils = if nativeTools then null else binutils;
# The wrapper scripts use 'cat', so we may need coreutils
coreutils = if nativeTools then null else coreutils;
-
+
langC = if nativeTools then true else gcc.langC;
langCC = if nativeTools then true else gcc.langCC;
langFortran = if nativeTools then false else gcc ? langFortran;
@@ -71,7 +72,9 @@ stdenv.mkDerivation {
if stdenv.lib.hasSuffix "pc-gnu" stdenv.cross.config then "ld.so.1" else
abort "don't know the name of the dynamic linker for this platform");
};
-
+
+ preferLocalBuild = true;
+
meta =
let gcc_ = if gcc != null then gcc else {}; in
(if gcc_ ? meta then removeAttrs gcc.meta ["priority"] else {}) //
diff --git a/pkgs/build-support/gcc-wrapper/ld-solaris-wrapper.sh b/pkgs/build-support/gcc-wrapper/ld-solaris-wrapper.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5a7b92b5ad7db6c71db1f1aad8a8a563e9ab998a
--- /dev/null
+++ b/pkgs/build-support/gcc-wrapper/ld-solaris-wrapper.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+set -e
+set -u
+
+# I've also tried adding -z direct and -z lazyload, but it gave too many problems with C++ exceptions :'(
+# Also made sure libgcc would not be lazy-loaded, as suggested here: https://www.illumos.org/issues/2534#note-3
+# but still no success.
+cmd="@ld@ -z ignore"
+
+args=("$@");
+
+# This loop makes sure all -L arguments are before -l arguments, or ld may complain it cannot find a library.
+# GNU binutils does not have this problem:
+# http://stackoverflow.com/questions/5817269/does-the-order-of-l-and-l-options-in-the-gnu-linker-matter
+i=0;
+while [[ $i -lt $# ]]; do
+ case "${args[$i]}" in
+ -L) cmd="$cmd ${args[$i]} ${args[($i+1)]}"; i=($i+1); ;;
+ -L*) cmd="$cmd ${args[$i]}" ;;
+ *) ;;
+ esac
+ i=($i+1);
+done
+
+i=0;
+while [[ $i -lt $# ]]; do
+ case "${args[$i]}" in
+ -L) i=($i+1); ;;
+ -L*) ;;
+ *) cmd="$cmd ${args[$i]}" ;;
+ esac
+ i=($i+1);
+done
+
+# Trace:
+set -x
+exec $cmd
+
+exit 0
diff --git a/pkgs/build-support/gcc-wrapper/setup-hook.sh b/pkgs/build-support/gcc-wrapper/setup-hook.sh
index 513ab8053a7e9e368bc4737dd867e40466c477e5..298ade21d1f59b993ad8b41a8e9b346d13a9a093 100644
--- a/pkgs/build-support/gcc-wrapper/setup-hook.sh
+++ b/pkgs/build-support/gcc-wrapper/setup-hook.sh
@@ -1,6 +1,6 @@
addCVars () {
if test -d $1/include; then
- export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I$1/include"
+ export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -isystem $1/include"
fi
if test -d $1/lib64; then
diff --git a/pkgs/build-support/kdewrapper/default.nix b/pkgs/build-support/kdewrapper/default.nix
index be90011f49397d9de168d57bece97b8bb607f418..6dcf68a324a28cf9d64d2a02ca517f8eb837edab 100644
--- a/pkgs/build-support/kdewrapper/default.nix
+++ b/pkgs/build-support/kdewrapper/default.nix
@@ -39,4 +39,6 @@ stdenv.mkDerivation {
chmod +x $PROG
done
'';
+
+ preferLocalBuild = true;
}
diff --git a/pkgs/build-support/kernel/cpio-clean.pl b/pkgs/build-support/kernel/cpio-clean.pl
new file mode 100644
index 0000000000000000000000000000000000000000..ddc6435a5a819aebf447059b3f8c8733c0599408
--- /dev/null
+++ b/pkgs/build-support/kernel/cpio-clean.pl
@@ -0,0 +1,17 @@
+use strict;
+
+# Make inode number, link info and mtime consistent in order to get a consistent hash.
+#
+# Author: Alexander Kjeldaas
+
+use Archive::Cpio;
+
+my $cpio = Archive::Cpio->new;
+my $IN = \*STDIN;
+my $ino = 1;
+$cpio->read_with_handler($IN, sub {
+ my ($e) = @_;
+ $e->{mtime} = 1;
+ $cpio->write_one(\*STDOUT, $e);
+ });
+$cpio->write_trailer(\*STDOUT);
diff --git a/pkgs/build-support/kernel/make-initrd.nix b/pkgs/build-support/kernel/make-initrd.nix
index 4ddf0706e03e1f692c4f9d30d7af8ab55540d772..0582ca5530122032e1ce746c8112cc9cb064d144 100644
--- a/pkgs/build-support/kernel/make-initrd.nix
+++ b/pkgs/build-support/kernel/make-initrd.nix
@@ -12,10 +12,10 @@
# `contents = {object = ...; symlink = /init;}' is a typical
# argument.
-{stdenv, perl, cpio, contents, ubootChooser, compressor}:
+{stdenv, perl, perlArchiveCpio, cpio, contents, ubootChooser, compressor}:
let
- inputsFun = ubootName : [perl cpio]
+ inputsFun = ubootName : [perl cpio perlArchiveCpio ]
++ stdenv.lib.optional (ubootName != null) [ (ubootChooser ubootName) ];
makeUInitrdFun = ubootName : (ubootName != null);
in
@@ -35,6 +35,7 @@ stdenv.mkDerivation {
exportReferencesGraph =
map (x: [("closure-" + baseNameOf x.symlink) x.object]) contents;
pathsFromGraph = ./paths-from-graph.pl;
+ cpioClean = ./cpio-clean.pl;
crossAttrs = {
nativeBuildInputs = inputsFun stdenv.cross.platform.uboot;
diff --git a/pkgs/build-support/kernel/make-initrd.sh b/pkgs/build-support/kernel/make-initrd.sh
index f6cadaf02819065dcad5b8a4ac859a3874b9ad1b..17b261f9840736b9fafa3bdfd8d02b9876dbc742 100644
--- a/pkgs/build-support/kernel/make-initrd.sh
+++ b/pkgs/build-support/kernel/make-initrd.sh
@@ -36,7 +36,7 @@ storePaths=$(perl $pathsFromGraph closure-*)
# Put the closure in a gzipped cpio archive.
mkdir -p $out
-(cd root && find * -print0 | cpio -o -H newc --null | $compressor > $out/initrd)
+(cd root && find * -print0 | cpio -o -H newc --null | perl $cpioClean | $compressor > $out/initrd)
if [ -n "$makeUInitrd" ]; then
mv $out/initrd $out/initrd.gz
diff --git a/pkgs/build-support/release/debian-build.nix b/pkgs/build-support/release/debian-build.nix
index ba7be86a6c1e7c5b156e66c817070d87bac91f20..168b44ad74c753cc4f7abe54625b886c3c7d66e2 100644
--- a/pkgs/build-support/release/debian-build.nix
+++ b/pkgs/build-support/release/debian-build.nix
@@ -51,7 +51,7 @@ vmTools.runInLinuxImage (stdenv.mkDerivation (
'';
installPhase = ''
- eval "$preInstall"
+ eval "$preInstall"
export LOGNAME=root
${checkinstall}/sbin/checkinstall --nodoc -y -D \
@@ -59,6 +59,8 @@ vmTools.runInLinuxImage (stdenv.mkDerivation (
--requires="${concatStringsSep "," debRequires}" \
--provides="${concatStringsSep "," debProvides}" \
${optionalString (src ? version) "--pkgversion=$(echo ${src.version} | tr _ -)"} \
+ ''${debMaintainer:+--maintainer="'$debMaintainer'"} \
+ $checkInstallFlags \
make install
mkdir -p $out/debs
@@ -79,7 +81,7 @@ vmTools.runInLinuxImage (stdenv.mkDerivation (
echo "file deb-extra $(ls $i/debs/*.deb | sort | head -1)" >> $out/nix-support/hydra-build-products
done
- eval "$postInstall"
+ eval "$postInstall"
''; # */
meta = (if args ? meta then args.meta else {}) // {
diff --git a/pkgs/build-support/release/default.nix b/pkgs/build-support/release/default.nix
index 3d593f0b6bb7a12d27f5065c2d2b9e705a1cd7b5..6288935ec2a5612378c28f100c422905b9bd38de 100644
--- a/pkgs/build-support/release/default.nix
+++ b/pkgs/build-support/release/default.nix
@@ -27,10 +27,14 @@ rec {
} // args);
coverageAnalysis = args: nixBuild (
- { inherit lcov;
+ { inherit lcov enableGCOVInstrumentation makeGCOVReport;
doCoverageAnalysis = true;
} // args);
+ gcovReport = args: import ./gcov-report.nix (
+ { inherit runCommand lcov rsync;
+ } // args);
+
rpmBuild = args: import ./rpm-build.nix (
{ inherit vmTools;
} // args);
diff --git a/pkgs/build-support/release/gcov-report.nix b/pkgs/build-support/release/gcov-report.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8ce5c0488a7d5de7a320ddf857af027570fa81a8
--- /dev/null
+++ b/pkgs/build-support/release/gcov-report.nix
@@ -0,0 +1,49 @@
+{ runCommand, lcov, rsync, coverageRuns, lcovFilter ? [ "/nix/store/*" ], baseDirHack ? false }:
+
+runCommand "coverage"
+ { buildInputs = [ lcov rsync ];
+ inherit lcovFilter baseDirHack;
+ }
+ ''
+ mkdir -p $TMPDIR/gcov $out/nix-support $out/coverage
+ info=$out/coverage/full.info
+
+ for p in ${toString coverageRuns}; do
+ if [ -f $p/nix-support/hydra-build-products ]; then
+ cat $p/nix-support/hydra-build-products >> $out/nix-support/hydra-build-products
+ fi
+
+ [ ! -e $p/nix-support/failed ] || touch $out/nix-support/failed
+
+ opts=
+ for d in $p/coverage-data/*; do
+ for i in $(cd $d/nix/store && ls); do
+ if ! [ -e /nix/store/$i/.build ]; then continue; fi
+ if [ -e $TMPDIR/gcov/nix/store/$i ]; then continue; fi
+ echo "copying $i..."
+ rsync -a /nix/store/$i/.build/* $TMPDIR/gcov/
+ if [ -n "$baseDirHack" ]; then
+ opts="-b $TMPDIR/gcov/$(cd /nix/store/$i/.build && ls)"
+ fi
+ done
+
+ for i in $(cd $d/nix/store && ls); do
+ rsync -a $d/nix/store/$i/.build/* $TMPDIR/gcov/ --include '*/' --include '*.gcda' --exclude '*'
+ done
+ done
+
+ chmod -R u+w $TMPDIR/gcov
+
+ echo "producing info..."
+ geninfo --ignore-errors source,gcov $TMPDIR/gcov --output-file $TMPDIR/app.info $opts
+ cat $TMPDIR/app.info >> $info
+ done
+
+ echo "making report..."
+ set -o noglob
+ lcov --remove $info ''$lcovFilter > $info.tmp
+ set +o noglob
+ mv $info.tmp $info
+ genhtml --show-details $info -o $out/coverage
+ echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products
+ ''
diff --git a/pkgs/build-support/release/maven-build.nix b/pkgs/build-support/release/maven-build.nix
index 39f069cd57f05f9d63dbe8bc9a4fa3212a9f1da7..6b47bb9cae906f694a4ec7b27fb583f529810175 100644
--- a/pkgs/build-support/release/maven-build.nix
+++ b/pkgs/build-support/release/maven-build.nix
@@ -78,7 +78,7 @@ stdenv.mkDerivation ( rec {
zip=$(ls target/*.zip| head -1)
releaseName=$(basename $zip .zip)
- releaseName="$releaseName-r${toString src.rev}"
+ releaseName="$releaseName-r${toString src.rev or "0"}"
cp $zip $out/release/$releaseName.zip
echo "$releaseName" > $out/nix-support/hydra-release-name
diff --git a/pkgs/build-support/release/nix-build.nix b/pkgs/build-support/release/nix-build.nix
index 88bafd84faa30f283cd5021fdd64e73a50a5fcf5..8ebae24c67333ad512739637f5a547ab12d51a20 100644
--- a/pkgs/build-support/release/nix-build.nix
+++ b/pkgs/build-support/release/nix-build.nix
@@ -15,6 +15,7 @@
, failureHook ? null
, prePhases ? []
, postPhases ? []
+, buildInputs ? []
, ... } @ args:
stdenv.mkDerivation (
@@ -61,13 +62,6 @@ stdenv.mkDerivation (
. ${./functions.sh}
origSrc=$src
src=$(findTarballs $src | head -1)
-
- # Set GCC flags for coverage analysis, if desired.
- if test -n "${toString doCoverageAnalysis}"; then
- export NIX_CFLAGS_COMPILE="-O0 --coverage $NIX_CFLAGS_COMPILE"
- export CFLAGS="-O0"
- export CXXFLAGS="-O0"
- fi
'';
initPhase = ''
@@ -85,30 +79,13 @@ stdenv.mkDerivation (
prePhases = ["initPhase"] ++ prePhases;
- # In the report phase, create a coverage analysis report.
- coverageReportPhase = if doCoverageAnalysis then ''
- ${args.lcov}/bin/lcov --directory . --capture --output-file app.info
- set -o noglob
- ${args.lcov}/bin/lcov --remove app.info $lcovFilter > app2.info
- set +o noglob
- mv app2.info app.info
-
- mkdir $out/coverage
- ${args.lcov}/bin/genhtml app.info $lcovExtraTraceFiles -o $out/coverage > log
-
- # Grab the overall coverage percentage for use in release overviews.
- grep "Overall coverage rate" log | sed 's/^.*(\(.*\)%).*$/\1/' > $out/nix-support/coverage-rate
-
- echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products
- '' else "";
-
+ buildInputs = buildInputs ++ stdenv.lib.optional doCoverageAnalysis args.makeGCOVReport;
lcovFilter = ["/nix/store/*"] ++ lcovFilter;
inherit lcovExtraTraceFiles;
- postPhases = postPhases ++
- (stdenv.lib.optional doCoverageAnalysis "coverageReportPhase") ++ ["finalPhase"];
+ postPhases = postPhases ++ ["finalPhase"];
meta = (if args ? meta then args.meta else {}) // {
description = if doCoverageAnalysis then "Coverage analysis" else "Nix package for ${stdenv.system}";
diff --git a/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh
new file mode 100644
index 0000000000000000000000000000000000000000..7175b408b02fd223f1de953c5c1dc51a491aa577
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh
@@ -0,0 +1,31 @@
+postPhases+=" cleanupBuildDir"
+
+# Force GCC to build with coverage instrumentation. Also disable
+# optimisation, since it may confuse things.
+export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -O0 --coverage"
+
+# FIXME: Handle the case where postUnpack is already set.
+postUnpack() {
+ # This is an uberhack to prevent libtool from remoaving gcno
+ # files. This has been fixed in libtool, but there are packages
+ # out there with old ltmain.sh scripts. See
+ # http://www.mail-archive.com/libtool@gnu.org/msg10725.html
+ for i in $(find -name ltmain.sh); do
+ substituteInPlace $i --replace '*.$objext)' '*.$objext | *.gcno)'
+ done
+}
+
+# Get rid of everything that isn't a gcno file or a C source file.
+# Also strip the `.tmp_' prefix from gcno files. (The Linux kernel
+# creates these.)
+cleanupBuildDir() {
+ if ! [ -e $out/.build ]; then return; fi
+
+ find $out/.build/ -type f -a ! \
+ \( -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.h" -o -name "*.hh" -o -name "*.y" -o -name "*.l" -o -name "*.gcno" \) \
+ | xargs rm -f --
+
+ for i in $(find $out/.build/ -name ".tmp_*.gcno"); do
+ mv "$i" "$(echo $i | sed s/.tmp_//)"
+ done
+}
diff --git a/pkgs/build-support/setup-hooks/keep-build-tree.sh b/pkgs/build-support/setup-hooks/keep-build-tree.sh
new file mode 100644
index 0000000000000000000000000000000000000000..754900bfc337a6aec939cab63169c8f0399f7f73
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/keep-build-tree.sh
@@ -0,0 +1,6 @@
+prePhases+=" moveBuildDir"
+
+moveBuildDir() {
+ mkdir -p $out/.build
+ cd $out/.build
+}
diff --git a/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4b8abb61ace5714ba8a3dcc6d6f2b6fc9cf48328
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh
@@ -0,0 +1,18 @@
+postPhases+=" coverageReportPhase"
+
+coverageReportPhase() {
+ lcov --directory . --capture --output-file app.info
+ set -o noglob
+ lcov --remove app.info ${lcovFilter:-"/nix/store/*"} > app2.info
+ set +o noglob
+ mv app2.info app.info
+
+ mkdir -p $out/coverage
+ genhtml app.info $lcovExtraTraceFiles -o $out/coverage > log
+
+ # Grab the overall coverage percentage for use in release overviews.
+ mkdir -p $out/nix-support
+ grep "Overall coverage rate" log | sed 's/^.*(\(.*\)%).*$/\1/' > $out/nix-support/coverage-rate
+
+ echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products
+}
diff --git a/pkgs/build-support/trivial-builders.nix b/pkgs/build-support/trivial-builders.nix
index 5ae2e7b4fc9b677c40adcf7153002e6b4960a601..c08a6c3a265fc07d75c33a637f67e75498501811 100644
--- a/pkgs/build-support/trivial-builders.nix
+++ b/pkgs/build-support/trivial-builders.nix
@@ -33,6 +33,7 @@ rec {
# Shorthands for `writeTextFile'.
writeText = name: text: writeTextFile {inherit name text;};
+ writeTextDir = name: text: writeTextFile {inherit name text; destination = "/${name}";};
writeScript = name: text: writeTextFile {inherit name text; executable = true;};
writeScriptBin = name: text: writeTextFile {inherit name text; executable = true; destination = "/bin/${name}";};
diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix
index 625f93c874f21a52a00037392b4d6477aec74e31..274cd05024bd29ca030edd3791c0c246e44cd19b 100644
--- a/pkgs/build-support/vm/default.nix
+++ b/pkgs/build-support/vm/default.nix
@@ -2,7 +2,7 @@
, kernel ? pkgs.linux_3_10
, img ? "bzImage"
, rootModules ?
- [ "virtio_pci" "virtio_blk" "virtio_balloon" "ext4" "unix" "9p" "9pnet_virtio" ]
+ [ "virtio_pci" "virtio_blk" "virtio_balloon" "ext4" "unix" "9p" "9pnet_virtio" "rtc_cmos" ]
}:
with pkgs;
@@ -57,6 +57,7 @@ rec {
mknod ${dev}/random c 1 8
mknod ${dev}/urandom c 1 9
mknod ${dev}/tty c 5 0
+ mknod ${dev}/rtc c 254 0
. /sys/class/block/${hd}/uevent
mknod ${dev}/${hd} b $MAJOR $MINOR
'';
@@ -159,6 +160,10 @@ rec {
#! ${bash}/bin/sh
source /tmp/xchg/saved-env
+ # Set the system time from the hardware clock. Works around an
+ # apparent KVM > 1.5.2 bug.
+ ${pkgs.utillinux}/sbin/hwclock -s
+
export NIX_STORE=/nix/store
export NIX_BUILD_TOP=/tmp
export TMPDIR=/tmp
@@ -924,6 +929,32 @@ rec {
packages = commonFedoraPackages ++ [ "cronie" "util-linux" ];
};
+ fedora17i386 = {
+ name = "fedora-17-i386";
+ fullName = "Fedora 17 (i386)";
+ packagesList = fetchurl {
+ url = mirror://fedora/linux/releases/17/Everything/i386/os/repodata/82dc1ea6d26e53a367dc6e7472113c4454c9a8ac7c98d4bfb11fd0b6f311450f-primary.xml.gz;
+ sha256 = "03s527rvdl0zn6zx963wmjlcjm247h8p4x3fviks6lvfsak1xp42";
+ };
+ urlPrefix = mirror://fedora/linux/releases/17/Everything/i386/os;
+ archs = ["noarch" "i386" "i586" "i686"];
+ packages = commonFedoraPackages ++ [ "cronie" "util-linux" ];
+ unifiedSystemDir = true;
+ };
+
+ fedora17x86_64 = {
+ name = "fedora-17-x86_64";
+ fullName = "Fedora 17 (x86_64)";
+ packagesList = fetchurl {
+ url = mirror://fedora/linux/releases/17/Everything/x86_64/os/repodata/7009de56f1a1c399930fa72094a310a40d38153c96d0b5af443914d3d6a7d811-primary.xml.gz;
+ sha256 = "04fqlzbd651r8jpvbl4n7hakh3d422ir88571y9rkhx1y5bdw2bh";
+ };
+ urlPrefix = mirror://fedora/linux/releases/17/Everything/x86_64/os;
+ archs = ["noarch" "x86_64"];
+ packages = commonFedoraPackages ++ [ "cronie" "util-linux" ];
+ unifiedSystemDir = true;
+ };
+
fedora18i386 = {
name = "fedora-18-i386";
fullName = "Fedora 18 (i386)";
@@ -1505,22 +1536,22 @@ rec {
debian70x86_64 = debian7x86_64;
debian7i386 = {
- name = "debian-7.3-wheezy-i386";
- fullName = "Debian 7.3 Wheezy (i386)";
+ name = "debian-7.4-wheezy-i386";
+ fullName = "Debian 7.4 Wheezy (i386)";
packagesList = fetchurl {
url = mirror://debian/dists/wheezy/main/binary-i386/Packages.bz2;
- sha256 = "037637520ce371a50beb5446fd27a731f30b51bc362c2f4a5dcfce9c7e30ffb6";
+ sha256 = "9f19822c82e25cd149f82b0d16fdbc00d1080db7f34e41de456498dc7c54f2b4";
};
urlPrefix = mirror://debian;
packages = commonDebianPackages;
};
debian7x86_64 = {
- name = "debian-7.3-wheezy-amd64";
- fullName = "Debian 7.3 Wheezy (amd64)";
+ name = "debian-7.4-wheezy-amd64";
+ fullName = "Debian 7.4 Wheezy (amd64)";
packagesList = fetchurl {
url = mirror://debian/dists/wheezy/main/binary-amd64/Packages.bz2;
- sha256 = "c2ed55a2a263d482826c934b97ad910984fa5695ab1c480841741b828d0590a5";
+ sha256 = "160ee0917693bc2e8f69b233c220857f35a70d906540d99d2779def576daf5f7";
};
urlPrefix = mirror://debian;
packages = commonDebianPackages;
@@ -1688,5 +1719,4 @@ rec {
};
};
-
-}
+} // import ./windows pkgs
diff --git a/pkgs/build-support/vm/windows/bootstrap.nix b/pkgs/build-support/vm/windows/bootstrap.nix
new file mode 100644
index 0000000000000000000000000000000000000000..47afce5b5a379ebe10b0c9015736615bde57a6b5
--- /dev/null
+++ b/pkgs/build-support/vm/windows/bootstrap.nix
@@ -0,0 +1,83 @@
+{ stdenv, fetchurl, vmTools, writeScript, writeText, runCommand, makeInitrd
+, python, perl, coreutils, dosfstools, gzip, mtools, netcat, openssh, qemu
+, samba, socat, vde2, cdrkit, pathsFromGraph
+}:
+
+{ isoFile, productKey, arch ? null }:
+
+with stdenv.lib;
+
+let
+ controller = import ./controller {
+ inherit stdenv writeScript vmTools makeInitrd;
+ inherit samba vde2 openssh socat netcat coreutils gzip;
+ };
+
+ mkCygwinImage = import ./cygwin-iso {
+ inherit stdenv fetchurl runCommand python perl cdrkit pathsFromGraph;
+ arch = let
+ defaultArch = if stdenv.is64bit then "x86_64" else "i686";
+ in if arch == null then defaultArch else arch;
+ };
+
+ installer = import ./install {
+ inherit controller mkCygwinImage;
+ inherit stdenv runCommand openssh qemu writeText dosfstools mtools;
+ };
+in rec {
+ installedVM = installer {
+ inherit isoFile productKey;
+ };
+
+ runInVM = img: attrs: controller (attrs // {
+ inherit (installedVM) sshKey;
+ qemuArgs = attrs.qemuArgs or [] ++ [
+ "-boot order=c"
+ "-drive file=${img},index=0,media=disk"
+ ];
+ });
+
+ runAndSuspend = let
+ drives = {
+ s = {
+ source = "nixstore";
+ target = "/nix/store";
+ };
+ x = {
+ source = "xchg";
+ target = "/tmp/xchg";
+ };
+ };
+
+ genDriveCmds = letter: { source, target }: [
+ "net use ${letter}: '\\\\192.168.0.2\\${source}' /persistent:yes"
+ "mkdir -p '${target}'"
+ "mount -o bind '/cygdrive/${letter}' '${target}'"
+ "echo '/cygdrive/${letter} ${target} none bind 0 0' >> /etc/fstab"
+ ];
+ in runInVM "winvm.img" {
+ command = concatStringsSep " && " ([
+ "net config server /autodisconnect:-1"
+ ] ++ concatLists (mapAttrsToList genDriveCmds drives));
+ suspendTo = "state.gz";
+ };
+
+ suspendedVM = stdenv.mkDerivation {
+ name = "cygwin-suspended-vm";
+ buildCommand = ''
+ ${qemu}/bin/qemu-img create \
+ -b "${installedVM}/disk.img" \
+ -f qcow2 winvm.img
+ ${runAndSuspend}
+ ensureDir "$out"
+ cp winvm.img "$out/disk.img"
+ cp state.gz "$out/state.gz"
+ '';
+ };
+
+ resumeAndRun = command: runInVM "${suspendedVM}/disk.img" {
+ resumeFrom = "${suspendedVM}/state.gz";
+ qemuArgs = singleton "-snapshot";
+ inherit command;
+ };
+}
diff --git a/pkgs/build-support/vm/windows/controller/default.nix b/pkgs/build-support/vm/windows/controller/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..fe4b5b7f6c2427268c19419348b1810fedb6847d
--- /dev/null
+++ b/pkgs/build-support/vm/windows/controller/default.nix
@@ -0,0 +1,229 @@
+{ stdenv, writeScript, vmTools, makeInitrd
+, samba, vde2, openssh, socat, netcat, coreutils, gzip
+}:
+
+{ sshKey
+, qemuArgs ? []
+, command ? "sync"
+, suspendTo ? null
+, resumeFrom ? null
+, installMode ? false
+}:
+
+with stdenv.lib;
+
+let
+ preInitScript = writeScript "preinit.sh" ''
+ #!${vmTools.initrdUtils}/bin/ash -e
+ export PATH=${vmTools.initrdUtils}/bin
+ mount -t proc none /proc
+ mount -t sysfs none /sys
+ for arg in $(cat /proc/cmdline); do
+ if [ "x''${arg#command=}" != "x$arg" ]; then
+ command="''${arg#command=}"
+ fi
+ done
+
+ for i in $(cat ${modulesClosure}/insmod-list); do
+ insmod $i
+ done
+
+ mkdir -p /dev /fs
+
+ mount -t tmpfs none /dev
+ mknod /dev/null c 1 3
+ mknod /dev/zero c 1 5
+ mknod /dev/random c 1 8
+ mknod /dev/urandom c 1 9
+ mknod /dev/tty c 5 0
+
+ ifconfig lo up
+ ifconfig eth0 up 192.168.0.2
+
+ mount -t tmpfs none /fs
+ mkdir -p /fs/nix/store /fs/xchg /fs/dev /fs/sys /fs/proc /fs/etc /fs/tmp
+
+ mount -o bind /dev /fs/dev
+ mount -t sysfs none /fs/sys
+ mount -t proc none /fs/proc
+
+ mount -t 9p \
+ -o trans=virtio,version=9p2000.L,msize=262144,cache=loose \
+ store /fs/nix/store
+
+ mount -t 9p \
+ -o trans=virtio,version=9p2000.L,msize=262144,cache=loose \
+ xchg /fs/xchg
+
+ echo root:x:0:0::/root:/bin/false > /fs/etc/passwd
+
+ set +e
+ chroot /fs $command $out
+ echo $? > /fs/xchg/in-vm-exit
+
+ poweroff -f
+ '';
+
+ initrd = makeInitrd {
+ contents = singleton {
+ object = preInitScript;
+ symlink = "/init";
+ };
+ };
+
+ shellEscape = x: "'${replaceChars ["'"] [("'\\'" + "'")] x}'";
+
+ loopForever = "while :; do ${coreutils}/bin/sleep 1; done";
+
+ initScript = writeScript "init.sh" (''
+ #!${stdenv.shell}
+ ${coreutils}/bin/cp -L "${sshKey}" /ssh.key
+ ${coreutils}/bin/chmod 600 /ssh.key
+ '' + (if installMode then ''
+ echo -n "Waiting for Windows installation to finish..."
+ while ! ${netcat}/bin/netcat -z 192.168.0.1 22; do
+ echo -n .
+ # Print a dot every 10 seconds only to shorten line length.
+ ${coreutils}/bin/sleep 10
+ done
+ echo " success."
+ # Loop forever, because this VM is going to be killed.
+ ${loopForever}
+ '' else ''
+ ${coreutils}/bin/mkdir -p /etc/samba /etc/samba/private \
+ /var/lib/samba /var/log /var/run
+ ${coreutils}/bin/cat > /etc/samba/smb.conf < saved-env
+ XCHG_DIR="$(${coreutils}/bin/mktemp -d nix-vm.XXXXXXXXXX --tmpdir)"
+ ${coreutils}/bin/mv saved-env "$XCHG_DIR/"
+
+ eval "$preVM"
+
+ QEMU_VDE_SOCKET="$(pwd)/vde.ctl"
+ MONITOR_SOCKET="$(pwd)/monitor"
+ ${vde2}/bin/vde_switch -s "$QEMU_VDE_SOCKET" &
+ echo 'alive?' | ${socat}/bin/socat - \
+ UNIX-CONNECT:$QEMU_VDE_SOCKET/ctl,retry=20
+ '';
+
+ bgBoth = optionalString (suspendTo != null) " &";
+
+ vmExec = if installMode then ''
+ ${vmTools.qemuProg} ${controllerQemuArgs} &
+ ${vmTools.qemuProg} ${cygwinQemuArgs}${bgBoth}
+ '' else ''
+ ${vmTools.qemuProg} ${cygwinQemuArgs} &
+ ${vmTools.qemuProg} ${controllerQemuArgs}${bgBoth}
+ '';
+
+ postVM = if suspendTo != null then ''
+ while ! test -e "$XCHG_DIR/suspend_now"; do sleep 1; done
+ ${socat}/bin/socat - UNIX-CONNECT:$MONITOR_SOCKET < '${suspendTo}'"
+ quit
+ CMD
+ wait %-
+
+ eval "$postVM"
+ exit 0
+ '' else if installMode then ''
+ eval "$postVM"
+ exit 0
+ '' else ''
+ if ! test -e "$XCHG_DIR/in-vm-exit"; then
+ echo "Virtual machine didn't produce an exit code."
+ exit 1
+ fi
+
+ eval "$postVM"
+ exit $(< "$XCHG_DIR/in-vm-exit")
+ '';
+
+in writeScript "run-cygwin-vm.sh" ''
+ #!${stdenv.shell} -e
+ ${preVM}
+ ${vmExec}
+ ${postVM}
+''
diff --git a/pkgs/build-support/vm/windows/cygwin-iso/default.nix b/pkgs/build-support/vm/windows/cygwin-iso/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d9801428a887750cd3890c1d255b5074a6e425cc
--- /dev/null
+++ b/pkgs/build-support/vm/windows/cygwin-iso/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchurl, runCommand, python, perl, cdrkit, pathsFromGraph
+, arch ? "x86_64"
+}:
+
+{ packages ? []
+, mirror ? "http://ftp.gwdg.de/pub/linux/sources.redhat.com/cygwin"
+, extraContents ? []
+}:
+
+let
+ cygPkgList = if arch == "x86_64" then fetchurl {
+ url = "${mirror}/x86_64/setup.ini";
+ sha256 = "0ljsxdkx9s916wp28kcvql3bjx80zzzidan6jicby7i9s3sm96n9";
+ } else fetchurl {
+ url = "${mirror}/x86/setup.ini";
+ sha256 = "1slyj4qha7x649ggwdski9spmyrbs04z2d46vgk8krllg0kppnjv";
+ };
+
+ cygwinCross = (import ../../../../top-level/all-packages.nix {
+ inherit (stdenv) system;
+ crossSystem = {
+ libc = "msvcrt";
+ platform = {};
+ openssl.system = "mingw64";
+ inherit arch;
+ config = "${arch}-w64-mingw32";
+ };
+ }).windows.cygwinSetup.crossDrv;
+
+ makeCygwinClosure = { packages, packageList }: let
+ expr = import (runCommand "cygwin.nix" { buildInputs = [ python ]; } ''
+ python ${./mkclosure.py} "${packages}" ${toString packageList} > "$out"
+ '');
+ gen = { url, md5 }: {
+ source = fetchurl {
+ url = "${mirror}/${url}";
+ inherit md5;
+ };
+ target = url;
+ };
+ in map gen expr;
+
+in import {
+ inherit stdenv perl cdrkit pathsFromGraph;
+ contents = [
+ { source = "${cygwinCross}/bin/setup.exe";
+ target = "setup.exe";
+ }
+ { source = cygPkgList;
+ target = "setup.ini";
+ }
+ ] ++ makeCygwinClosure {
+ packages = cygPkgList;
+ packageList = packages;
+ } ++ extraContents;
+}
diff --git a/pkgs/build-support/vm/windows/cygwin-iso/mkclosure.py b/pkgs/build-support/vm/windows/cygwin-iso/mkclosure.py
new file mode 100644
index 0000000000000000000000000000000000000000..48d569a6bd3e3a43bc591d87e2cf0d36d9100bf8
--- /dev/null
+++ b/pkgs/build-support/vm/windows/cygwin-iso/mkclosure.py
@@ -0,0 +1,78 @@
+# Ugliest Python code I've ever written. -- aszlig
+import sys
+
+def get_plist(path):
+ in_pack = False
+ in_str = False
+ current_key = None
+ buf = ""
+ packages = {}
+ package_name = None
+ package_attrs = {}
+ with open(path, 'r') as setup:
+ for line in setup:
+ if in_str and line.rstrip().endswith('"'):
+ package_attrs[current_key] = buf + line.rstrip()[:-1]
+ in_str = False
+ continue
+ elif in_str:
+ buf += line
+ continue
+
+ if line.startswith('@'):
+ in_pack = True
+ package_name = line[1:].strip()
+ package_attrs = {}
+ elif in_pack and ':' in line:
+ key, value = line.split(':', 1)
+ if value.lstrip().startswith('"'):
+ if value.lstrip()[1:].rstrip().endswith('"'):
+ value = value.strip().strip('"')
+ else:
+ in_str = True
+ current_key = key.strip().lower()
+ buf = value.lstrip()[1:]
+ continue
+ package_attrs[key.strip().lower()] = value.strip()
+ elif in_pack:
+ in_pack = False
+ packages[package_name] = package_attrs
+ return packages
+
+def main():
+ packages = get_plist(sys.argv[1])
+ to_include = set()
+
+ def traverse(package):
+ to_include.add(package)
+ attrs = packages.get(package, {})
+ deps = attrs.get('requires', '').split()
+ for new_dep in set(deps) - to_include:
+ traverse(new_dep)
+
+ map(traverse, sys.argv[2:])
+
+ sys.stdout.write('[\n')
+ for package, attrs in packages.iteritems():
+ if package not in to_include:
+ cats = [c.lower() for c in attrs.get('category', '').split()]
+ if 'base' not in cats:
+ continue
+
+ install_line = attrs.get('install')
+ if install_line is None:
+ continue
+
+ url, size, md5 = install_line.split(' ', 2)
+
+ pack = [
+ ' {',
+ ' url = "{0}";'.format(url),
+ ' md5 = "{0}";'.format(md5),
+ ' }',
+ ];
+ sys.stdout.write('\n'.join(pack) + '\n')
+ sys.stdout.write(']\n')
+
+if __name__ == '__main__':
+ main()
diff --git a/pkgs/build-support/vm/windows/default.nix b/pkgs/build-support/vm/windows/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f9b44d450d996eae9b4d656fcab073b8b79d83a8
--- /dev/null
+++ b/pkgs/build-support/vm/windows/default.nix
@@ -0,0 +1,48 @@
+pkgs:
+
+let
+ bootstrapper = import ./bootstrap.nix {
+ inherit (pkgs) stdenv vmTools writeScript writeText runCommand makeInitrd;
+ inherit (pkgs) coreutils dosfstools gzip mtools netcat openssh qemu samba;
+ inherit (pkgs) socat vde2 fetchurl python perl cdrkit pathsFromGraph;
+ };
+
+ builder = ''
+ source /tmp/xchg/saved-env 2> /dev/null || true
+ export NIX_STORE=/nix/store
+ export NIX_BUILD_TOP=/tmp
+ export TMPDIR=/tmp
+ export PATH=/empty
+ cd "$NIX_BUILD_TOP"
+ exec $origBuilder $origArgs
+ '';
+
+in {
+ runInWindowsVM = drv: let
+ newDrv = drv.override {
+ stdenv = drv.stdenv.override {
+ shell = "/bin/sh";
+ };
+ };
+ in pkgs.lib.overrideDerivation drv (attrs: let
+ bootstrap = bootstrapper attrs.windowsImage;
+ in {
+ requiredSystemFeatures = [ "kvm" ];
+ builder = "${pkgs.stdenv.shell}";
+ args = ["-e" (bootstrap.resumeAndRun builder)];
+ windowsImage = bootstrap.suspendedVM;
+ origArgs = attrs.args;
+ origBuilder = if attrs.builder == attrs.stdenv.shell
+ then "/bin/sh"
+ else attrs.builder;
+
+ postHook = ''
+ PATH=/usr/bin:/bin:/usr/sbin:/sbin
+ SHELL=/bin/sh
+ eval "$origPostHook"
+ '';
+
+ origPostHook = attrs.postHook or "";
+ fixupPhase = ":";
+ });
+}
diff --git a/pkgs/build-support/vm/windows/install/default.nix b/pkgs/build-support/vm/windows/install/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..10690bf6b28778b1c4e0aac2dd7346ac1e3e30e8
--- /dev/null
+++ b/pkgs/build-support/vm/windows/install/default.nix
@@ -0,0 +1,74 @@
+{ stdenv, runCommand, openssh, qemu, controller, mkCygwinImage
+, writeText, dosfstools, mtools
+}:
+
+{ isoFile
+, productKey
+}:
+
+let
+ bootstrapAfterLogin = runCommand "bootstrap.sh" {} ''
+ cat > "$out" < ~/.ssh/authorized_keys <> $out/etc/X11/xkb/symbols/us
- '';
-}
diff --git a/pkgs/data/misc/xkeyboard-config/level3-deadkeys-us-intl b/pkgs/data/misc/xkeyboard-config/level3-deadkeys-us-intl
deleted file mode 100644
index 76905b7b77be3bc4e3274d52d994772199dda119..0000000000000000000000000000000000000000
--- a/pkgs/data/misc/xkeyboard-config/level3-deadkeys-us-intl
+++ /dev/null
@@ -1,95 +0,0 @@
-
-// Grabbed from http://lists.freedesktop.org/archives/xorg/2007-July/026686.html
-// Submitted there by Adriaan van Nijendaal, he says he submitted it to X.org
-// for inclusion, so it should be OK to use it as if it were part of X.org
-
-// The keyboard section in the X-server config file
-// (/etc/X11/xorg.conf on my system) looks like this:
-//
-// Section "InputDevice"
-// Driver "kbd"
-// Identifier "Keyboard[0]"
-// Option "XkbModel" "pc101"
-// Option "XkbLayout" "us"
-// Option "XkbVariant" "altgr-intl"
-// EndSection
-//
-// To be effective, you need to install this file, change the X config
-// file and restart the X-server. Or, alternatively, you can do this
-// run-time:
-//
-// setxkbmap -v -rules xorg -model pc101 -layout us -variant altgr-intl
-//
-// Once the X-server has loaded the new config, a keyboard can be
-// displayed with: (if you change "-ll 1" into "-ll 2", you'll see
-// the special keys ONLY.)
-//
-// xkbcomp -o /tmp/keyboard.xkm -opt cgkst -xkb $DISPLAY
-// xkbprint -o /tmp/keyboard.xkm.ps -kc -nkg 2 -ntg 4 -lg 1 -ll 1 \
-// -lc en_US.iso885915 -level2 -mono -label symbols -w 3 $DISPLAY;
-// gv -seascape /tmp/keyboard.xkm.ps
-// rm -f /tmp/keyboard.xkm.ps /tmp/keyboard.xkm
-//
-
-partial hidden alphanumeric_keys
-xkb_symbols "altgr-intl-rich" {
-
- name[Group1]= "U.S. English - International (AltGr dead keys)";
-
- include "us(basic)"
-
- key { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key { [ 1, exclam, onesuperior, exclamdown ] };
- key { [ 2, at, twosuperior, dead_doubleacute] };
- key { [ 3, numbersign, threesuperior, dead_macron ] };
- key { [ 4, dollar, currency, sterling ] };
- key { [ 5, percent, EuroSign, approxeq ] };
- key { [ 6, asciicircum, dead_circumflex, dead_stroke ] };
- key { [ 7, ampersand, dead_horn ] };
- key { [ 8, asterisk, dead_ogonek, infinity ] };
- key { [ 9, parenleft, leftsinglequotemark,dead_breve ] };
- key { [ 0, parenright,rightsinglequotemark,dead_abovering ] };
- key { [ minus, underscore, yen, dead_belowdot ] };
- key { [ equal, plus, multiply, division ] };
-
- key { [ q, Q, adiaeresis, Adiaeresis ] };
- key { [ w, W, aring, Aring ] };
- key { [ e, E, eacute, Eacute ] };
- key { [ r, R, ediaeresis, Ediaeresis ] };
- key { [ t, T, thorn, THORN ] };
- key { [ y, Y, udiaeresis, Udiaeresis ] };
- key { [ u, U, uacute, Uacute ] };
- key { [ i, I, iacute, Iacute ] };
- key { [ o, O, oacute, Oacute ] };
- key { [ p, P, odiaeresis, Odiaeresis ] };
- key { [ bracketleft, braceleft, guillemotleft, lessthanequal ] };
- key { [ bracketright,braceright, guillemotright, greaterthanequal] };
-
- key { [ a, A, aacute, Aacute ] };
- key { [ s, S, ssharp, section ] };
- key { [ d, D, eth, ETH ] };
- key { [ f, F, union, intersection ] };
- key { [ g, G, eng, ENG ] };
- key { [ h, H, hyphen, nobreakspace ] };
- key { [ j, J, idiaeresis, Idiaeresis ] };
- key { [ k, K ] };
- key { [ l, L, oslash, Ooblique ] };
- key { [semicolon, colon, paragraph, degree ] };
- key { [apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
-
- key { [ z, Z, ae, AE ] };
- key { [ x, X, oe, OE ] };
- key { [ c, C, copyright, cent ] };
- key { [ v, V, registered, trademark ] };
- key { [ b, B, emdash, endash ] };
- key { [ n, N, nu, numerosign ] };
- key { [ m, M, mu, plusminus ] };
- key { [ comma, less, ccedilla, Ccedilla ] };
- key { [ period, greater, dead_abovedot, dead_caron ] };
- key { [ slash, question, questiondown, dead_hook ] };
- key { [backslash, bar, notsign, brokenbar ] };
-
- // Let's have free choice
- //include "level3(ralt_switch)"
-};
-
diff --git a/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl-ns/default.nix b/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl-ns/default.nix
index c143ce1669833f4affe2a35dd7b1025051add6b0..bfe454a49fe1a739a8a0276ef24e8ee6a0213db0 100644
--- a/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl-ns/default.nix
+++ b/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl-ns/default.nix
@@ -1,11 +1,11 @@
{stdenv, fetchurl}:
stdenv.mkDerivation rec {
- name = "docbook-xsl-ns-1.75.2";
+ name = "docbook-xsl-ns-1.78.1";
src = fetchurl {
url = "mirror://sourceforge/docbook/${name}.tar.bz2";
- sha256 = "1pr7m0hmqilk25hjx33kq2vqn2xf6cx6zhxqm35fdvnjccazlxg2";
+ sha256 = "1x3sc0axk9z3i6n0jhlsmzlmb723a4sjgslm9g12by6phirdx3ng";
};
buildPhase = "true";
diff --git a/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix b/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix
index c54d8f304b6286284810160b28dc4ee3c76d6789..981aa59369de34e579104c17d4939495f57e1cb7 100644
--- a/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix
+++ b/pkgs/data/sgml+xml/stylesheets/xslt/docbook-xsl/default.nix
@@ -1,10 +1,10 @@
{stdenv, fetchurl}:
stdenv.mkDerivation {
- name = "docbook-xsl-1.72.0";
+ name = "docbook-xsl-1.78.1";
builder = ./builder.sh;
src = fetchurl {
- url = mirror://sourceforge/docbook/docbook-xsl-1.72.0.tar.bz2;
- sha256 = "1cnrfgqz8pc9wnlgqjch2338ad7jki6d4h6b2fhaxn1a2201df5k";
+ url = mirror://sourceforge/docbook/docbook-xsl-1.78.1.tar.bz2;
+ sha256 = "0rxl013ncmz1n6ymk2idvx3hix9pdabk8xn01cpcv32wmfb753y9";
};
}
diff --git a/pkgs/desktops/cinnamon/automount-plugin.patch b/pkgs/desktops/cinnamon/automount-plugin.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3d90da99f08883c622f25f027e6b1ca983d27068
--- /dev/null
+++ b/pkgs/desktops/cinnamon/automount-plugin.patch
@@ -0,0 +1,448 @@
+
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/data/org.cinnamon.settings-daemon.plugins.gschema.xml.in.in cinnamon-settings-daemon-2.0.1/data/org.cinnamon.settings-daemon.plugins.gschema.xml.in.in
+--- cinnamon-settings-daemon-2.0.6.orig/data/org.cinnamon.settings-daemon.plugins.gschema.xml.in.in 2013-11-03 10:50:04.000000000 -0500
++++ cinnamon-settings-daemon-2.0.6/data/org.cinnamon.settings-daemon.plugins.gschema.xml.in.in 2013-11-05 15:33:21.112912392 -0500
+@@ -2,6 +2,7 @@
+
+
+
++
+
+
+
+@@ -42,6 +43,18 @@
+ <_summary>Priority to use for this plugin
+ <_description>Priority to use for this plugin in cinnamon-settings-daemon startup queue
+
++
++
++
++ true
++ <_summary>Activation of this plugin
++ <_description>Whether this plugin would be activated by cinnamon-settings-daemon or not
++
++
++ 97
++ <_summary>Priority to use for this plugin
++ <_description>Priority to use for this plugin in cinnamon-settings-daemon startup queue
++
+
+
+
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/automount.cinnamon-settings-plugin.in cinnamon-settings-daemon-2.0.1/plugins/automount/automount.cinnamon-settings-plugin.in
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/automount.cinnamon-settings-plugin.in 1970-01-01 01:00:00.000000000 +0100
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/automount.cinnamon-settings-plugin.in 2013-10-08 22:35:10.771472456 +0200
+@@ -0,0 +1,8 @@
++[Cinnamon Settings Plugin]
++Module=automount
++IAge=0
++_Name=Automount
++_Description=Automounter plugin
++Authors=Tomas Bzatek
++Copyright=Copyright © 2010 Red Hat, Inc.
++Website=
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/cinnamon-fallback-mount-helper.c cinnamon-settings-daemon-2.0.1/plugins/automount/cinnamon-fallback-mount-helper.c
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/cinnamon-fallback-mount-helper.c 2013-10-02 16:13:56.000000000 +0200
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/cinnamon-fallback-mount-helper.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,65 +0,0 @@
+-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+- *
+- * Copyright (C) 2010 Red Hat, Inc.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+- *
+- * Author: Tomas Bzatek
+- */
+-
+-#include "config.h"
+-
+-#include
+-#include
+-#include
+-#include
+-
+-#include "csd-automount-manager.h"
+-
+-int
+-main (int argc,
+- char **argv)
+-{
+- GMainLoop *loop;
+- CsdAutomountManager *manager;
+- GError *error = NULL;
+-
+- g_type_init ();
+- gtk_init (&argc, &argv);
+-
+- bindtextdomain (GETTEXT_PACKAGE, CINNAMON_SETTINGS_LOCALEDIR);
+- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+- textdomain (GETTEXT_PACKAGE);
+-
+- loop = g_main_loop_new (NULL, FALSE);
+- manager = csd_automount_manager_new ();
+-
+- csd_automount_manager_start (manager, &error);
+-
+- if (error != NULL) {
+- g_printerr ("Unable to start the mount manager: %s",
+- error->message);
+-
+- g_error_free (error);
+- _exit (1);
+- }
+-
+- g_main_loop_run (loop);
+-
+- csd_automount_manager_stop (manager);
+- g_main_loop_unref (loop);
+-
+- return 0;
+-}
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/cinnamon-fallback-mount-helper.desktop.in.in cinnamon-settings-daemon-2.0.1/plugins/automount/cinnamon-fallback-mount-helper.desktop.in.in
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/cinnamon-fallback-mount-helper.desktop.in.in 2013-10-02 16:13:56.000000000 +0200
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/cinnamon-fallback-mount-helper.desktop.in.in 1970-01-01 01:00:00.000000000 +0100
+@@ -1,12 +0,0 @@
+-[Desktop Entry]
+-_Name=Mount Helper
+-_Comment=Automount and autorun plugged devices
+-Exec=@LIBEXECDIR@/cinnamon-fallback-mount-helper
+-Icon=drive-optical
+-Terminal=false
+-Type=Application
+-Categories=
+-NoDisplay=true
+-OnlyShowIn=GNOME;
+-X-GNOME-Autostart-Notify=true
+-
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/csd-automount-plugin.c cinnamon-settings-daemon-2.0.1/plugins/automount/csd-automount-plugin.c
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/csd-automount-plugin.c 1970-01-01 01:00:00.000000000 +0100
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/csd-automount-plugin.c 2013-10-08 22:35:10.771472456 +0200
+@@ -0,0 +1,106 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2010 Red Hat, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Author: Tomas Bzatek
++ */
++
++#include "config.h"
++
++#include
++#include
++
++#include "cinnamon-settings-plugin.h"
++#include "csd-automount-plugin.h"
++#include "csd-automount-manager.h"
++
++struct CsdAutomountPluginPrivate {
++ CsdAutomountManager *manager;
++};
++
++#define CSD_AUTOMOUNT_PLUGIN_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), CSD_TYPE_AUTOMOUNT_PLUGIN, CsdAutomountPluginPrivate))
++
++CINNAMON_SETTINGS_PLUGIN_REGISTER (CsdAutomountPlugin, csd_automount_plugin)
++
++static void
++csd_automount_plugin_init (CsdAutomountPlugin *plugin)
++{
++ plugin->priv = CSD_AUTOMOUNT_PLUGIN_GET_PRIVATE (plugin);
++
++ g_debug ("Automount plugin initializing");
++
++ plugin->priv->manager = csd_automount_manager_new ();
++}
++
++static void
++csd_automount_plugin_finalize (GObject *object)
++{
++ CsdAutomountPlugin *plugin;
++
++ g_return_if_fail (object != NULL);
++ g_return_if_fail (CSD_IS_AUTOMOUNT_PLUGIN (object));
++
++ g_debug ("Automount plugin finalizing");
++
++ plugin = CSD_AUTOMOUNT_PLUGIN (object);
++
++ g_return_if_fail (plugin->priv != NULL);
++
++ if (plugin->priv->manager != NULL) {
++ g_object_unref (plugin->priv->manager);
++ }
++
++ G_OBJECT_CLASS (csd_automount_plugin_parent_class)->finalize (object);
++}
++
++static void
++impl_activate (CinnamonSettingsPlugin *plugin)
++{
++ gboolean res;
++ GError *error;
++
++ g_debug ("Activating automount plugin");
++
++ error = NULL;
++ res = csd_automount_manager_start (CSD_AUTOMOUNT_PLUGIN (plugin)->priv->manager, &error);
++ if (! res) {
++ g_warning ("Unable to start automount manager: %s", error->message);
++ g_error_free (error);
++ }
++}
++
++static void
++impl_deactivate (CinnamonSettingsPlugin *plugin)
++{
++ g_debug ("Deactivating automount plugin");
++ csd_automount_manager_stop (CSD_AUTOMOUNT_PLUGIN (plugin)->priv->manager);
++}
++
++static void
++csd_automount_plugin_class_init (CsdAutomountPluginClass *klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++ CinnamonSettingsPluginClass *plugin_class = CINNAMON_SETTINGS_PLUGIN_CLASS (klass);
++
++ object_class->finalize = csd_automount_plugin_finalize;
++
++ plugin_class->activate = impl_activate;
++ plugin_class->deactivate = impl_deactivate;
++
++ g_type_class_add_private (klass, sizeof (CsdAutomountPluginPrivate));
++}
++
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/csd-automount-plugin.h cinnamon-settings-daemon-2.0.1/plugins/automount/csd-automount-plugin.h
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/csd-automount-plugin.h 1970-01-01 01:00:00.000000000 +0100
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/csd-automount-plugin.h 2013-10-08 22:35:10.771472456 +0200
+@@ -0,0 +1,60 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2010 Red Hat, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Author: Tomas Bzatek
++ */
++
++#ifndef __CSD_AUTOMOUNT_PLUGIN_H__
++#define __CSD_AUTOMOUNT_PLUGIN_H__
++
++#include
++#include
++#include
++
++#include "cinnamon-settings-plugin.h"
++
++G_BEGIN_DECLS
++
++#define CSD_TYPE_AUTOMOUNT_PLUGIN (csd_automount_plugin_get_type ())
++#define CSD_AUTOMOUNT_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CSD_TYPE_AUTOMOUNT_PLUGIN, CsdAutomountPlugin))
++#define CSD_AUTOMOUNT_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CSD_TYPE_AUTOMOUNT_PLUGIN, CsdAutomountPluginClass))
++#define CSD_IS_AUTOMOUNT_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CSD_TYPE_AUTOMOUNT_PLUGIN))
++#define CSD_IS_AUTOMOUNT_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CSD_TYPE_AUTOMOUNT_PLUGIN))
++#define CSD_AUTOMOUNT_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CSD_TYPE_AUTOMOUNT_PLUGIN, CsdAutomountPluginClass))
++
++typedef struct CsdAutomountPluginPrivate CsdAutomountPluginPrivate;
++
++typedef struct
++{
++ CinnamonSettingsPlugin parent;
++ CsdAutomountPluginPrivate *priv;
++} CsdAutomountPlugin;
++
++typedef struct
++{
++ CinnamonSettingsPluginClass parent_class;
++} CsdAutomountPluginClass;
++
++GType csd_automount_plugin_get_type (void) G_GNUC_CONST;
++
++/* All the plugins must implement this function */
++G_MODULE_EXPORT GType register_cinnamon_settings_plugin (GTypeModule *module);
++
++G_END_DECLS
++
++#endif /* __CSD_AUTOMOUNT_PLUGIN_H__ */
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/Makefile.am cinnamon-settings-daemon-2.0.1/plugins/automount/Makefile.am
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/Makefile.am 2013-10-02 16:13:56.000000000 +0200
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/Makefile.am 2013-10-08 22:48:19.240865461 +0200
+@@ -1,38 +1,87 @@
+-libexec_PROGRAMS = cinnamon-fallback-mount-helper
++NULL =
+
+-cinnamon_fallback_mount_helper_SOURCES = \
+- cinnamon-fallback-mount-helper.c \
+- csd-automount-manager.c \
+- csd-automount-manager.h \
+- csd-autorun.c \
+- csd-autorun.h
++plugin_name = automount
+
+-cinnamon_fallback_mount_helper_CPPFLAGS = \
++libexec_PROGRAMS = csd-test-automount
++
++csd_test_automount_SOURCES = \
++ test-automount.c \
++ csd-automount-manager.h \
++ csd-automount-manager.c \
++ csd-autorun.c \
++ csd-autorun.h \
++ $(NULL)
++
++csd_test_automount_CPPFLAGS = \
+ -I$(top_srcdir)/cinnamon-settings-daemon \
++ -I$(top_srcdir)/plugins/common \
+ -DCINNAMON_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
+ $(AM_CPPFLAGS)
+
+-cinnamon_fallback_mount_helper_CFLAGS = \
++csd_test_automount_CFLAGS = \
++ $(PLUGIN_CFLAGS) \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+ $(SYSTEMD_CFLAGS) \
+ $(AUTOMOUNT_CFLAGS)
++ $(AM_CFLAGS)
++
++csd_test_automount_LDADD = \
++ $(top_builddir)/cinnamon-settings-daemon/libcsd.la \
++ $(SETTINGS_PLUGIN_LIBS) \
++ $(SYSTEMD_LIBS) \
++ $(AUTOMOUNT_LIBS) \
++ $(NULL)
++
++plugin_LTLIBRARIES = \
++ libautomount.la \
++ $(NULL)
++
++libautomount_la_SOURCES = \
++ csd-automount-plugin.h \
++ csd-automount-plugin.c \
++ csd-automount-manager.h \
++ csd-automount-manager.c \
++ csd-autorun.c \
++ csd-autorun.h \
++ $(NULL)
++
++libautomount_la_CPPFLAGS = \
++ -I$(top_srcdir)/cinnamon-settings-daemon \
++ -DCINNAMON_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
++ $(AM_CPPFLAGS)
++
++libautomount_la_CFLAGS = \
++ $(SETTINGS_PLUGIN_CFLAGS) \
++ $(SYSTEMD_CFLAGS) \
++ $(AUTOMOUNT_CFLAGS) \
++ $(AM_CFLAGS)
++
++libautomount_la_LDFLAGS = \
++ $(CSD_PLUGIN_LDFLAGS) \
++ $(NULL)
+
+-cinnamon_fallback_mount_helper_LDADD = \
++libautomount_la_LIBADD = \
+ $(SETTINGS_PLUGIN_LIBS) \
+ $(SYSTEMD_LIBS) \
+ $(AUTOMOUNT_LIBS) \
+- $(top_builddir)/cinnamon-settings-daemon/libcsd.la
++ $(NULL)
+
+-autostartdir = $(datadir)/applications
+-autostart_in_files = cinnamon-fallback-mount-helper.desktop.in
+-autostart_in_in_files = cinnamon-fallback-mount-helper.desktop.in.in
+-autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
++plugin_in_files = \
++ automount.cinnamon-settings-plugin.in \
++ $(NULL)
+
+-$(autostart_in_files): $(autostart_in_in_files)
+- @sed -e "s|\@LIBEXECDIR\@|$(libexecdir)|" $< > $@
++plugin_DATA = $(plugin_in_files:.cinnamon-settings-plugin.in=.cinnamon-settings-plugin)
+
+-@INTLTOOL_DESKTOP_RULE@
++EXTRA_DIST = \
++ $(plugin_in_files) \
++ $(NULL)
+
+-EXTRA_DIST = $(autostart_in_in_files)
++CLEANFILES = \
++ $(plugin_DATA) \
++ $(NULL)
+
+-CLEANFILES = $(autostart_DATA) $(autostart_in_files)
++DISTCLEANFILES = \
++ $(plugin_DATA) \
++ $(NULL)
++
++@CSD_INTLTOOL_PLUGIN_RULE@
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/plugins/automount/test-automount.c cinnamon-settings-daemon-2.0.1/plugins/automount/test-automount.c
+--- cinnamon-settings-daemon-2.0.1.orig/plugins/automount/test-automount.c 1970-01-01 01:00:00.000000000 +0100
++++ cinnamon-settings-daemon-2.0.1/plugins/automount/test-automount.c 2013-10-08 22:42:53.759486525 +0200
+@@ -0,0 +1,7 @@
++#define NEW csd_automount_manager_new
++#define START csd_automount_manager_start
++#define STOP csd_automount_manager_stop
++#define MANAGER CsdAutomountManager
++#include "csd-automount-manager.h"
++
++#include "test-plugin.h"
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/po/POTFILES.in cinnamon-settings-daemon-2.0.1/po/POTFILES.in
+--- cinnamon-settings-daemon-2.0.1.orig/po/POTFILES.in 2013-10-02 16:13:56.000000000 +0200
++++ cinnamon-settings-daemon-2.0.1/po/POTFILES.in 2013-10-08 22:35:10.771472456 +0200
+@@ -18,8 +18,9 @@
+ plugins/a11y-keyboard/csd-a11y-preferences-dialog.c
+ [type: gettext/glade]plugins/a11y-keyboard/csd-a11y-preferences-dialog.ui
+ [type: gettext/ini]plugins/a11y-settings/a11y-settings.cinnamon-settings-plugin.in
+-plugins/automount/cinnamon-fallback-mount-helper.desktop.in.in
++[type: gettext/ini]plugins/automount/automount.cinnamon-settings-plugin.in
+ plugins/automount/csd-automount-manager.c
++plugins/automount/csd-automount-plugin.c
+ plugins/automount/csd-autorun.c
+ [type: gettext/ini]plugins/background/background.cinnamon-settings-plugin.in
+ [type: gettext/ini]plugins/clipboard/clipboard.cinnamon-settings-plugin.in
+diff -Naur cinnamon-settings-daemon-2.0.1.orig/po/POTFILES.skip cinnamon-settings-daemon-2.0.1/po/POTFILES.skip
+--- cinnamon-settings-daemon-2.0.1.orig/po/POTFILES.skip 2013-10-02 16:13:56.000000000 +0200
++++ cinnamon-settings-daemon-2.0.1/po/POTFILES.skip 2013-10-08 22:37:20.224645009 +0200
+@@ -20,6 +20,5 @@
+ data/org.cinnamon.settings-daemon.plugins.updates.gschema.xml.in
+ data/org.cinnamon.settings-daemon.plugins.xrandr.gschema.xml.in
+ data/org.cinnamon.settings-daemon.plugins.xsettings.gschema.xml.in
+-plugins/automount/gnome-fallback-mount-helper.desktop.in
+ plugins/power/org.cinnamon.settings-daemon.plugins.power.policy.in
+ plugins/wacom/org.cinnamon.settings-daemon.plugins.wacom.policy.in
diff --git a/pkgs/desktops/cinnamon/cinnamon-control-center.nix b/pkgs/desktops/cinnamon/cinnamon-control-center.nix
new file mode 100644
index 0000000000000000000000000000000000000000..ab2f389b4f5fa53eeb5a97fda974fb96d418abe7
--- /dev/null
+++ b/pkgs/desktops/cinnamon/cinnamon-control-center.nix
@@ -0,0 +1,40 @@
+
+{ stdenv, fetchurl, pkgconfig, autoreconfHook, glib, gettext, gnome_common, cinnamon-desktop, intltool, libxslt, gtk3, libnotify,
+gnome-menus, libxml2, systemd, upower, cinnamon-settings-daemon, colord, polkit, ibus, libcanberra_gtk3, pulseaudio, isocodes, krb5,
+libxkbfile}:
+
+let
+ version = "2.0.9";
+in
+stdenv.mkDerivation {
+ name = "cinnamon-control-center-${version}";
+
+ src = fetchurl {
+ url = "http://github.com/linuxmint/cinnamon-control-center/archive/${version}.tar.gz";
+ sha256 = "0kivqdgsf8w257j2ja6fap0dpvljcnb9gphr3knp7y6ma2d1gfv3";
+ };
+
+ configureFlags = "--enable-systemd --disable-update-mimedb" ;
+
+ patches = [ ./region.patch];
+
+ buildInputs = [
+ pkgconfig autoreconfHook
+ glib gettext gnome_common
+ intltool libxslt gtk3 cinnamon-desktop
+ libnotify gnome-menus libxml2 systemd
+ upower cinnamon-settings-daemon colord
+ polkit ibus libcanberra_gtk3 pulseaudio
+ isocodes krb5 libxkbfile ];
+
+ preBuild = "patchShebangs ./scripts";
+
+ meta = {
+ homepage = "http://cinnamon.linuxmint.com";
+ description = "The cinnamon session files" ;
+
+ platforms = stdenv.lib.platforms.linux;
+ maintainers = [ stdenv.lib.maintainers.roelof ];
+ };
+}
+
diff --git a/pkgs/desktops/cinnamon/cinnamon-desktop.nix b/pkgs/desktops/cinnamon/cinnamon-desktop.nix
index e158b48988401c11a1d860113c01918b41a46dea..d3cf04e835d16a19d5eb2f1b281b2e5ad7187b64 100644
--- a/pkgs/desktops/cinnamon/cinnamon-desktop.nix
+++ b/pkgs/desktops/cinnamon/cinnamon-desktop.nix
@@ -22,10 +22,6 @@ stdenv.mkDerivation {
xkeyboard_config libxkbfile libX11 libXrandr libXext
];
- postInstall = ''
- ${glib}/bin/glib-compile-schemas $out/share/glib-2.0/schemas/
- '';
-
meta = {
homepage = "http://cinnamon.linuxmint.com";
description = "Library and data for various Cinnamon modules";
diff --git a/pkgs/desktops/cinnamon/cinnamon-session.nix b/pkgs/desktops/cinnamon/cinnamon-session.nix
index 850dd4e6c5af986b573d5e41fbbded1047dc85f0..534fa11f0467baa6ce15b70cc50b720242546a66 100644
--- a/pkgs/desktops/cinnamon/cinnamon-session.nix
+++ b/pkgs/desktops/cinnamon/cinnamon-session.nix
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
};
- configureFlags = "--disable-schemas-compile --enable-systemd --disable-gconf" ;
+ configureFlags = "--enable-systemd --disable-gconf" ;
patches = [ ./remove-sessionmigration.patch ./timeout.patch];
@@ -23,17 +23,17 @@ stdenv.mkDerivation {
gtk3 dbus_glib upower json_glib
intltool systemd xorg.xtrans
makeWrapper
+ cinnamon-desktop/*gschemas*/
];
preBuild = "patchShebangs ./scripts";
- postInstall = ''
- ${glib}/bin/glib-compile-schemas $out/share/glib-2.0/schemas/
+ postFixup = ''
rm $out/share/icons/hicolor/icon-theme.cache
for f in "$out"/bin/*; do
- wrapProgram "$f" --prefix XDG_DATA_DIRS : "$out/share:${cinnamon-desktop}/share"
+ wrapProgram "$f" --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
done
'';
diff --git a/pkgs/desktops/cinnamon/cinnamon-settings-daemon.nix b/pkgs/desktops/cinnamon/cinnamon-settings-daemon.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c397a9758e2c47f7eb2fc70a0012ce0ed5ba9830
--- /dev/null
+++ b/pkgs/desktops/cinnamon/cinnamon-settings-daemon.nix
@@ -0,0 +1,52 @@
+
+{ stdenv, fetchurl, pkgconfig, autoreconfHook, glib, gettext, gnome_common, cinnamon-desktop, intltool, gtk3,
+libnotify, lcms2, libxklavier, libgnomekbd, libcanberra, pulseaudio, upower, libcanberra_gtk3, colord,
+systemd, libxslt, docbook_xsl, makeWrapper, gsettings_desktop_schemas}:
+
+let
+ version = "2.0.10";
+in
+stdenv.mkDerivation {
+ name = "cinnamon-settings-daemon-${version}";
+
+ src = fetchurl {
+ url = "http://github.com/linuxmint/cinnamon-settings-daemon/archive/${version}.tar.gz";
+ sha256 = "10r75xsngb7ipv9fy07dyfb256bqybzcxbwny60sgjhrksk3v9mg";
+ };
+
+ NIX_CFLAGS_COMPILE = "-I${glib}/include/gio-unix-2.0";
+
+ configureFlags = "--enable-systemd" ;
+
+ patches = [ ./systemd-support.patch ./automount-plugin.patch ./dpms.patch];
+
+ buildInputs = [
+ pkgconfig autoreconfHook
+ glib gettext gnome_common
+ intltool gtk3 libnotify lcms2
+ libgnomekbd libxklavier colord
+ libcanberra pulseaudio upower
+ libcanberra_gtk3 cinnamon-desktop
+ systemd libxslt docbook_xsl makeWrapper
+ gsettings_desktop_schemas
+ ];
+
+ preBuild = "patchShebangs ./scripts";
+
+ #ToDo: missing org.cinnamon.gschema.xml, probably not packaged yet
+ postFixup = ''
+ for f in "$out"/libexec/*; do
+ wrapProgram "$f" --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
+ done
+ '';
+
+
+ meta = {
+ homepage = "http://cinnamon.linuxmint.com";
+ description = "The cinnamon session files" ;
+
+ platforms = stdenv.lib.platforms.linux;
+ maintainers = [ stdenv.lib.maintainers.roelof ];
+ };
+}
+
diff --git a/pkgs/desktops/cinnamon/dpms.patch b/pkgs/desktops/cinnamon/dpms.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a73f33dc61820189be3474ad5ba9b41fc7aa7f30
--- /dev/null
+++ b/pkgs/desktops/cinnamon/dpms.patch
@@ -0,0 +1,30 @@
+
+-- a/plugins/power/csd-power-manager.c
++++ b/plugins/power/csd-power-manager.c
+@@ -33,6 +33,8 @@
+ #include
+ #include
+
++#include
++
+ #define GNOME_DESKTOP_USE_UNSTABLE_API
+ #include
+
+@@ -3967,6 +3790,17 @@ csd_power_manager_start (CsdPowerManager
+ /* set the initial dim time that can adapt for the user */
+ refresh_idle_dim_settings (manager);
+
++ /* Make sure that Xorg's DPMS extension never gets in our way. The defaults seem to have changed in Xorg 1.14
++ * being "0" by default to being "600" by default
++ * https://bugzilla.gnome.org/show_bug.cgi?id=709114
++ */
++ gdk_error_trap_push ();
++ int dummy;
++ if (DPMSQueryExtension(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &dummy, &dummy)) {
++ DPMSSetTimeouts (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), 0, 0, 0);
++ }
++ gdk_error_trap_pop_ignored ();
++
+ manager->priv->xscreensaver_watchdog_timer_id = g_timeout_add_seconds (XSCREENSAVER_WATCHDOG_TIMEOUT,
+ disable_builtin_screensaver,
+ NULL);
diff --git a/pkgs/desktops/cinnamon/gtkdoc.patch b/pkgs/desktops/cinnamon/gtkdoc.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6398306a76ae72057b51507323512fc72f179973
--- /dev/null
+++ b/pkgs/desktops/cinnamon/gtkdoc.patch
@@ -0,0 +1,41 @@
+--- a/src/meta/prefs.h
++++ b/src/meta/prefs.h
+@@ -310,13 +310,13 @@ typedef struct
+ */
+ GSList *bindings;
+
+- /** for keybindings that can have shift or not like Alt+Tab */
++ /* for keybindings that can have shift or not like Alt+Tab */
+ gboolean add_shift:1;
+
+- /** for keybindings that apply only to a window */
++ /* for keybindings that apply only to a window */
+ gboolean per_window:1;
+
+- /** for keybindings not added with meta_display_add_keybinding() */
++ /* for keybindings not added with meta_display_add_keybinding() */
+ gboolean builtin:1;
+ } MetaKeyPref;
+
+@@ -339,5 +339,3 @@ CDesktopVisualBellType meta_prefs_get_vi
+ MetaPlacementMode meta_prefs_get_placement_mode (void);
+
+ #endif
+-
+-
+--- a/src/core/workspace.c
++++ b/src/core/workspace.c
+@@ -194,7 +194,7 @@ meta_workspace_new (MetaScreen *screen)
+ return workspace;
+ }
+
+-/** Foreach function for workspace_free_struts() */
++/* Foreach function for workspace_free_struts() */
+ static void
+ free_this (gpointer candidate, gpointer dummy)
+ {
+@@ -1390,4 +1390,3 @@ meta_workspace_get_screen (MetaWorkspace
+ {
+ return workspace->screen;
+ }
+-
diff --git a/pkgs/desktops/cinnamon/keyboard.patch b/pkgs/desktops/cinnamon/keyboard.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f67d961ff58f6785515d2bff9014bd9c7942ad9e
--- /dev/null
+++ b/pkgs/desktops/cinnamon/keyboard.patch
@@ -0,0 +1,4729 @@
+
+diff -uNrp a/cinnamon-settings-daemon/main.c b/cinnamon-settings-daemon/main.c
+--- a/cinnamon-settings-daemon/main.c 2013-08-24 18:04:31.000000000 +0100
++++ b/cinnamon-settings-daemon/main.c 2013-08-25 16:36:02.000000000 +0100
+@@ -319,6 +319,29 @@ set_legacy_ibus_env_vars (GDBusProxy *pr
+ }
+ #endif
+
++static void
++got_session_proxy (GObject *source_object,
++ GAsyncResult *res,
++ gpointer user_data)
++{
++ GDBusProxy *proxy;
++ GError *error = NULL;
++
++ proxy = g_dbus_proxy_new_finish (res, &error);
++ if (proxy == NULL) {
++ g_debug ("Could not connect to the Session manager: %s", error->message);
++ g_error_free (error);
++ } else {
++ set_locale (proxy);
++#ifdef HAVE_IBUS
++ /* This will register with cinnamon-session after calling Setenv. */
++ set_legacy_ibus_env_vars (proxy);
++#else
++ register_with_gnome_session (proxy);
++#endif
++ }
++}
++
+ static gboolean
+ on_term_signal_pipe_closed (GIOChannel *source,
+ GIOCondition condition,
+@@ -368,6 +391,16 @@ set_session_over_handler (GDBusConnectio
+ {
+ g_assert (bus != NULL);
+
++ g_dbus_proxy_new (bus,
++ G_DBUS_PROXY_FLAGS_NONE,
++ NULL,
++ GNOME_SESSION_DBUS_NAME,
++ GNOME_SESSION_DBUS_OBJECT,
++ GNOME_SESSION_DBUS_INTERFACE,
++ NULL,
++ (GAsyncReadyCallback) got_session_proxy,
++ NULL);
++
+ watch_for_term_signal (manager);
+ }
+
+@@ -390,56 +423,6 @@ name_lost_handler (GDBusConnection *conn
+ gtk_main_quit ();
+ }
+
+-static gboolean
+-do_register_client (gpointer user_data)
+-{
+- GDBusProxy *proxy = (GDBusProxy *) user_data;
+- g_assert (proxy != NULL);
+-
+- const char *startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+- g_dbus_proxy_call (proxy,
+- "RegisterClient",
+- g_variant_new ("(ss)", "cinnamon-settings-daemon", startup_id ? startup_id : ""),
+- G_DBUS_CALL_FLAGS_NONE,
+- -1,
+- NULL,
+- (GAsyncReadyCallback) on_client_registered,
+- manager);
+-
+- return FALSE;
+-}
+-
+-static void
+-queue_register_client (void)
+-{
+- GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+- if (!bus)
+- return;
+-
+- GError *error = NULL;
+- GDBusProxy *proxy = g_dbus_proxy_new_sync (bus,
+- G_DBUS_PROXY_FLAGS_NONE,
+- NULL,
+- GNOME_SESSION_DBUS_NAME,
+- GNOME_SESSION_DBUS_OBJECT,
+- GNOME_SESSION_DBUS_INTERFACE,
+- NULL,
+- &error);
+- g_object_unref (bus);
+-
+- if (proxy == NULL) {
+- g_debug ("Could not connect to the Session manager: %s", error->message);
+- g_error_free (error);
+- return;
+- }
+-
+- /* Register the daemon with cinnamon-session */
+- g_signal_connect (G_OBJECT (proxy), "g-signal",
+- G_CALLBACK (on_session_over), NULL);
+-
+- g_idle_add_full (G_PRIORITY_DEFAULT, do_register_client, proxy, NULL);
+-}
+-
+ static void
+ bus_register (void)
+ {
+@@ -541,8 +524,6 @@ main (int argc, char *argv[])
+
+ notify_init ("cinnamon-settings-daemon");
+
+- queue_register_client ();
+-
+ bus_register ();
+
+ cinnamon_settings_profile_start ("cinnamon_settings_manager_new");
+diff -uNrp a/configure.ac b/configure.ac
+--- a/configure.ac 2013-08-24 18:04:31.000000000 +0100
++++ b/configure.ac 2013-08-25 16:36:02.000000000 +0100
+@@ -53,6 +53,7 @@ UPOWER_GLIB_REQUIRED_VERSION=0.9.1
+ PA_REQUIRED_VERSION=0.9.16
+ UPOWER_REQUIRED_VERSION=0.9.11
+ GTK_XINPUT_2_3_VERSION=3.7.8
++IBUS_REQUIRED_VERSION=1.4.2
+
+ #EXTRA_COMPILE_WARNINGS(yes)
+
+@@ -199,8 +200,21 @@ dnl ------------------------------------
+ dnl - Keyboard plugin stuff
+ dnl ---------------------------------------------------------------------------
+
+-LIBGNOMEKBD_REQUIRED=2.91.1
+-PKG_CHECK_MODULES(KEYBOARD, [libgnomekbdui >= $LIBGNOMEKBD_REQUIRED libgnomekbd >= $LIBGNOMEKBD_REQUIRED libxklavier >= 5.0 kbproto])
++AC_ARG_ENABLE(ibus,
++ AS_HELP_STRING([--disable-ibus],
++ [Disable IBus support]),
++ enable_ibus=$enableval,
++ enable_ibus=yes)
++
++if test "x$enable_ibus" = "xyes" ; then
++ IBUS_MODULE="ibus-1.0 >= $IBUS_REQUIRED_VERSION"
++ AC_DEFINE(HAVE_IBUS, 1, [Defined if IBus support is enabled])
++else
++ IBUS_MODULE=
++fi
++AM_CONDITIONAL(HAVE_IBUS, test "x$enable_ibus" == "xyes")
++
++PKG_CHECK_MODULES(KEYBOARD, xkbfile $IBUS_MODULE cinnamon-desktop >= $CINNAMON_DESKTOP_REQUIRED_VERSION)
+
+ dnl ---------------------------------------------------------------------------
+ dnl - Housekeeping plugin stuff
+diff -uNrp a/data/org.cinnamon.settings-daemon.plugins.media-keys.gschema.xml.in.in b/data/org.cinnamon.settings-daemon.plugins.media-keys.gschema.xml.in.in
+--- a/data/org.cinnamon.settings-daemon.plugins.media-keys.gschema.xml.in.in 2013-08-24 18:04:31.000000000 +0100
++++ b/data/org.cinnamon.settings-daemon.plugins.media-keys.gschema.xml.in.in 2013-08-25 16:36:02.000000000 +0100
+@@ -175,6 +175,15 @@
+ <_summary>Magnifier zoom out
+ <_description>Binding for the magnifier to zoom out
+
++
++ ''
++ <_summary>Switch input source
++ <_description>Binding to select the next input source
++
++
++ ''
++ <_summary>Switch input source backward
++ <_description>Binding to select the previous input source
++
+
+-
+-
++
+\ No newline at end of file
+diff -uNrp a/plugins/keyboard/csd-keyboard-manager.c b/plugins/keyboard/csd-keyboard-manager.c
+--- a/plugins/keyboard/csd-keyboard-manager.c 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/csd-keyboard-manager.c 2013-08-25 16:36:02.000000000 +0100
+@@ -40,19 +40,22 @@
+
+ #include
+ #include
++#include
++
++#define GNOME_DESKTOP_USE_UNSTABLE_API
++#include
++
++#ifdef HAVE_IBUS
++#include
++#endif
+
+ #include "cinnamon-settings-profile.h"
+ #include "csd-keyboard-manager.h"
++#include "csd-input-helper.h"
+ #include "csd-enums.h"
+
+-#include "csd-keyboard-xkb.h"
+-
+ #define CSD_KEYBOARD_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CSD_TYPE_KEYBOARD_MANAGER, CsdKeyboardManagerPrivate))
+
+-#ifndef HOST_NAME_MAX
+-# define HOST_NAME_MAX 255
+-#endif
+-
+ #define CSD_KEYBOARD_DIR "org.cinnamon.settings-daemon.peripherals.keyboard"
+
+ #define KEY_REPEAT "repeat"
+@@ -60,6 +63,7 @@
+ #define KEY_INTERVAL "repeat-interval"
+ #define KEY_DELAY "delay"
+ #define KEY_CLICK_VOLUME "click-volume"
++#define KEY_REMEMBER_NUMLOCK_STATE "remember-numlock-state"
+ #define KEY_NUMLOCK_STATE "numlock-state"
+
+ #define KEY_BELL_VOLUME "bell-volume"
+@@ -67,27 +71,560 @@
+ #define KEY_BELL_DURATION "bell-duration"
+ #define KEY_BELL_MODE "bell-mode"
+
+-#define LIBGNOMEKBD_KEYBOARD_DIR "org.gnome.libgnomekbd.keyboard"
+-#define LIBGNOMEKBD_KEY_LAYOUTS "layouts"
++#define KEY_SWITCHER "input-sources-switcher"
++
++#define GNOME_DESKTOP_INTERFACE_DIR "org.cinnamon.desktop.interface"
++
++#define KEY_GTK_IM_MODULE "gtk-im-module"
++#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
++#define GTK_IM_MODULE_IBUS "ibus"
++
++#define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.cinnamon.desktop.input-sources"
++
++#define KEY_CURRENT_INPUT_SOURCE "current"
++#define KEY_INPUT_SOURCES "sources"
++#define KEY_KEYBOARD_OPTIONS "xkb-options"
++
++#define INPUT_SOURCE_TYPE_XKB "xkb"
++#define INPUT_SOURCE_TYPE_IBUS "ibus"
++
++#define DEFAULT_LANGUAGE "en_US"
+
+ struct CsdKeyboardManagerPrivate
+ {
+ guint start_idle_id;
+ GSettings *settings;
+- GSettings *libgnomekbd_settings;
+- gboolean have_xkb;
++ GSettings *input_sources_settings;
++ GSettings *interface_settings;
++ GnomeXkbInfo *xkb_info;
++#ifdef HAVE_IBUS
++ IBusBus *ibus;
++ GHashTable *ibus_engines;
++ GHashTable *ibus_xkb_engines;
++ GCancellable *ibus_cancellable;
++ gboolean session_is_fallback;
++#endif
+ gint xkb_event_base;
+ CsdNumLockState old_state;
++ GdkDeviceManager *device_manager;
++ guint device_added_id;
++ guint device_removed_id;
++
++ gboolean input_sources_switcher_spawned;
++ GPid input_sources_switcher_pid;
+ };
+
+ static void csd_keyboard_manager_class_init (CsdKeyboardManagerClass *klass);
+ static void csd_keyboard_manager_init (CsdKeyboardManager *keyboard_manager);
+ static void csd_keyboard_manager_finalize (GObject *object);
++static gboolean apply_input_sources_settings (GSettings *settings,
++ gpointer keys,
++ gint n_keys,
++ CsdKeyboardManager *manager);
++static void set_gtk_im_module (CsdKeyboardManager *manager,
++ const gchar *new_module);
+
+ G_DEFINE_TYPE (CsdKeyboardManager, csd_keyboard_manager, G_TYPE_OBJECT)
+
+ static gpointer manager_object = NULL;
+
++static void
++init_builder_with_sources (GVariantBuilder *builder,
++ GSettings *settings)
++{
++ const gchar *type;
++ const gchar *id;
++ GVariantIter iter;
++ GVariant *sources;
++
++ sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
++
++ g_variant_builder_init (builder, G_VARIANT_TYPE ("a(ss)"));
++
++ g_variant_iter_init (&iter, sources);
++ while (g_variant_iter_next (&iter, "(&s&s)", &type, &id))
++ g_variant_builder_add (builder, "(ss)", type, id);
++
++ g_variant_unref (sources);
++}
++
++static gboolean
++schema_is_installed (const gchar *name)
++{
++ const gchar * const *schemas;
++ const gchar * const *s;
++
++ schemas = g_settings_list_schemas ();
++ for (s = schemas; *s; ++s)
++ if (g_str_equal (*s, name))
++ return TRUE;
++
++ return FALSE;
++}
++
++#ifdef HAVE_IBUS
++static void
++clear_ibus (CsdKeyboardManager *manager)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++
++ g_cancellable_cancel (priv->ibus_cancellable);
++ g_clear_object (&priv->ibus_cancellable);
++ g_clear_pointer (&priv->ibus_engines, g_hash_table_destroy);
++ g_clear_pointer (&priv->ibus_xkb_engines, g_hash_table_destroy);
++ g_clear_object (&priv->ibus);
++}
++
++static gchar *
++make_xkb_source_id (const gchar *engine_id)
++{
++ gchar *id;
++ gchar *p;
++ gint n_colons = 0;
++
++ /* engine_id is like "xkb:layout:variant:lang" where
++ * 'variant' and 'lang' might be empty */
++
++ engine_id += 4;
++
++ for (p = (gchar *)engine_id; *p; ++p)
++ if (*p == ':')
++ if (++n_colons == 2)
++ break;
++ if (!*p)
++ return NULL;
++
++ id = g_strndup (engine_id, p - engine_id + 1);
++
++ id[p - engine_id] = '\0';
++
++ /* id is "layout:variant" where 'variant' might be empty */
++
++ for (p = id; *p; ++p)
++ if (*p == ':') {
++ if (*(p + 1) == '\0')
++ *p = '\0';
++ else
++ *p = '+';
++ break;
++ }
++
++ /* id is "layout+variant" or "layout" */
++
++ return id;
++}
++
++static void
++fetch_ibus_engines_result (GObject *object,
++ GAsyncResult *result,
++ CsdKeyboardManager *manager)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ GList *list, *l;
++ GError *error = NULL;
++
++ /* engines shouldn't be there yet */
++ g_return_if_fail (priv->ibus_engines == NULL);
++
++ g_clear_object (&priv->ibus_cancellable);
++
++ list = ibus_bus_list_engines_async_finish (priv->ibus,
++ result,
++ &error);
++ if (!list && error) {
++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++ g_warning ("Couldn't finish IBus request: %s", error->message);
++ g_error_free (error);
++
++ clear_ibus (manager);
++ return;
++ }
++
++ /* Maps IBus engine ids to engine description objects */
++ priv->ibus_engines = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
++ /* Maps XKB source id strings to engine description objects */
++ priv->ibus_xkb_engines = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
++
++ for (l = list; l; l = l->next) {
++ IBusEngineDesc *engine = l->data;
++ const gchar *engine_id = ibus_engine_desc_get_name (engine);
++
++ g_hash_table_replace (priv->ibus_engines, (gpointer)engine_id, engine);
++
++ if (strncmp ("xkb:", engine_id, 4) == 0) {
++ gchar *xkb_source_id = make_xkb_source_id (engine_id);
++ if (xkb_source_id)
++ g_hash_table_replace (priv->ibus_xkb_engines,
++ xkb_source_id,
++ engine);
++ }
++ }
++ g_list_free (list);
++
++ apply_input_sources_settings (priv->input_sources_settings, NULL, 0, manager);
++}
++
++static void
++fetch_ibus_engines (CsdKeyboardManager *manager)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++
++ /* engines shouldn't be there yet */
++ g_return_if_fail (priv->ibus_engines == NULL);
++ g_return_if_fail (priv->ibus_cancellable == NULL);
++
++ priv->ibus_cancellable = g_cancellable_new ();
++
++ ibus_bus_list_engines_async (priv->ibus,
++ -1,
++ priv->ibus_cancellable,
++ (GAsyncReadyCallback)fetch_ibus_engines_result,
++ manager);
++}
++
++static void
++maybe_start_ibus (CsdKeyboardManager *manager,
++ GVariant *sources)
++{
++ gboolean need_ibus = FALSE;
++ GVariantIter iter;
++ const gchar *type;
++
++ if (manager->priv->session_is_fallback)
++ return;
++
++ g_variant_iter_init (&iter, sources);
++ while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL))
++ if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
++ need_ibus = TRUE;
++ break;
++ }
++
++ if (!need_ibus)
++ return;
++
++ if (!manager->priv->ibus) {
++ ibus_init ();
++ manager->priv->ibus = ibus_bus_new ();
++ g_signal_connect_swapped (manager->priv->ibus, "connected",
++ G_CALLBACK (fetch_ibus_engines), manager);
++ g_signal_connect_swapped (manager->priv->ibus, "disconnected",
++ G_CALLBACK (clear_ibus), manager);
++ }
++ /* IBus doesn't export API in the session bus. The only thing
++ * we have there is a well known name which we can use as a
++ * sure-fire way to activate it. */
++ g_bus_unwatch_name (g_bus_watch_name (G_BUS_TYPE_SESSION,
++ IBUS_SERVICE_IBUS,
++ G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
++ NULL,
++ NULL,
++ NULL,
++ NULL));
++}
++
++static void
++got_session_name (GObject *object,
++ GAsyncResult *res,
++ CsdKeyboardManager *manager)
++{
++ GVariant *result, *variant;
++ GDBusConnection *connection = G_DBUS_CONNECTION (object);
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ const gchar *session_name = NULL;
++ GError *error = NULL;
++
++ /* IBus shouldn't have been touched yet */
++ g_return_if_fail (priv->ibus == NULL);
++
++ g_clear_object (&priv->ibus_cancellable);
++
++ result = g_dbus_connection_call_finish (connection, res, &error);
++ if (!result) {
++ g_warning ("Couldn't get session name: %s", error->message);
++ g_error_free (error);
++ goto out;
++ }
++
++ g_variant_get (result, "(v)", &variant);
++ g_variant_unref (result);
++
++ g_variant_get (variant, "&s", &session_name);
++
++ if (g_strcmp0 (session_name, "gnome") == 0)
++ manager->priv->session_is_fallback = FALSE;
++
++ g_variant_unref (variant);
++ out:
++ apply_input_sources_settings (manager->priv->input_sources_settings, NULL, 0, manager);
++ g_object_unref (connection);
++}
++
++static void
++got_bus (GObject *object,
++ GAsyncResult *res,
++ CsdKeyboardManager *manager)
++{
++ GDBusConnection *connection;
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ GError *error = NULL;
++
++ /* IBus shouldn't have been touched yet */
++ g_return_if_fail (priv->ibus == NULL);
++
++ g_clear_object (&priv->ibus_cancellable);
++
++ connection = g_bus_get_finish (res, &error);
++ if (!connection) {
++ g_warning ("Couldn't get session bus: %s", error->message);
++ g_error_free (error);
++ apply_input_sources_settings (priv->input_sources_settings, NULL, 0, manager);
++ return;
++ }
++
++ priv->ibus_cancellable = g_cancellable_new ();
++
++ g_dbus_connection_call (connection,
++ "org.gnome.SessionManager",
++ "/org/gnome/SessionManager",
++ "org.freedesktop.DBus.Properties",
++ "Get",
++ g_variant_new ("(ss)",
++ "org.gnome.SessionManager",
++ "SessionName"),
++ NULL,
++ G_DBUS_CALL_FLAGS_NONE,
++ -1,
++ priv->ibus_cancellable,
++ (GAsyncReadyCallback)got_session_name,
++ manager);
++}
++
++static void
++set_ibus_engine_finish (GObject *object,
++ GAsyncResult *res,
++ CsdKeyboardManager *manager)
++{
++ gboolean result;
++ IBusBus *ibus = IBUS_BUS (object);
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ GError *error = NULL;
++
++ g_clear_object (&priv->ibus_cancellable);
++
++ result = ibus_bus_set_global_engine_async_finish (ibus, res, &error);
++ if (!result) {
++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++ g_warning ("Couldn't set IBus engine: %s", error->message);
++ g_error_free (error);
++ }
++}
++
++static void
++set_ibus_engine (CsdKeyboardManager *manager,
++ const gchar *engine_id)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++
++ g_return_if_fail (priv->ibus != NULL);
++ g_return_if_fail (priv->ibus_engines != NULL);
++
++ g_cancellable_cancel (priv->ibus_cancellable);
++ g_clear_object (&priv->ibus_cancellable);
++ priv->ibus_cancellable = g_cancellable_new ();
++
++ ibus_bus_set_global_engine_async (priv->ibus,
++ engine_id,
++ -1,
++ priv->ibus_cancellable,
++ (GAsyncReadyCallback)set_ibus_engine_finish,
++ manager);
++}
++
++static void
++set_ibus_xkb_engine (CsdKeyboardManager *manager,
++ const gchar *xkb_id)
++{
++ IBusEngineDesc *engine;
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++
++ if (!priv->ibus_xkb_engines)
++ return;
++
++ engine = g_hash_table_lookup (priv->ibus_xkb_engines, xkb_id);
++ if (!engine)
++ return;
++
++ set_ibus_engine (manager, ibus_engine_desc_get_name (engine));
++}
++
++/* XXX: See upstream bug:
++ * https://codereview.appspot.com/6586075/ */
++static gchar *
++layout_from_ibus_layout (const gchar *ibus_layout)
++{
++ const gchar *p;
++
++ /* we get something like "layout(variant)[option1,option2]" */
++
++ p = ibus_layout;
++ while (*p) {
++ if (*p == '(' || *p == '[')
++ break;
++ p += 1;
++ }
++
++ return g_strndup (ibus_layout, p - ibus_layout);
++}
++
++static gchar *
++variant_from_ibus_layout (const gchar *ibus_layout)
++{
++ const gchar *a, *b;
++
++ /* we get something like "layout(variant)[option1,option2]" */
++
++ a = ibus_layout;
++ while (*a) {
++ if (*a == '(')
++ break;
++ a += 1;
++ }
++ if (!*a)
++ return NULL;
++
++ a += 1;
++ b = a;
++ while (*b) {
++ if (*b == ')')
++ break;
++ b += 1;
++ }
++ if (!*b)
++ return NULL;
++
++ return g_strndup (a, b - a);
++}
++
++static gchar **
++options_from_ibus_layout (const gchar *ibus_layout)
++{
++ const gchar *a, *b;
++ GPtrArray *opt_array;
++
++ /* we get something like "layout(variant)[option1,option2]" */
++
++ a = ibus_layout;
++ while (*a) {
++ if (*a == '[')
++ break;
++ a += 1;
++ }
++ if (!*a)
++ return NULL;
++
++ opt_array = g_ptr_array_new ();
++
++ do {
++ a += 1;
++ b = a;
++ while (*b) {
++ if (*b == ',' || *b == ']')
++ break;
++ b += 1;
++ }
++ if (!*b)
++ goto out;
++
++ g_ptr_array_add (opt_array, g_strndup (a, b - a));
++
++ a = b;
++ } while (*a && *a == ',');
++
++out:
++ g_ptr_array_add (opt_array, NULL);
++ return (gchar **) g_ptr_array_free (opt_array, FALSE);
++}
++
++static const gchar *
++engine_from_locale (void)
++{
++ const gchar *locale;
++ const gchar *locale_engine[][2] = {
++ { "as_IN", "m17n:as:phonetic" },
++ { "bn_IN", "m17n:bn:inscript" },
++ { "gu_IN", "m17n:gu:inscript" },
++ { "hi_IN", "m17n:hi:inscript" },
++ { "ja_JP", "anthy" },
++ { "kn_IN", "m17n:kn:kgp" },
++ { "ko_KR", "hangul" },
++ { "mai_IN", "m17n:mai:inscript" },
++ { "ml_IN", "m17n:ml:inscript" },
++ { "mr_IN", "m17n:mr:inscript" },
++ { "or_IN", "m17n:or:inscript" },
++ { "pa_IN", "m17n:pa:inscript" },
++ { "sd_IN", "m17n:sd:inscript" },
++ { "ta_IN", "m17n:ta:tamil99" },
++ { "te_IN", "m17n:te:inscript" },
++ { "zh_CN", "pinyin" },
++ { "zh_HK", "cangjie3" },
++ { "zh_TW", "chewing" },
++ };
++ gint i;
++
++ locale = setlocale (LC_CTYPE, NULL);
++ if (!locale)
++ return NULL;
++
++ for (i = 0; i < G_N_ELEMENTS (locale_engine); ++i)
++ if (g_str_has_prefix (locale, locale_engine[i][0]))
++ return locale_engine[i][1];
++
++ return NULL;
++}
++
++static void
++add_ibus_sources_from_locale (GSettings *settings)
++{
++ const gchar *locale_engine;
++ GVariantBuilder builder;
++
++ locale_engine = engine_from_locale ();
++ if (!locale_engine)
++ return;
++
++ init_builder_with_sources (&builder, settings);
++ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_IBUS, locale_engine);
++ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
++}
++
++static void
++convert_ibus (GSettings *settings)
++{
++ GVariantBuilder builder;
++ GSettings *ibus_settings;
++ gchar **engines, **e;
++
++ if (!schema_is_installed ("org.freedesktop.ibus.general"))
++ return;
++
++ init_builder_with_sources (&builder, settings);
++
++ ibus_settings = g_settings_new ("org.freedesktop.ibus.general");
++ engines = g_settings_get_strv (ibus_settings, "preload-engines");
++ for (e = engines; *e; ++e) {
++ if (g_str_has_prefix (*e, "xkb:"))
++ continue;
++ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_IBUS, *e);
++ }
++
++ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
++
++ g_strfreev (engines);
++ g_object_unref (ibus_settings);
++}
++#endif /* HAVE_IBUS */
++
+ static gboolean
+ xkb_set_keyboard_autorepeat_rate (guint delay, guint interval)
+ {
+@@ -97,32 +634,33 @@ xkb_set_keyboard_autorepeat_rate (guint
+ interval);
+ }
+
+-static void
+-numlock_xkb_init (CsdKeyboardManager *manager)
++static gboolean
++check_xkb_extension (CsdKeyboardManager *manager)
+ {
+ Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+- gboolean have_xkb;
+ int opcode, error_base, major, minor;
++ gboolean have_xkb;
+
+ have_xkb = XkbQueryExtension (dpy,
+ &opcode,
+ &manager->priv->xkb_event_base,
+ &error_base,
+ &major,
+- &minor)
+- && XkbUseExtension (dpy, &major, &minor);
++ &minor);
++ return have_xkb;
++}
+
+- if (have_xkb) {
+- XkbSelectEventDetails (dpy,
+- XkbUseCoreKbd,
+- XkbStateNotifyMask,
+- XkbModifierLockMask,
+- XkbModifierLockMask);
+- } else {
+- g_warning ("XKB extension not available");
+- }
++static void
++xkb_init (CsdKeyboardManager *manager)
++{
++ Display *dpy;
+
+- manager->priv->have_xkb = have_xkb;
++ dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
++ XkbSelectEventDetails (dpy,
++ XkbUseCoreKbd,
++ XkbStateNotify,
++ XkbModifierLockMask,
++ XkbModifierLockMask);
+ }
+
+ static unsigned
+@@ -143,19 +681,32 @@ numlock_set_xkb_state (CsdNumLockState n
+ XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state == CSD_NUM_LOCK_STATE_ON ? num_mask : 0);
+ }
+
++static const char *
++num_lock_state_to_string (CsdNumLockState numlock_state)
++{
++ switch (numlock_state) {
++ case CSD_NUM_LOCK_STATE_UNKNOWN:
++ return "CSD_NUM_LOCK_STATE_UNKNOWN";
++ case CSD_NUM_LOCK_STATE_ON:
++ return "CSD_NUM_LOCK_STATE_ON";
++ case CSD_NUM_LOCK_STATE_OFF:
++ return "CSD_NUM_LOCK_STATE_OFF";
++ default:
++ return "UNKNOWN";
++ }
++}
++
+ static GdkFilterReturn
+-numlock_xkb_callback (GdkXEvent *xev_,
+- GdkEvent *gdkev_,
+- gpointer user_data)
++xkb_events_filter (GdkXEvent *xev_,
++ GdkEvent *gdkev_,
++ gpointer user_data)
+ {
+ XEvent *xev = (XEvent *) xev_;
+ XkbEvent *xkbev = (XkbEvent *) xev;
+ CsdKeyboardManager *manager = (CsdKeyboardManager *) user_data;
+
+- if (xev->type != manager->priv->xkb_event_base)
+- return GDK_FILTER_CONTINUE;
+-
+- if (xkbev->any.xkb_type != XkbStateNotify)
++ if (xev->type != manager->priv->xkb_event_base ||
++ xkbev->any.xkb_type != XkbStateNotify)
+ return GDK_FILTER_CONTINUE;
+
+ if (xkbev->state.changed & XkbModifierLockMask) {
+@@ -166,6 +717,9 @@ numlock_xkb_callback (GdkXEvent *xev_,
+ numlock_state = (num_mask & locked_mods) ? CSD_NUM_LOCK_STATE_ON : CSD_NUM_LOCK_STATE_OFF;
+
+ if (numlock_state != manager->priv->old_state) {
++ g_debug ("New num-lock state '%s' != Old num-lock state '%s'",
++ num_lock_state_to_string (numlock_state),
++ num_lock_state_to_string (manager->priv->old_state));
+ g_settings_set_enum (manager->priv->settings,
+ KEY_NUMLOCK_STATE,
+ numlock_state);
+@@ -177,57 +731,509 @@ numlock_xkb_callback (GdkXEvent *xev_,
+ }
+
+ static void
+-numlock_install_xkb_callback (CsdKeyboardManager *manager)
++install_xkb_filter (CsdKeyboardManager *manager)
+ {
+- if (!manager->priv->have_xkb)
+- return;
+-
+ gdk_window_add_filter (NULL,
+- numlock_xkb_callback,
++ xkb_events_filter,
+ manager);
+ }
+
+-static guint
+-_csd_settings_get_uint (GSettings *settings,
+- const char *key)
++static void
++remove_xkb_filter (CsdKeyboardManager *manager)
+ {
+- guint value;
++ gdk_window_remove_filter (NULL,
++ xkb_events_filter,
++ manager);
++}
+
+- g_settings_get (settings, key, "u", &value);
+- return value;
++static void
++free_xkb_component_names (XkbComponentNamesRec *p)
++{
++ g_return_if_fail (p != NULL);
++
++ free (p->keymap);
++ free (p->keycodes);
++ free (p->types);
++ free (p->compat);
++ free (p->symbols);
++ free (p->geometry);
++
++ g_free (p);
++}
++
++static void
++upload_xkb_description (const gchar *rules_file_path,
++ XkbRF_VarDefsRec *var_defs,
++ XkbComponentNamesRec *comp_names)
++{
++ Display *display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
++ XkbDescRec *xkb_desc;
++ gchar *rules_file;
++
++ /* Upload it to the X server using the same method as setxkbmap */
++ xkb_desc = XkbGetKeyboardByName (display,
++ XkbUseCoreKbd,
++ comp_names,
++ XkbGBN_AllComponentsMask,
++ XkbGBN_AllComponentsMask &
++ (~XkbGBN_GeometryMask), True);
++ if (!xkb_desc) {
++ g_warning ("Couldn't upload new XKB keyboard description");
++ return;
++ }
++
++ XkbFreeKeyboard (xkb_desc, 0, True);
++
++ rules_file = g_path_get_basename (rules_file_path);
++
++ if (!XkbRF_SetNamesProp (display, rules_file, var_defs))
++ g_warning ("Couldn't update the XKB root window property");
++
++ g_free (rules_file);
++}
++
++static gchar *
++language_code_from_locale (const gchar *locale)
++{
++ if (!locale || !locale[0] || !locale[1])
++ return NULL;
++
++ if (!locale[2] || locale[2] == '_' || locale[2] == '.')
++ return g_strndup (locale, 2);
++
++ if (!locale[3] || locale[3] == '_' || locale[3] == '.')
++ return g_strndup (locale, 3);
++
++ return NULL;
++}
++
++static gchar *
++build_xkb_group_string (const gchar *user,
++ const gchar *locale,
++ const gchar *latin)
++{
++ gchar *string;
++ gsize length = 0;
++ guint commas = 2;
++
++ if (latin)
++ length += strlen (latin);
++ else
++ commas -= 1;
++
++ if (locale)
++ length += strlen (locale);
++ else
++ commas -= 1;
++
++ length += strlen (user) + commas + 1;
++
++ string = malloc (length);
++
++ if (locale && latin)
++ sprintf (string, "%s,%s,%s", user, locale, latin);
++ else if (locale)
++ sprintf (string, "%s,%s", user, locale);
++ else if (latin)
++ sprintf (string, "%s,%s", user, latin);
++ else
++ sprintf (string, "%s", user);
++
++ return string;
++}
++
++static gboolean
++layout_equal (const gchar *layout_a,
++ const gchar *variant_a,
++ const gchar *layout_b,
++ const gchar *variant_b)
++{
++ return !g_strcmp0 (layout_a, layout_b) && !g_strcmp0 (variant_a, variant_b);
+ }
+
+ static void
+-apply_settings (GSettings *settings,
+- const char *key,
+- CsdKeyboardManager *manager)
++replace_layout_and_variant (CsdKeyboardManager *manager,
++ XkbRF_VarDefsRec *xkb_var_defs,
++ const gchar *layout,
++ const gchar *variant)
+ {
++ /* Toolkits need to know about both a latin layout to handle
++ * accelerators which are usually defined like Ctrl+C and a
++ * layout with the symbols for the language used in UI strings
++ * to handle mnemonics like Alt+Ф, so we try to find and add
++ * them in XKB group slots after the layout which the user
++ * actually intends to type with. */
++ const gchar *latin_layout = "us";
++ const gchar *latin_variant = "";
++ const gchar *locale_layout = NULL;
++ const gchar *locale_variant = NULL;
++ const gchar *locale;
++ gchar *language;
++
++ if (!layout)
++ return;
++
++ if (!variant)
++ variant = "";
++
++ locale = setlocale (LC_MESSAGES, NULL);
++ /* If LANG is empty, default to en_US */
++ if (!locale)
++ language = g_strdup (DEFAULT_LANGUAGE);
++ else
++ language = language_code_from_locale (locale);
++
++ if (!language)
++ language = language_code_from_locale (DEFAULT_LANGUAGE);
++
++ gnome_xkb_info_get_layout_info_for_language (manager->priv->xkb_info,
++ language,
++ NULL,
++ NULL,
++ NULL,
++ &locale_layout,
++ &locale_variant);
++ g_free (language);
++
++ /* We want to minimize the number of XKB groups if we have
++ * duplicated layout+variant pairs.
++ *
++ * Also, if a layout doesn't have a variant we still have to
++ * include it in the variants string because the number of
++ * variants must agree with the number of layouts. For
++ * instance:
++ *
++ * layouts: "us,ru,us"
++ * variants: "dvorak,,"
++ */
++ if (layout_equal (latin_layout, latin_variant, locale_layout, locale_variant) ||
++ layout_equal (latin_layout, latin_variant, layout, variant)) {
++ latin_layout = NULL;
++ latin_variant = NULL;
++ }
++
++ if (layout_equal (locale_layout, locale_variant, layout, variant)) {
++ locale_layout = NULL;
++ locale_variant = NULL;
++ }
++
++ free (xkb_var_defs->layout);
++ xkb_var_defs->layout = build_xkb_group_string (layout, locale_layout, latin_layout);
++
++ free (xkb_var_defs->variant);
++ xkb_var_defs->variant = build_xkb_group_string (variant, locale_variant, latin_variant);
++}
++
++static gchar *
++build_xkb_options_string (gchar **options)
++{
++ gchar *string;
++
++ if (*options) {
++ gint i;
++ gsize len;
++ gchar *ptr;
++
++ /* First part, getting length */
++ len = 1 + strlen (options[0]);
++ for (i = 1; options[i] != NULL; i++)
++ len += strlen (options[i]);
++ len += (i - 1); /* commas */
++
++ /* Second part, building string */
++ string = malloc (len);
++ ptr = g_stpcpy (string, *options);
++ for (i = 1; options[i] != NULL; i++) {
++ ptr = g_stpcpy (ptr, ",");
++ ptr = g_stpcpy (ptr, options[i]);
++ }
++ } else {
++ string = malloc (1);
++ *string = '\0';
++ }
++
++ return string;
++}
++
++static gchar **
++append_options (gchar **a,
++ gchar **b)
++{
++ gchar **c, **p;
++
++ if (!a && !b)
++ return NULL;
++ else if (!a)
++ return g_strdupv (b);
++ else if (!b)
++ return g_strdupv (a);
++
++ c = g_new0 (gchar *, g_strv_length (a) + g_strv_length (b) + 1);
++ p = c;
++
++ while (*a) {
++ *p = g_strdup (*a);
++ p += 1;
++ a += 1;
++ }
++ while (*b) {
++ *p = g_strdup (*b);
++ p += 1;
++ b += 1;
++ }
++
++ return c;
++}
++
++static void
++add_xkb_options (CsdKeyboardManager *manager,
++ XkbRF_VarDefsRec *xkb_var_defs,
++ gchar **extra_options)
++{
++ gchar **options;
++ gchar **settings_options;
++
++ settings_options = g_settings_get_strv (manager->priv->input_sources_settings,
++ KEY_KEYBOARD_OPTIONS);
++ options = append_options (settings_options, extra_options);
++ g_strfreev (settings_options);
++
++ free (xkb_var_defs->options);
++ xkb_var_defs->options = build_xkb_options_string (options);
++
++ g_strfreev (options);
++}
++
++static void
++apply_xkb_settings (CsdKeyboardManager *manager,
++ const gchar *layout,
++ const gchar *variant,
++ gchar **options)
++{
++ XkbRF_RulesRec *xkb_rules;
++ XkbRF_VarDefsRec *xkb_var_defs;
++ gchar *rules_file_path;
++
++ gnome_xkb_info_get_var_defs (&rules_file_path, &xkb_var_defs);
++
++ add_xkb_options (manager, xkb_var_defs, options);
++ replace_layout_and_variant (manager, xkb_var_defs, layout, variant);
++
++ gdk_error_trap_push ();
++
++ xkb_rules = XkbRF_Load (rules_file_path, NULL, True, True);
++ if (xkb_rules) {
++ XkbComponentNamesRec *xkb_comp_names;
++ xkb_comp_names = g_new0 (XkbComponentNamesRec, 1);
++
++ XkbRF_GetComponents (xkb_rules, xkb_var_defs, xkb_comp_names);
++ upload_xkb_description (rules_file_path, xkb_var_defs, xkb_comp_names);
++
++ free_xkb_component_names (xkb_comp_names);
++ XkbRF_Free (xkb_rules, True);
++ } else {
++ g_warning ("Couldn't load XKB rules");
++ }
++
++ if (gdk_error_trap_pop ())
++ g_warning ("Error loading XKB rules");
++
++ gnome_xkb_info_free_var_defs (xkb_var_defs);
++ g_free (rules_file_path);
++}
++
++static void
++set_gtk_im_module (CsdKeyboardManager *manager,
++ const gchar *new_module)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ gchar *current_module;
++
++ current_module = g_settings_get_string (priv->interface_settings,
++ KEY_GTK_IM_MODULE);
++ if (!g_str_equal (current_module, new_module))
++ g_settings_set_string (priv->interface_settings,
++ KEY_GTK_IM_MODULE,
++ new_module);
++ g_free (current_module);
++}
++
++static gboolean
++apply_input_sources_settings (GSettings *settings,
++ gpointer keys,
++ gint n_keys,
++ CsdKeyboardManager *manager)
++{
++ CsdKeyboardManagerPrivate *priv = manager->priv;
++ GVariant *sources;
++ guint current;
++ guint n_sources;
++ const gchar *type = NULL;
++ const gchar *id = NULL;
++ gchar *layout = NULL;
++ gchar *variant = NULL;
++ gchar **options = NULL;
++
++ sources = g_settings_get_value (priv->input_sources_settings, KEY_INPUT_SOURCES);
++ current = g_settings_get_uint (priv->input_sources_settings, KEY_CURRENT_INPUT_SOURCE);
++ n_sources = g_variant_n_children (sources);
++
++ if (n_sources < 1)
++ goto exit;
++
++ if (current >= n_sources) {
++ g_settings_set_uint (priv->input_sources_settings,
++ KEY_CURRENT_INPUT_SOURCE,
++ n_sources - 1);
++ goto exit;
++ }
++
++#ifdef HAVE_IBUS
++ maybe_start_ibus (manager, sources);
++#endif
++
++ g_variant_get_child (sources, current, "(&s&s)", &type, &id);
++
++ if (g_str_equal (type, INPUT_SOURCE_TYPE_XKB)) {
++ const gchar *l, *v;
++ gnome_xkb_info_get_layout_info (priv->xkb_info, id, NULL, NULL, &l, &v);
++
++ layout = g_strdup (l);
++ variant = g_strdup (v);
++
++ if (!layout || !layout[0]) {
++ g_warning ("Couldn't find XKB input source '%s'", id);
++ goto exit;
++ }
++ set_gtk_im_module (manager, GTK_IM_MODULE_SIMPLE);
++#ifdef HAVE_IBUS
++ set_ibus_xkb_engine (manager, id);
++#endif
++ } else if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
++#ifdef HAVE_IBUS
++ IBusEngineDesc *engine_desc = NULL;
++
++ if (priv->session_is_fallback)
++ goto exit;
++
++ if (priv->ibus_engines)
++ engine_desc = g_hash_table_lookup (priv->ibus_engines, id);
++ else
++ goto exit; /* we'll be called again when ibus is up and running */
++
++ if (engine_desc) {
++ const gchar *ibus_layout;
++ ibus_layout = ibus_engine_desc_get_layout (engine_desc);
++
++ if (ibus_layout) {
++ layout = layout_from_ibus_layout (ibus_layout);
++ variant = variant_from_ibus_layout (ibus_layout);
++ options = options_from_ibus_layout (ibus_layout);
++ }
++ } else {
++ g_warning ("Couldn't find IBus input source '%s'", id);
++ goto exit;
++ }
++
++ set_gtk_im_module (manager, GTK_IM_MODULE_IBUS);
++ set_ibus_engine (manager, id);
++#else
++ g_warning ("IBus input source type specified but IBus support was not compiled");
++#endif
++ } else {
++ g_warning ("Unknown input source type '%s'", type);
++ }
++
++ exit:
++ apply_xkb_settings (manager, layout, variant, options);
++ g_variant_unref (sources);
++ g_free (layout);
++ g_free (variant);
++ g_strfreev (options);
++ /* Prevent individual "changed" signal invocations since we
++ don't need them. */
++ return TRUE;
++}
++
++static void
++apply_bell (CsdKeyboardManager *manager)
++{
++ GSettings *settings;
+ XKeyboardControl kbdcontrol;
+- gboolean repeat;
+ gboolean click;
+- guint interval;
+- guint delay;
+- int click_volume;
+ int bell_volume;
+ int bell_pitch;
+ int bell_duration;
+ CsdBellMode bell_mode;
+- gboolean rnumlock;
+-
+- if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0)
+- return;
++ int click_volume;
+
+- repeat = g_settings_get_boolean (settings, KEY_REPEAT);
++ g_debug ("Applying the bell settings");
++ settings = manager->priv->settings;
+ click = g_settings_get_boolean (settings, KEY_CLICK);
+- interval = _csd_settings_get_uint (settings, KEY_INTERVAL);
+- delay = _csd_settings_get_uint (settings, KEY_DELAY);
+ click_volume = g_settings_get_int (settings, KEY_CLICK_VOLUME);
++
+ bell_pitch = g_settings_get_int (settings, KEY_BELL_PITCH);
+ bell_duration = g_settings_get_int (settings, KEY_BELL_DURATION);
+
+ bell_mode = g_settings_get_enum (settings, KEY_BELL_MODE);
+ bell_volume = (bell_mode == CSD_BELL_MODE_ON) ? 50 : 0;
+
++ /* as percentage from 0..100 inclusive */
++ if (click_volume < 0) {
++ click_volume = 0;
++ } else if (click_volume > 100) {
++ click_volume = 100;
++ }
++ kbdcontrol.key_click_percent = click ? click_volume : 0;
++ kbdcontrol.bell_percent = bell_volume;
++ kbdcontrol.bell_pitch = bell_pitch;
++ kbdcontrol.bell_duration = bell_duration;
++
++ gdk_error_trap_push ();
++ XChangeKeyboardControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
++ KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration,
++ &kbdcontrol);
++
++ XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
++ gdk_error_trap_pop_ignored ();
++}
++
++static void
++apply_numlock (CsdKeyboardManager *manager)
++{
++ GSettings *settings;
++ gboolean rnumlock;
++
++ g_debug ("Applying the num-lock settings");
++ settings = manager->priv->settings;
++ rnumlock = g_settings_get_boolean (settings, KEY_REMEMBER_NUMLOCK_STATE);
++ manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
++
++ gdk_error_trap_push ();
++ if (rnumlock) {
++ g_debug ("Remember num-lock is set, so applying setting '%s'",
++ num_lock_state_to_string (manager->priv->old_state));
++ numlock_set_xkb_state (manager->priv->old_state);
++ }
++
++ XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
++ gdk_error_trap_pop_ignored ();
++}
++
++static void
++apply_repeat (CsdKeyboardManager *manager)
++{
++ GSettings *settings;
++ gboolean repeat;
++ guint interval;
++ guint delay;
++
++ g_debug ("Applying the repeat settings");
++ settings = manager->priv->settings;
++ repeat = g_settings_get_boolean (settings, KEY_REPEAT);
++ interval = g_settings_get_uint (settings, KEY_INTERVAL);
++ delay = g_settings_get_uint (settings, KEY_DELAY);
++
+ gdk_error_trap_push ();
+ if (repeat) {
+ gboolean rate_set = FALSE;
+@@ -243,124 +1249,319 @@ apply_settings (GSettings *sett
+ XAutoRepeatOff (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+ }
+
+- /* as percentage from 0..100 inclusive */
+- if (click_volume < 0) {
+- click_volume = 0;
+- } else if (click_volume > 100) {
+- click_volume = 100;
++ XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
++ gdk_error_trap_pop_ignored ();
++}
++
++static void
++apply_all_settings (CsdKeyboardManager *manager)
++{
++ apply_repeat (manager);
++ apply_bell (manager);
++ apply_numlock (manager);
++}
++
++static void
++set_input_sources_switcher (CsdKeyboardManager *manager,
++ gboolean state)
++{
++ if (state) {
++ GError *error = NULL;
++ char *args[2];
++
++ if (manager->priv->input_sources_switcher_spawned)
++ set_input_sources_switcher (manager, FALSE);
++
++ args[0] = LIBEXECDIR "/csd-input-sources-switcher";
++ args[1] = NULL;
++
++ g_spawn_async (NULL, args, NULL,
++ 0, NULL, NULL,
++ &manager->priv->input_sources_switcher_pid, &error);
++
++ manager->priv->input_sources_switcher_spawned = (error == NULL);
++
++ if (error) {
++ g_warning ("Couldn't spawn %s: %s", args[0], error->message);
++ g_error_free (error);
++ }
++ } else if (manager->priv->input_sources_switcher_spawned) {
++ kill (manager->priv->input_sources_switcher_pid, SIGHUP);
++ g_spawn_close_pid (manager->priv->input_sources_switcher_pid);
++ manager->priv->input_sources_switcher_spawned = FALSE;
+ }
+- kbdcontrol.key_click_percent = click ? click_volume : 0;
+- kbdcontrol.bell_percent = bell_volume;
+- kbdcontrol.bell_pitch = bell_pitch;
+- kbdcontrol.bell_duration = bell_duration;
+- XChangeKeyboardControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+- KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration,
+- &kbdcontrol);
++}
+
+- if (g_strcmp0 (key, "remember-numlock-state") == 0 || key == NULL) {
+- rnumlock = g_settings_get_boolean (settings, "remember-numlock-state");
++static gboolean
++enable_switcher (CsdKeyboardManager *manager)
++{
++ CsdInputSourcesSwitcher switcher;
+
+- manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
++ switcher = g_settings_get_enum (manager->priv->settings, KEY_SWITCHER);
+
+- if (manager->priv->have_xkb && rnumlock)
+- numlock_set_xkb_state (manager->priv->old_state);
++ return switcher != CSD_INPUT_SOURCES_SWITCHER_OFF;
++}
++
++static void
++settings_changed (GSettings *settings,
++ const char *key,
++ CsdKeyboardManager *manager)
++{
++ if (g_strcmp0 (key, KEY_CLICK) == 0||
++ g_strcmp0 (key, KEY_CLICK_VOLUME) == 0 ||
++ g_strcmp0 (key, KEY_BELL_PITCH) == 0 ||
++ g_strcmp0 (key, KEY_BELL_DURATION) == 0 ||
++ g_strcmp0 (key, KEY_BELL_MODE) == 0) {
++ g_debug ("Bell setting '%s' changed, applying bell settings", key);
++ apply_bell (manager);
++ } else if (g_strcmp0 (key, KEY_REMEMBER_NUMLOCK_STATE) == 0) {
++ g_debug ("Remember Num-Lock state '%s' changed, applying num-lock settings", key);
++ apply_numlock (manager);
++ } else if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) {
++ g_debug ("Num-Lock state '%s' changed, will apply at next startup", key);
++ } else if (g_strcmp0 (key, KEY_REPEAT) == 0 ||
++ g_strcmp0 (key, KEY_INTERVAL) == 0 ||
++ g_strcmp0 (key, KEY_DELAY) == 0) {
++ g_debug ("Key repeat setting '%s' changed, applying key repeat settings", key);
++ apply_repeat (manager);
++ } else if (g_strcmp0 (key, KEY_SWITCHER) == 0) {
++ set_input_sources_switcher (manager, enable_switcher (manager));
++ } else {
++ g_warning ("Unhandled settings change, key '%s'", key);
+ }
+
+- XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
+- gdk_error_trap_pop_ignored ();
+ }
+
+-void
+-csd_keyboard_manager_apply_settings (CsdKeyboardManager *manager)
++static void
++device_added_cb (GdkDeviceManager *device_manager,
++ GdkDevice *device,
++ CsdKeyboardManager *manager)
+ {
+- apply_settings (manager->priv->settings, NULL, manager);
++ GdkInputSource source;
++
++ source = gdk_device_get_source (device);
++ if (source == GDK_SOURCE_KEYBOARD) {
++ g_debug ("New keyboard plugged in, applying all settings");
++ apply_all_settings (manager);
++ apply_input_sources_settings (manager->priv->input_sources_settings, NULL, 0, manager);
++ run_custom_command (device, COMMAND_DEVICE_ADDED);
++ }
+ }
+
+ static void
+-apply_libgnomekbd_settings (GSettings *settings,
+- const char *key,
+- CsdKeyboardManager *manager)
++device_removed_cb (GdkDeviceManager *device_manager,
++ GdkDevice *device,
++ CsdKeyboardManager *manager)
+ {
+- gchar **layouts;
++ GdkInputSource source;
+
+- layouts = g_settings_get_strv (settings, LIBGNOMEKBD_KEY_LAYOUTS);
++ source = gdk_device_get_source (device);
++ if (source == GDK_SOURCE_KEYBOARD) {
++ run_custom_command (device, COMMAND_DEVICE_REMOVED);
++ }
++}
+
+- /* Get accounts daemon */
+- GDBusProxy *proxy = NULL;
+- GDBusProxy *user = NULL;
+- GVariant *variant = NULL;
+- GError *error = NULL;
+- gchar *object_path = NULL;
++static void
++set_devicepresence_handler (CsdKeyboardManager *manager)
++{
++ GdkDeviceManager *device_manager;
+
+- proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+- G_DBUS_PROXY_FLAGS_NONE,
+- NULL,
+- "org.freedesktop.Accounts",
+- "/org/freedesktop/Accounts",
+- "org.freedesktop.Accounts",
+- NULL,
+- &error);
++ device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
+
+- if (proxy == NULL) {
+- g_warning ("Failed to contact accounts service: %s", error->message);
+- g_error_free (error);
+- goto bail;
++ manager->priv->device_added_id = g_signal_connect (G_OBJECT (device_manager), "device-added",
++ G_CALLBACK (device_added_cb), manager);
++ manager->priv->device_removed_id = g_signal_connect (G_OBJECT (device_manager), "device-removed",
++ G_CALLBACK (device_removed_cb), manager);
++ manager->priv->device_manager = device_manager;
++}
++
++static void
++create_sources_from_current_xkb_config (GSettings *settings)
++{
++ GVariantBuilder builder;
++ XkbRF_VarDefsRec *xkb_var_defs;
++ gchar *tmp;
++ gchar **layouts = NULL;
++ gchar **variants = NULL;
++ guint i, n;
++
++ gnome_xkb_info_get_var_defs (&tmp, &xkb_var_defs);
++ g_free (tmp);
++
++ if (xkb_var_defs->layout)
++ layouts = g_strsplit (xkb_var_defs->layout, ",", 0);
++ if (xkb_var_defs->variant)
++ variants = g_strsplit (xkb_var_defs->variant, ",", 0);
++
++ gnome_xkb_info_free_var_defs (xkb_var_defs);
++
++ if (!layouts)
++ goto out;
++
++ if (variants && variants[0])
++ n = MIN (g_strv_length (layouts), g_strv_length (variants));
++ else
++ n = g_strv_length (layouts);
++
++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ss)"));
++ for (i = 0; i < n && layouts[i][0]; ++i) {
++ if (variants && variants[i] && variants[i][0])
++ tmp = g_strdup_printf ("%s+%s", layouts[i], variants[i]);
++ else
++ tmp = g_strdup (layouts[i]);
++
++ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_XKB, tmp);
++ g_free (tmp);
+ }
++ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
++out:
++ g_strfreev (layouts);
++ g_strfreev (variants);
++}
+
+- variant = g_dbus_proxy_call_sync (proxy,
+- "FindUserByName",
+- g_variant_new ("(s)", g_get_user_name ()),
+- G_DBUS_CALL_FLAGS_NONE,
+- -1,
+- NULL,
+- &error);
++static void
++convert_libgnomekbd_options (GSettings *settings)
++{
++ GPtrArray *opt_array;
++ GSettings *libgnomekbd_settings;
++ gchar **options, **o;
+
+- if (variant == NULL) {
+- g_warning ("Could not contact accounts service to look up '%s': %s",
+- g_get_user_name (), error->message);
+- g_error_free (error);
+- goto bail;
++ if (!schema_is_installed ("org.gnome.libgnomekbd.keyboard"))
++ return;
++
++ opt_array = g_ptr_array_new_with_free_func (g_free);
++
++ libgnomekbd_settings = g_settings_new ("org.gnome.libgnomekbd.keyboard");
++ options = g_settings_get_strv (libgnomekbd_settings, "options");
++
++ for (o = options; *o; ++o) {
++ gchar **strv;
++
++ strv = g_strsplit (*o, "\t", 2);
++ if (strv[0] && strv[1]) {
++ /* We don't want the group switcher because
++ * it's incompatible with the way we use XKB
++ * groups. */
++ if (!g_str_has_prefix (strv[1], "grp:"))
++ g_ptr_array_add (opt_array, g_strdup (strv[1]));
++ }
++ g_strfreev (strv);
+ }
++ g_ptr_array_add (opt_array, NULL);
+
+- g_variant_get (variant, "(o)", &object_path);
+- user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+- G_DBUS_PROXY_FLAGS_NONE,
+- NULL,
+- "org.freedesktop.Accounts",
+- object_path,
+- "org.freedesktop.Accounts.User",
+- NULL,
+- &error);
+- g_free (object_path);
++ g_settings_set_strv (settings, KEY_KEYBOARD_OPTIONS, (const gchar * const*) opt_array->pdata);
+
+- if (user == NULL) {
+- g_warning ("Could not create proxy for user '%s': %s",
+- g_variant_get_string (variant, NULL), error->message);
+- g_error_free (error);
+- goto bail;
++ g_strfreev (options);
++ g_object_unref (libgnomekbd_settings);
++ g_ptr_array_free (opt_array, TRUE);
++}
++
++static void
++convert_libgnomekbd_layouts (GSettings *settings)
++{
++ GVariantBuilder builder;
++ GSettings *libgnomekbd_settings;
++ gchar **layouts, **l;
++
++ if (!schema_is_installed ("org.gnome.libgnomekbd.keyboard"))
++ return;
++
++ init_builder_with_sources (&builder, settings);
++
++ libgnomekbd_settings = g_settings_new ("org.gnome.libgnomekbd.keyboard");
++ layouts = g_settings_get_strv (libgnomekbd_settings, "layouts");
++
++ for (l = layouts; *l; ++l) {
++ gchar *id;
++ gchar **strv;
++
++ strv = g_strsplit (*l, "\t", 2);
++ if (strv[0] && !strv[1])
++ id = g_strdup (strv[0]);
++ else if (strv[0] && strv[1])
++ id = g_strdup_printf ("%s+%s", strv[0], strv[1]);
++ else
++ id = NULL;
++
++ if (id)
++ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_XKB, id);
++
++ g_free (id);
++ g_strfreev (strv);
+ }
+- g_variant_unref (variant);
+
+- variant = g_dbus_proxy_call_sync (user,
+- "SetXKeyboardLayouts",
+- g_variant_new ("(^as)", layouts),
+- G_DBUS_CALL_FLAGS_NONE,
+- -1,
+- NULL,
+- &error);
++ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
++
++ g_strfreev (layouts);
++ g_object_unref (libgnomekbd_settings);
++}
+
+- if (variant == NULL) {
+- g_warning ("Failed to set the keyboard layouts: %s", error->message);
++static void
++maybe_convert_old_settings (GSettings *settings)
++{
++ GVariant *sources;
++ gchar **options;
++ gchar *stamp_dir_path = NULL;
++ gchar *stamp_file_path = NULL;
++ GError *error = NULL;
++
++ stamp_dir_path = g_build_filename (g_get_user_data_dir (), PACKAGE_NAME, NULL);
++ if (g_mkdir_with_parents (stamp_dir_path, 0755)) {
++ g_warning ("Failed to create directory %s: %s", stamp_dir_path, g_strerror (errno));
++ goto out;
++ }
++
++ stamp_file_path = g_build_filename (stamp_dir_path, "input-sources-converted", NULL);
++ if (g_file_test (stamp_file_path, G_FILE_TEST_EXISTS))
++ goto out;
++
++ sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
++ if (g_variant_n_children (sources) < 1) {
++ convert_libgnomekbd_layouts (settings);
++#ifdef HAVE_IBUS
++ convert_ibus (settings);
++#endif
++ }
++ g_variant_unref (sources);
++
++ options = g_settings_get_strv (settings, KEY_KEYBOARD_OPTIONS);
++ if (g_strv_length (options) < 1)
++ convert_libgnomekbd_options (settings);
++ g_strfreev (options);
++
++ if (!g_file_set_contents (stamp_file_path, "", 0, &error)) {
++ g_warning ("%s", error->message);
+ g_error_free (error);
+- goto bail;
+ }
++out:
++ g_free (stamp_file_path);
++ g_free (stamp_dir_path);
++}
+
+-bail:
+- if (proxy != NULL)
+- g_object_unref (proxy);
+- if (variant != NULL)
+- g_variant_unref (variant);
+- g_strfreev (layouts);
++static void
++maybe_create_input_sources (CsdKeyboardManager *manager)
++{
++ GSettings *settings;
++ GVariant *sources;
++
++ settings = manager->priv->input_sources_settings;
++
++ if (g_getenv ("RUNNING_UNDER_GDM")) {
++ create_sources_from_current_xkb_config (settings);
++ return;
++ }
++
++ maybe_convert_old_settings (settings);
++
++ /* if we still don't have anything do some educated guesses */
++ sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
++ if (g_variant_n_children (sources) < 1) {
++ create_sources_from_current_xkb_config (settings);
++#ifdef HAVE_IBUS
++ add_ibus_sources_from_locale (settings);
++#endif
++ }
++ g_variant_unref (sources);
+ }
+
+ static gboolean
+@@ -370,26 +1571,41 @@ start_keyboard_idle_cb (CsdKeyboardManag
+
+ g_debug ("Starting keyboard manager");
+
+- manager->priv->have_xkb = 0;
+ manager->priv->settings = g_settings_new (CSD_KEYBOARD_DIR);
+- manager->priv->libgnomekbd_settings = g_settings_new (LIBGNOMEKBD_KEYBOARD_DIR);
+
+- /* Essential - xkb initialization should happen before */
+- csd_keyboard_xkb_init (manager);
++ xkb_init (manager);
+
+- numlock_xkb_init (manager);
++ set_devicepresence_handler (manager);
+
++ manager->priv->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
++ manager->priv->interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
++ manager->priv->xkb_info = gnome_xkb_info_new ();
++
++ maybe_create_input_sources (manager);
++
++#ifdef HAVE_IBUS
++ /* We don't want to touch IBus until we are sure this isn't a
++ fallback session. */
++ manager->priv->session_is_fallback = TRUE;
++ manager->priv->ibus_cancellable = g_cancellable_new ();
++ g_bus_get (G_BUS_TYPE_SESSION,
++ manager->priv->ibus_cancellable,
++ (GAsyncReadyCallback)got_bus,
++ manager);
++#else
++ apply_input_sources_settings (manager->priv->input_sources_settings, NULL, 0, manager);
++#endif
+ /* apply current settings before we install the callback */
+- csd_keyboard_manager_apply_settings (manager);
++ g_debug ("Started the keyboard plugin, applying all settings");
++ apply_all_settings (manager);
+
+ g_signal_connect (G_OBJECT (manager->priv->settings), "changed",
+- G_CALLBACK (apply_settings), manager);
+-
+- apply_libgnomekbd_settings (manager->priv->libgnomekbd_settings, NULL, manager);
+- g_signal_connect (G_OBJECT (manager->priv->libgnomekbd_settings), "changed",
+- G_CALLBACK (apply_libgnomekbd_settings), manager);
++ G_CALLBACK (settings_changed), manager);
++ g_signal_connect (G_OBJECT (manager->priv->input_sources_settings), "change-event",
++ G_CALLBACK (apply_input_sources_settings), manager);
+
+- numlock_install_xkb_callback (manager);
++ install_xkb_filter (manager);
++ set_input_sources_switcher (manager, enable_switcher (manager));
+
+ cinnamon_settings_profile_end (NULL);
+
+@@ -404,6 +1620,11 @@ csd_keyboard_manager_start (CsdKeyboardM
+ {
+ cinnamon_settings_profile_start (NULL);
+
++ if (check_xkb_extension (manager) == FALSE) {
++ g_debug ("XKB is not supported, not applying any settings");
++ return TRUE;
++ }
++
+ manager->priv->start_idle_id = g_idle_add ((GSourceFunc) start_keyboard_idle_cb, manager);
+
+ cinnamon_settings_profile_end (NULL);
+@@ -418,37 +1639,24 @@ csd_keyboard_manager_stop (CsdKeyboardMa
+
+ g_debug ("Stopping keyboard manager");
+
+- if (p->settings != NULL) {
+- g_object_unref (p->settings);
+- p->settings = NULL;
+- }
++ g_clear_object (&p->settings);
++ g_clear_object (&p->input_sources_settings);
++ g_clear_object (&p->interface_settings);
++ g_clear_object (&p->xkb_info);
+
+- if (p->libgnomekbd_settings != NULL) {
+- g_object_unref (p->libgnomekbd_settings);
+- p->libgnomekbd_settings = NULL;
+- }
++#ifdef HAVE_IBUS
++ clear_ibus (manager);
++#endif
+
+- if (p->have_xkb) {
+- gdk_window_remove_filter (NULL,
+- numlock_xkb_callback,
+- manager);
++ if (p->device_manager != NULL) {
++ g_signal_handler_disconnect (p->device_manager, p->device_added_id);
++ g_signal_handler_disconnect (p->device_manager, p->device_removed_id);
++ p->device_manager = NULL;
+ }
+
+- csd_keyboard_xkb_shutdown ();
+-}
+-
+-static GObject *
+-csd_keyboard_manager_constructor (GType type,
+- guint n_construct_properties,
+- GObjectConstructParam *construct_properties)
+-{
+- CsdKeyboardManager *keyboard_manager;
+-
+- keyboard_manager = CSD_KEYBOARD_MANAGER (G_OBJECT_CLASS (csd_keyboard_manager_parent_class)->constructor (type,
+- n_construct_properties,
+- construct_properties));
++ remove_xkb_filter (manager);
+
+- return G_OBJECT (keyboard_manager);
++ set_input_sources_switcher (manager, FALSE);
+ }
+
+ static void
+@@ -456,7 +1664,6 @@ csd_keyboard_manager_class_init (CsdKeyb
+ {
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+- object_class->constructor = csd_keyboard_manager_constructor;
+ object_class->finalize = csd_keyboard_manager_finalize;
+
+ g_type_class_add_private (klass, sizeof (CsdKeyboardManagerPrivate));
+diff -uNrp a/plugins/keyboard/csd-keyboard-manager.h b/plugins/keyboard/csd-keyboard-manager.h
+--- a/plugins/keyboard/csd-keyboard-manager.h 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/csd-keyboard-manager.h 2013-08-25 16:36:02.000000000 +0100
+@@ -51,7 +51,6 @@ CsdKeyboardManager * csd_keyboard_
+ gboolean csd_keyboard_manager_start (CsdKeyboardManager *manager,
+ GError **error);
+ void csd_keyboard_manager_stop (CsdKeyboardManager *manager);
+-void csd_keyboard_manager_apply_settings (CsdKeyboardManager *manager);
+
+ G_END_DECLS
+
+diff -uNrp a/plugins/keyboard/csd-keyboard-plugin.h b/plugins/keyboard/csd-keyboard-plugin.h
+--- a/plugins/keyboard/csd-keyboard-plugin.h 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/csd-keyboard-plugin.h 2013-08-25 16:36:02.000000000 +0100
+@@ -52,7 +52,7 @@ typedef struct
+ GType csd_keyboard_plugin_get_type (void) G_GNUC_CONST;
+
+ /* All the plugins must implement this function */
+-G_MODULE_EXPORT GType register_cinnamon_settings_plugin (GTypeModule *module);
++G_MODULE_EXPORT GType register_gnome_settings_plugin (GTypeModule *module);
+
+ G_END_DECLS
+
+diff -uNrp a/plugins/keyboard/csd-keyboard-xkb.c b/plugins/keyboard/csd-keyboard-xkb.c
+--- a/plugins/keyboard/csd-keyboard-xkb.c 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/csd-keyboard-xkb.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,579 +0,0 @@
+-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+- *
+- * Copyright (C) 2001 Udaltsoft
+- *
+- * Written by Sergey V. Oudaltsov
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA
+- * 02110-1335, USA.
+- */
+-
+-#include "config.h"
+-
+-#include
+-#include
+-
+-#include
+-#include
+-#include
+-#include
+-
+-#include
+-
+-#include
+-#include
+-#include
+-#include
+-#include
+-
+-#include "csd-keyboard-xkb.h"
+-#include "delayed-dialog.h"
+-#include "cinnamon-settings-profile.h"
+-
+-#define SETTINGS_KEYBOARD_DIR "org.cinnamon.settings-daemon.plugins.keyboard"
+-
+-static CsdKeyboardManager *manager = NULL;
+-
+-static XklEngine *xkl_engine;
+-static XklConfigRegistry *xkl_registry = NULL;
+-
+-static GkbdDesktopConfig current_config;
+-static GkbdKeyboardConfig current_kbd_config;
+-
+-/* never terminated */
+-static GkbdKeyboardConfig initial_sys_kbd_config;
+-
+-static gboolean inited_ok = FALSE;
+-
+-static GSettings *settings_desktop = NULL;
+-static GSettings *settings_keyboard = NULL;
+-
+-static PostActivationCallback pa_callback = NULL;
+-static void *pa_callback_user_data = NULL;
+-
+-static GtkStatusIcon *icon = NULL;
+-
+-static GHashTable *preview_dialogs = NULL;
+-
+-static void
+-activation_error (void)
+-{
+- char const *vendor;
+- GtkWidget *dialog;
+-
+- vendor =
+- ServerVendor (GDK_DISPLAY_XDISPLAY
+- (gdk_display_get_default ()));
+-
+- /* VNC viewers will not work, do not barrage them with warnings */
+- if (NULL != vendor && NULL != strstr (vendor, "VNC"))
+- return;
+-
+- dialog = gtk_message_dialog_new_with_markup (NULL,
+- 0,
+- GTK_MESSAGE_ERROR,
+- GTK_BUTTONS_CLOSE,
+- _
+- ("Error activating XKB configuration.\n"
+- "There can be various reasons for that.\n\n"
+- "If you report this situation as a bug, include the results of\n"
+- " • %s\n"
+- " • %s\n"
+- " • %s\n"
+- " • %s"),
+- "xprop -root | grep XKB",
+- "gsettings get org.gnome.libgnomekbd.keyboard model",
+- "gsettings get org.gnome.libgnomekbd.keyboard layouts",
+- "gsettings get org.gnome.libgnomekbd.keyboard options");
+- g_signal_connect (dialog, "response",
+- G_CALLBACK (gtk_widget_destroy), NULL);
+- csd_delayed_show_dialog (dialog);
+-}
+-
+-static gboolean
+-ensure_xkl_registry (void)
+-{
+- if (!xkl_registry) {
+- xkl_registry =
+- xkl_config_registry_get_instance (xkl_engine);
+- /* load all materials, unconditionally! */
+- if (!xkl_config_registry_load (xkl_registry, TRUE)) {
+- g_object_unref (xkl_registry);
+- xkl_registry = NULL;
+- return FALSE;
+- }
+- }
+-
+- return TRUE;
+-}
+-
+-static void
+-apply_desktop_settings (void)
+-{
+- if (!inited_ok)
+- return;
+-
+- csd_keyboard_manager_apply_settings (manager);
+- gkbd_desktop_config_load (¤t_config);
+- /* again, probably it would be nice to compare things
+- before activating them */
+- gkbd_desktop_config_activate (¤t_config);
+-}
+-
+-static void
+-popup_menu_launch_capplet ()
+-{
+- GAppInfo *info;
+- GdkAppLaunchContext *ctx;
+- GError *error = NULL;
+-
+- info =
+- g_app_info_create_from_commandline
+- ("cinnamon-settings region", NULL, 0, &error);
+-
+- if (info != NULL) {
+- ctx =
+- gdk_display_get_app_launch_context
+- (gdk_display_get_default ());
+-
+- if (g_app_info_launch (info, NULL,
+- G_APP_LAUNCH_CONTEXT (ctx), &error) == FALSE) {
+- g_warning
+- ("Could not execute keyboard properties capplet: [%s]\n",
+- error->message);
+- g_error_free (error);
+- }
+-
+- g_object_unref (info);
+- g_object_unref (ctx);
+- }
+-
+-}
+-
+-static void
+-show_layout_destroy (GtkWidget * dialog, gint group)
+-{
+- g_hash_table_remove (preview_dialogs, GINT_TO_POINTER (group));
+-}
+-
+-static void
+-popup_menu_show_layout ()
+-{
+- GtkWidget *dialog;
+- XklEngine *engine =
+- xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY
+- (gdk_display_get_default ()));
+- XklState *xkl_state = xkl_engine_get_current_state (engine);
+-
+- gchar **group_names = gkbd_status_get_group_names ();
+-
+- gpointer p = g_hash_table_lookup (preview_dialogs,
+- GINT_TO_POINTER
+- (xkl_state->group));
+-
+- if (xkl_state->group < 0
+- || xkl_state->group >= g_strv_length (group_names)) {
+- return;
+- }
+-
+- if (p != NULL) {
+- /* existing window */
+- gtk_window_present (GTK_WINDOW (p));
+- return;
+- }
+-
+- if (!ensure_xkl_registry ())
+- return;
+-
+- dialog = gkbd_keyboard_drawing_dialog_new ();
+- gkbd_keyboard_drawing_dialog_set_group (dialog, xkl_registry, xkl_state->group);
+-
+- g_signal_connect (dialog, "destroy",
+- G_CALLBACK (show_layout_destroy),
+- GINT_TO_POINTER (xkl_state->group));
+- g_hash_table_insert (preview_dialogs,
+- GINT_TO_POINTER (xkl_state->group), dialog);
+- gtk_widget_show_all (dialog);
+-}
+-
+-static void
+-popup_menu_set_group (gint group_number, gboolean only_menu)
+-{
+-
+- XklEngine *engine = gkbd_status_get_xkl_engine ();
+-
+- XklState *st = xkl_engine_get_current_state(engine);
+- Window cur;
+- st->group = group_number;
+- xkl_engine_allow_one_switch_to_secondary_group (engine);
+- cur = xkl_engine_get_current_window (engine);
+- if (cur != (Window) NULL) {
+- xkl_debug (150, "Enforcing the state %d for window %lx\n",
+- st->group, cur);
+-
+- xkl_engine_save_state (engine,
+- xkl_engine_get_current_window
+- (engine), st);
+-/* XSetInputFocus( GDK_DISPLAY(), cur, RevertToNone, CurrentTime );*/
+- } else {
+- xkl_debug (150,
+- "??? Enforcing the state %d for unknown window\n",
+- st->group);
+- /* strange situation - bad things can happen */
+- }
+- if (!only_menu)
+- xkl_engine_lock_group (engine, st->group);
+-}
+-
+-static void
+-popup_menu_set_group_cb (GtkMenuItem * item, gpointer param)
+-{
+- gint group_number = GPOINTER_TO_INT (param);
+-
+- popup_menu_set_group(group_number, FALSE);
+-}
+-
+-
+-static GtkMenu *
+-create_status_menu (void)
+-{
+- GtkMenu *popup_menu = GTK_MENU (gtk_menu_new ());
+- int i = 0;
+-
+- GtkMenu *groups_menu = GTK_MENU (gtk_menu_new ());
+- gchar **current_name = gkbd_status_get_group_names ();
+-
+- GtkWidget *item = gtk_menu_item_new_with_mnemonic (_("_Layouts"));
+- gtk_widget_show (item);
+- gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
+- gtk_menu_item_set_submenu (GTK_MENU_ITEM (item),
+- GTK_WIDGET (groups_menu));
+-
+- item = gtk_menu_item_new_with_mnemonic (_("Show _Keyboard Layout..."));
+- gtk_widget_show (item);
+- g_signal_connect (item, "activate", popup_menu_show_layout, NULL);
+- gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
+-
+- /* translators note:
+- * This is the name of the cinnamon-settings "region" panel */
+- item = gtk_menu_item_new_with_mnemonic (_("Region and Language Settings"));
+- gtk_widget_show (item);
+- g_signal_connect (item, "activate", popup_menu_launch_capplet, NULL);
+- gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
+-
+- for (i = 0; current_name && *current_name; i++, current_name++) {
+-
+- gchar *image_file = gkbd_status_get_image_filename (i);
+-
+- if (image_file == NULL) {
+- item =
+- gtk_menu_item_new_with_label (*current_name);
+- } else {
+- GdkPixbuf *pixbuf =
+- gdk_pixbuf_new_from_file_at_size (image_file,
+- 24, 24,
+- NULL);
+- GtkWidget *img =
+- gtk_image_new_from_pixbuf (pixbuf);
+- item =
+- gtk_image_menu_item_new_with_label
+- (*current_name);
+- gtk_widget_show (img);
+- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM
+- (item), img);
+- gtk_image_menu_item_set_always_show_image
+- (GTK_IMAGE_MENU_ITEM (item), TRUE);
+- g_free (image_file);
+- }
+- gtk_widget_show (item);
+- gtk_menu_shell_append (GTK_MENU_SHELL (groups_menu), item);
+- g_signal_connect (item, "activate",
+- G_CALLBACK (popup_menu_set_group_cb),
+- GINT_TO_POINTER (i));
+- }
+-
+- return popup_menu;
+-}
+-
+-static void
+-status_icon_popup_menu_cb (GtkStatusIcon * icon, guint button, guint time)
+-{
+- GtkMenu *popup_menu = create_status_menu ();
+-
+- gtk_menu_popup (popup_menu, NULL, NULL,
+- gtk_status_icon_position_menu,
+- (gpointer) icon, button, time);
+-}
+-
+-static void
+-show_hide_icon ()
+-{
+- if (g_strv_length (current_kbd_config.layouts_variants) > 1) {
+- if (icon == NULL) {
+- xkl_debug (150, "Creating keyboard status icon\n");
+- icon = gkbd_status_new ();
+- g_signal_connect (icon, "popup-menu",
+- G_CALLBACK
+- (status_icon_popup_menu_cb),
+- NULL);
+-
+- }
+- } else {
+- if (icon != NULL) {
+- xkl_debug (150, "Destroying icon\n");
+- g_object_unref (icon);
+- icon = NULL;
+- }
+- }
+-}
+-
+-static gboolean
+-try_activating_xkb_config_if_new (GkbdKeyboardConfig *
+- current_sys_kbd_config)
+-{
+- /* Activate - only if different! */
+- if (!gkbd_keyboard_config_equals
+- (¤t_kbd_config, current_sys_kbd_config)) {
+- if (gkbd_keyboard_config_activate (¤t_kbd_config)) {
+- if (pa_callback != NULL) {
+- (*pa_callback) (pa_callback_user_data);
+- return TRUE;
+- }
+- } else {
+- return FALSE;
+- }
+- }
+- return TRUE;
+-}
+-
+-static gboolean
+-filter_xkb_config (void)
+-{
+- XklConfigItem *item;
+- gchar *lname;
+- gchar *vname;
+- gchar **lv;
+- gboolean any_change = FALSE;
+-
+- xkl_debug (100, "Filtering configuration against the registry\n");
+- if (!ensure_xkl_registry ())
+- return FALSE;
+-
+- lv = current_kbd_config.layouts_variants;
+- item = xkl_config_item_new ();
+- while (*lv) {
+- xkl_debug (100, "Checking [%s]\n", *lv);
+- if (gkbd_keyboard_config_split_items (*lv, &lname, &vname)) {
+- gboolean should_be_dropped = FALSE;
+- g_snprintf (item->name, sizeof (item->name), "%s",
+- lname);
+- if (!xkl_config_registry_find_layout
+- (xkl_registry, item)) {
+- xkl_debug (100, "Bad layout [%s]\n",
+- lname);
+- should_be_dropped = TRUE;
+- } else if (vname) {
+- g_snprintf (item->name,
+- sizeof (item->name), "%s",
+- vname);
+- if (!xkl_config_registry_find_variant
+- (xkl_registry, lname, item)) {
+- xkl_debug (100,
+- "Bad variant [%s(%s)]\n",
+- lname, vname);
+- should_be_dropped = TRUE;
+- }
+- }
+- if (should_be_dropped) {
+- gkbd_strv_behead (lv);
+- any_change = TRUE;
+- continue;
+- }
+- }
+- lv++;
+- }
+- g_object_unref (item);
+- return any_change;
+-}
+-
+-static void
+-apply_xkb_settings (void)
+-{
+- GkbdKeyboardConfig current_sys_kbd_config;
+-
+- if (!inited_ok)
+- return;
+-
+- gkbd_keyboard_config_init (¤t_sys_kbd_config, xkl_engine);
+-
+- gkbd_keyboard_config_load (¤t_kbd_config,
+- &initial_sys_kbd_config);
+-
+- gkbd_keyboard_config_load_from_x_current (¤t_sys_kbd_config,
+- NULL);
+-
+- if (!try_activating_xkb_config_if_new (¤t_sys_kbd_config)) {
+- if (filter_xkb_config ()) {
+- if (!try_activating_xkb_config_if_new
+- (¤t_sys_kbd_config)) {
+- g_warning
+- ("Could not activate the filtered XKB configuration");
+- activation_error ();
+- }
+- } else {
+- g_warning
+- ("Could not activate the XKB configuration");
+- activation_error ();
+- }
+- } else
+- xkl_debug (100,
+- "Actual KBD configuration was not changed: redundant notification\n");
+-
+- gkbd_keyboard_config_term (¤t_sys_kbd_config);
+- show_hide_icon ();
+-}
+-
+-static void
+-csd_keyboard_xkb_analyze_sysconfig (void)
+-{
+- if (!inited_ok)
+- return;
+-
+- gkbd_keyboard_config_init (&initial_sys_kbd_config, xkl_engine);
+- gkbd_keyboard_config_load_from_x_initial (&initial_sys_kbd_config,
+- NULL);
+-}
+-
+-void
+-csd_keyboard_xkb_set_post_activation_callback (PostActivationCallback fun,
+- void *user_data)
+-{
+- pa_callback = fun;
+- pa_callback_user_data = user_data;
+-}
+-
+-static GdkFilterReturn
+-csd_keyboard_xkb_evt_filter (GdkXEvent * xev, GdkEvent * event)
+-{
+- XEvent *xevent = (XEvent *) xev;
+- xkl_engine_filter_events (xkl_engine, xevent);
+- return GDK_FILTER_CONTINUE;
+-}
+-
+-/* When new Keyboard is plugged in - reload the settings */
+-static void
+-csd_keyboard_new_device (XklEngine * engine)
+-{
+- apply_desktop_settings ();
+- apply_xkb_settings ();
+-}
+-
+-void
+-csd_keyboard_xkb_init (CsdKeyboardManager * kbd_manager)
+-{
+- Display *display =
+- GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+- cinnamon_settings_profile_start (NULL);
+-
+- gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
+- DATADIR G_DIR_SEPARATOR_S
+- "icons");
+-
+- manager = kbd_manager;
+- cinnamon_settings_profile_start ("xkl_engine_get_instance");
+- xkl_engine = xkl_engine_get_instance (display);
+- cinnamon_settings_profile_end ("xkl_engine_get_instance");
+- if (xkl_engine) {
+- inited_ok = TRUE;
+-
+- gkbd_desktop_config_init (¤t_config, xkl_engine);
+- gkbd_keyboard_config_init (¤t_kbd_config,
+- xkl_engine);
+- xkl_engine_backup_names_prop (xkl_engine);
+- csd_keyboard_xkb_analyze_sysconfig ();
+-
+- settings_desktop = g_settings_new (GKBD_DESKTOP_SCHEMA);
+- settings_keyboard = g_settings_new (GKBD_KEYBOARD_SCHEMA);
+- g_signal_connect (settings_desktop, "changed",
+- (GCallback) apply_desktop_settings,
+- NULL);
+- g_signal_connect (settings_keyboard, "changed",
+- (GCallback) apply_xkb_settings, NULL);
+-
+- gdk_window_add_filter (NULL, (GdkFilterFunc)
+- csd_keyboard_xkb_evt_filter, NULL);
+-
+- if (xkl_engine_get_features (xkl_engine) &
+- XKLF_DEVICE_DISCOVERY)
+- g_signal_connect (xkl_engine, "X-new-device",
+- G_CALLBACK
+- (csd_keyboard_new_device), NULL);
+-
+- cinnamon_settings_profile_start ("xkl_engine_start_listen");
+- xkl_engine_start_listen (xkl_engine,
+- XKLL_MANAGE_LAYOUTS |
+- XKLL_MANAGE_WINDOW_STATES);
+- cinnamon_settings_profile_end ("xkl_engine_start_listen");
+-
+- cinnamon_settings_profile_start ("apply_desktop_settings");
+- apply_desktop_settings ();
+- cinnamon_settings_profile_end ("apply_desktop_settings");
+- cinnamon_settings_profile_start ("apply_xkb_settings");
+- apply_xkb_settings ();
+- cinnamon_settings_profile_end ("apply_xkb_settings");
+- }
+- preview_dialogs = g_hash_table_new (g_direct_hash, g_direct_equal);
+-
+- cinnamon_settings_profile_end (NULL);
+-}
+-
+-void
+-csd_keyboard_xkb_shutdown (void)
+-{
+- if (!inited_ok)
+- return;
+-
+- pa_callback = NULL;
+- pa_callback_user_data = NULL;
+- manager = NULL;
+-
+- if (preview_dialogs != NULL)
+- g_hash_table_destroy (preview_dialogs);
+-
+- if (!inited_ok)
+- return;
+-
+- xkl_engine_stop_listen (xkl_engine,
+- XKLL_MANAGE_LAYOUTS |
+- XKLL_MANAGE_WINDOW_STATES);
+-
+- gdk_window_remove_filter (NULL, (GdkFilterFunc)
+- csd_keyboard_xkb_evt_filter, NULL);
+-
+- g_object_unref (settings_desktop);
+- settings_desktop = NULL;
+- g_object_unref (settings_keyboard);
+- settings_keyboard = NULL;
+-
+- if (xkl_registry) {
+- g_object_unref (xkl_registry);
+- }
+-
+- g_object_unref (xkl_engine);
+-
+- xkl_engine = NULL;
+-
+- inited_ok = FALSE;
+-}
+diff -uNrp a/plugins/keyboard/csd-keyboard-xkb.h b/plugins/keyboard/csd-keyboard-xkb.h
+--- a/plugins/keyboard/csd-keyboard-xkb.h 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/csd-keyboard-xkb.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,39 +0,0 @@
+-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+- * cinnamon-settings-keyboard-xkb.h
+- *
+- * Copyright (C) 2001 Udaltsoft
+- *
+- * Written by Sergey V. Oudaltsov
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA
+- * 02110-1335, USA.
+- */
+-
+-#ifndef __CSD_KEYBOARD_XKB_H
+-#define __CSD_KEYBOARD_XKB_H
+-
+-#include
+-#include "csd-keyboard-manager.h"
+-
+-void csd_keyboard_xkb_init (CsdKeyboardManager *manager);
+-void csd_keyboard_xkb_shutdown (void);
+-
+-typedef void (*PostActivationCallback) (void *userData);
+-
+-void
+-csd_keyboard_xkb_set_post_activation_callback (PostActivationCallback fun,
+- void *userData);
+-
+-#endif
+diff -uNrp a/plugins/keyboard/delayed-dialog.c b/plugins/keyboard/delayed-dialog.c
+--- a/plugins/keyboard/delayed-dialog.c 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/delayed-dialog.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,128 +0,0 @@
+-/*
+- * Copyright © 2006 Novell, Inc.
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2, or (at
+- * your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but
+- * WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA
+- * 02110-1335, USA.
+- */
+-
+-#include
+-#include
+-
+-#include
+-#include
+-
+-#include "delayed-dialog.h"
+-
+-static gboolean delayed_show_timeout (gpointer data);
+-static GdkFilterReturn message_filter (GdkXEvent *xevent,
+- GdkEvent *event,
+- gpointer data);
+-
+-static GSList *dialogs = NULL;
+-
+-/**
+- * csd_delayed_show_dialog:
+- * @dialog: the dialog
+- *
+- * Shows the dialog as with gtk_widget_show(), unless a window manager
+- * hasn't been started yet, in which case it will wait up to 5 seconds
+- * for that to happen before showing the dialog.
+- **/
+-void
+-csd_delayed_show_dialog (GtkWidget *dialog)
+-{
+- GdkDisplay *display = gtk_widget_get_display (dialog);
+- Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
+- GdkScreen *screen = gtk_widget_get_screen (dialog);
+- char selection_name[10];
+- Atom selection_atom;
+-
+- /* We can't use gdk_selection_owner_get() for this, because
+- * it's an unknown out-of-process window.
+- */
+- snprintf (selection_name, sizeof (selection_name), "WM_S%d",
+- gdk_screen_get_number (screen));
+- selection_atom = XInternAtom (xdisplay, selection_name, True);
+- if (selection_atom &&
+- XGetSelectionOwner (xdisplay, selection_atom) != None) {
+- gtk_widget_show (dialog);
+- return;
+- }
+-
+- dialogs = g_slist_prepend (dialogs, dialog);
+-
+- gdk_window_add_filter (NULL, message_filter, NULL);
+-
+- g_timeout_add (5000, delayed_show_timeout, NULL);
+-}
+-
+-static gboolean
+-delayed_show_timeout (gpointer data)
+-{
+- GSList *l;
+-
+- for (l = dialogs; l; l = l->next)
+- gtk_widget_show (l->data);
+- g_slist_free (dialogs);
+- dialogs = NULL;
+-
+- /* FIXME: There's no gdk_display_remove_client_message_filter */
+-
+- return FALSE;
+-}
+-
+-static GdkFilterReturn
+-message_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data)
+-{
+- XClientMessageEvent *evt;
+- char *selection_name;
+- int screen;
+- GSList *l, *next;
+-
+- if (((XEvent *)xevent)->type != ClientMessage)
+- return GDK_FILTER_CONTINUE;
+-
+- evt = (XClientMessageEvent *)xevent;
+-
+- if (evt->message_type != XInternAtom (evt->display, "MANAGER", FALSE))
+- return GDK_FILTER_CONTINUE;
+-
+- selection_name = XGetAtomName (evt->display, evt->data.l[1]);
+-
+- if (strncmp (selection_name, "WM_S", 4) != 0) {
+- XFree (selection_name);
+- return GDK_FILTER_CONTINUE;
+- }
+-
+- screen = atoi (selection_name + 4);
+-
+- for (l = dialogs; l; l = next) {
+- GtkWidget *dialog = l->data;
+- next = l->next;
+-
+- if (gdk_screen_get_number (gtk_widget_get_screen (dialog)) == screen) {
+- gtk_widget_show (dialog);
+- dialogs = g_slist_remove (dialogs, dialog);
+- }
+- }
+-
+- if (!dialogs) {
+- gdk_window_remove_filter (NULL, message_filter, NULL);
+- }
+-
+- XFree (selection_name);
+-
+- return GDK_FILTER_CONTINUE;
+-}
+diff -uNrp a/plugins/keyboard/delayed-dialog.h b/plugins/keyboard/delayed-dialog.h
+--- a/plugins/keyboard/delayed-dialog.h 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/delayed-dialog.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,32 +0,0 @@
+-/*
+- * Copyright © 2006 Novell, Inc.
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2, or (at
+- * your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but
+- * WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA
+- * 02110-1335, USA.
+- */
+-
+-
+-#ifndef __DELAYED_DIALOG_H
+-#define __DELAYED_DIALOG_H
+-
+-#include
+-
+-G_BEGIN_DECLS
+-
+-void csd_delayed_show_dialog (GtkWidget *dialog);
+-
+-G_END_DECLS
+-
+-#endif
+diff -uNrp a/plugins/keyboard/gkbd-configuration.c b/plugins/keyboard/gkbd-configuration.c
+--- a/plugins/keyboard/gkbd-configuration.c 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/gkbd-configuration.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,350 +0,0 @@
+-/*
+- * Copyright (C) 2010 Canonical Ltd.
+- *
+- * Authors: Jan Arne Petersen
+- *
+- * Based on gkbd-status.c by Sergey V. Udaltsov
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
+- * Boston, MA 02110-1335, USA.
+- */
+-
+-#include
+-
+-#include
+-#include
+-#include
+-
+-#include
+-#include
+-
+-#include "gkbd-configuration.h"
+-
+-struct _GkbdConfigurationPrivate {
+- XklEngine *engine;
+- XklConfigRegistry *registry;
+-
+- GkbdDesktopConfig cfg;
+- GkbdIndicatorConfig ind_cfg;
+- GkbdKeyboardConfig kbd_cfg;
+-
+- gchar **full_group_names;
+- gchar **short_group_names;
+-
+- gulong state_changed_handler;
+- gulong config_changed_handler;
+-};
+-
+-enum {
+- SIGNAL_CHANGED,
+- SIGNAL_GROUP_CHANGED,
+- LAST_SIGNAL
+-};
+-
+-static guint signals[LAST_SIGNAL] = { 0, };
+-
+-#define GKBD_CONFIGURATION_GET_PRIVATE(o) \
+- (G_TYPE_INSTANCE_GET_PRIVATE ((o), GKBD_TYPE_CONFIGURATION, GkbdConfigurationPrivate))
+-
+-G_DEFINE_TYPE (GkbdConfiguration, gkbd_configuration, G_TYPE_OBJECT)
+-
+-/* Should be called once for all widgets */
+-static void
+-gkbd_configuration_cfg_changed (GSettings *settings,
+- const char *key,
+- GkbdConfiguration * configuration)
+-{
+- GkbdConfigurationPrivate *priv = configuration->priv;
+-
+- xkl_debug (100,
+- "General configuration changed in GSettings - reiniting...\n");
+- gkbd_desktop_config_load (&priv->cfg);
+- gkbd_desktop_config_activate (&priv->cfg);
+-
+- g_signal_emit (configuration,
+- signals[SIGNAL_CHANGED], 0);
+-}
+-
+-/* Should be called once for all widgets */
+-static void
+-gkbd_configuration_ind_cfg_changed (GSettings *settings,
+- const char *key,
+- GkbdConfiguration * configuration)
+-{
+- GkbdConfigurationPrivate *priv = configuration->priv;
+- xkl_debug (100,
+- "Applet configuration changed in GSettings - reiniting...\n");
+- gkbd_indicator_config_load (&priv->ind_cfg);
+-
+- gkbd_indicator_config_free_image_filenames (&priv->ind_cfg);
+- gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
+- &priv->kbd_cfg);
+-
+- gkbd_indicator_config_activate (&priv->ind_cfg);
+-
+- g_signal_emit (configuration,
+- signals[SIGNAL_CHANGED], 0);
+-}
+-
+-static void
+-gkbd_configuration_load_group_names (GkbdConfiguration * configuration,
+- XklConfigRec * xklrec)
+-{
+- GkbdConfigurationPrivate *priv = configuration->priv;
+-
+- if (!gkbd_desktop_config_load_group_descriptions (&priv->cfg,
+- priv->registry,
+- (const char **) xklrec->layouts,
+- (const char **) xklrec->variants,
+- &priv->short_group_names,
+- &priv->full_group_names)) {
+- /* We just populate no short names (remain NULL) -
+- * full names are going to be used anyway */
+- gint i, total_groups =
+- xkl_engine_get_num_groups (priv->engine);
+- xkl_debug (150, "group descriptions loaded: %d!\n",
+- total_groups);
+- priv->full_group_names =
+- g_new0 (char *, total_groups + 1);
+-
+- if (xkl_engine_get_features (priv->engine) &
+- XKLF_MULTIPLE_LAYOUTS_SUPPORTED) {
+- for (i = 0; priv->kbd_cfg.layouts_variants[i]; i++) {
+- priv->full_group_names[i] =
+- g_strdup ((char *) priv->kbd_cfg.layouts_variants[i]);
+- }
+- } else {
+- for (i = total_groups; --i >= 0;) {
+- priv->full_group_names[i] =
+- g_strdup_printf ("Group %d", i);
+- }
+- }
+- }
+-}
+-
+-/* Should be called once for all widgets */
+-static void
+-gkbd_configuration_kbd_cfg_callback (XklEngine *engine,
+- GkbdConfiguration *configuration)
+-{
+- GkbdConfigurationPrivate *priv = configuration->priv;
+- XklConfigRec *xklrec = xkl_config_rec_new ();
+- xkl_debug (100,
+- "XKB configuration changed on X Server - reiniting...\n");
+-
+- gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg,
+- xklrec);
+-
+- gkbd_indicator_config_free_image_filenames (&priv->ind_cfg);
+- gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
+- &priv->kbd_cfg);
+-
+- g_strfreev (priv->full_group_names);
+- priv->full_group_names = NULL;
+-
+- g_strfreev (priv->short_group_names);
+- priv->short_group_names = NULL;
+-
+- gkbd_configuration_load_group_names (configuration,
+- xklrec);
+-
+- g_signal_emit (configuration,
+- signals[SIGNAL_CHANGED],
+- 0);
+-
+- g_object_unref (G_OBJECT (xklrec));
+-}
+-
+-/* Should be called once for all applets */
+-static void
+-gkbd_configuration_state_callback (XklEngine * engine,
+- XklEngineStateChange changeType,
+- gint group, gboolean restore,
+- GkbdConfiguration * configuration)
+-{
+- xkl_debug (150, "group is now %d, restore: %d\n", group, restore);
+-
+- if (changeType == GROUP_CHANGED) {
+- g_signal_emit (configuration,
+- signals[SIGNAL_GROUP_CHANGED], 0,
+- group);
+- }
+-}
+-
+-static void
+-gkbd_configuration_init (GkbdConfiguration *configuration)
+-{
+- GkbdConfigurationPrivate *priv;
+- XklConfigRec *xklrec = xkl_config_rec_new ();
+-
+- priv = GKBD_CONFIGURATION_GET_PRIVATE (configuration);
+- configuration->priv = priv;
+-
+- priv->engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+- if (priv->engine == NULL) {
+- xkl_debug (0, "Libxklavier initialization error");
+- return;
+- }
+-
+- priv->state_changed_handler =
+- g_signal_connect (priv->engine, "X-state-changed",
+- G_CALLBACK (gkbd_configuration_state_callback),
+- configuration);
+- priv->config_changed_handler =
+- g_signal_connect (priv->engine, "X-config-changed",
+- G_CALLBACK (gkbd_configuration_kbd_cfg_callback),
+- configuration);
+-
+- gkbd_desktop_config_init (&priv->cfg, priv->engine);
+- gkbd_keyboard_config_init (&priv->kbd_cfg, priv->engine);
+- gkbd_indicator_config_init (&priv->ind_cfg, priv->engine);
+-
+- gkbd_desktop_config_load (&priv->cfg);
+- gkbd_desktop_config_activate (&priv->cfg);
+-
+- priv->registry = xkl_config_registry_get_instance (priv->engine);
+- xkl_config_registry_load (priv->registry,
+- priv->cfg.load_extra_items);
+-
+- gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg,
+- xklrec);
+-
+- gkbd_indicator_config_load (&priv->ind_cfg);
+-
+- gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
+- &priv->kbd_cfg);
+-
+- gkbd_indicator_config_activate (&priv->ind_cfg);
+-
+- gkbd_configuration_load_group_names (configuration,
+- xklrec);
+- g_object_unref (G_OBJECT (xklrec));
+-
+- gkbd_desktop_config_start_listen (&priv->cfg,
+- G_CALLBACK (gkbd_configuration_cfg_changed),
+- configuration);
+- gkbd_indicator_config_start_listen (&priv->ind_cfg,
+- G_CALLBACK (gkbd_configuration_ind_cfg_changed),
+- configuration);
+- xkl_engine_start_listen (priv->engine,
+- XKLL_TRACK_KEYBOARD_STATE);
+-
+- xkl_debug (100, "Initiating the widget startup process for %p\n",
+- configuration);
+-}
+-
+-static void
+-gkbd_configuration_finalize (GObject * obj)
+-{
+- GkbdConfiguration *configuration = GKBD_CONFIGURATION (obj);
+- GkbdConfigurationPrivate *priv = configuration->priv;
+-
+- xkl_debug (100,
+- "Starting the gnome-kbd-configuration widget shutdown process for %p\n",
+- configuration);
+-
+- xkl_engine_stop_listen (priv->engine,
+- XKLL_TRACK_KEYBOARD_STATE);
+-
+- gkbd_desktop_config_stop_listen (&priv->cfg);
+- gkbd_indicator_config_stop_listen (&priv->ind_cfg);
+-
+- gkbd_indicator_config_term (&priv->ind_cfg);
+- gkbd_keyboard_config_term (&priv->kbd_cfg);
+- gkbd_desktop_config_term (&priv->cfg);
+-
+- if (g_signal_handler_is_connected (priv->engine,
+- priv->state_changed_handler)) {
+- g_signal_handler_disconnect (priv->engine,
+- priv->state_changed_handler);
+- priv->state_changed_handler = 0;
+- }
+- if (g_signal_handler_is_connected (priv->engine,
+- priv->config_changed_handler)) {
+- g_signal_handler_disconnect (priv->engine,
+- priv->config_changed_handler);
+- priv->config_changed_handler = 0;
+- }
+-
+- g_object_unref (priv->registry);
+- priv->registry = NULL;
+- g_object_unref (priv->engine);
+- priv->engine = NULL;
+-
+- G_OBJECT_CLASS (gkbd_configuration_parent_class)->finalize (obj);
+-}
+-
+-static void
+-gkbd_configuration_class_init (GkbdConfigurationClass * klass)
+-{
+- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
+- /* Initing vtable */
+- object_class->finalize = gkbd_configuration_finalize;
+-
+- /* Signals */
+- signals[SIGNAL_CHANGED] = g_signal_new ("changed",
+- GKBD_TYPE_CONFIGURATION,
+- G_SIGNAL_RUN_LAST,
+- 0,
+- NULL, NULL,
+- g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE,
+- 0);
+- signals[SIGNAL_GROUP_CHANGED] = g_signal_new ("group-changed",
+- GKBD_TYPE_CONFIGURATION,
+- G_SIGNAL_RUN_LAST,
+- 0,
+- NULL, NULL,
+- g_cclosure_marshal_VOID__INT,
+- G_TYPE_NONE,
+- 1,
+- G_TYPE_INT);
+-
+- g_type_class_add_private (klass, sizeof (GkbdConfigurationPrivate));
+-}
+-
+-GkbdConfiguration *
+-gkbd_configuration_get (void)
+-{
+- static gpointer instance = NULL;
+-
+- if (!instance) {
+- instance = g_object_new (GKBD_TYPE_CONFIGURATION, NULL);
+- g_object_add_weak_pointer (instance, &instance);
+- } else {
+- g_object_ref (instance);
+- }
+-
+- return instance;
+-}
+-
+-XklEngine *
+-gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration)
+-{
+- return configuration->priv->engine;
+-}
+-
+-const char * const *
+-gkbd_configuration_get_group_names (GkbdConfiguration *configuration)
+-{
+- return configuration->priv->full_group_names;
+-}
+-
+-const char * const *
+-gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration)
+-{
+- return configuration->priv->short_group_names;
+-}
+diff -uNrp a/plugins/keyboard/gkbd-configuration.h b/plugins/keyboard/gkbd-configuration.h
+--- a/plugins/keyboard/gkbd-configuration.h 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/gkbd-configuration.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,65 +0,0 @@
+-/*
+- * Copyright (C) 2010 Canonical Ltd.
+- *
+- * Authors: Jan Arne Petersen
+- *
+- * Based on gkbd-status.h by Sergey V. Udaltsov
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Lesser General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
+- * Boston, MA 02110-1335, USA.
+- */
+-
+-#ifndef __GKBD_CONFIGURATION_H__
+-#define __GKBD_CONFIGURATION_H__
+-
+-#include
+-
+-#include
+-
+-G_BEGIN_DECLS
+-
+-typedef struct _GkbdConfiguration GkbdConfiguration;
+-typedef struct _GkbdConfigurationPrivate GkbdConfigurationPrivate;
+-typedef struct _GkbdConfigurationClass GkbdConfigurationClass;
+-
+-#define GKBD_TYPE_CONFIGURATION (gkbd_configuration_get_type ())
+-#define GKBD_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfiguration))
+-#define GKBD_INDCATOR_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass))
+-#define GKBD_IS_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKBD_TYPE_CONFIGURATION))
+-#define GKBD_IS_CONFIGURATION_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GKBD_TYPE_CONFIGURATION))
+-#define GKBD_CONFIGURATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass))
+-
+-struct _GkbdConfiguration {
+- GObject parent;
+-
+- GkbdConfigurationPrivate *priv;
+-};
+-
+-struct _GkbdConfigurationClass {
+- GObjectClass parent_class;
+-};
+-
+-extern GType gkbd_configuration_get_type (void);
+-
+-extern GkbdConfiguration *gkbd_configuration_get (void);
+-
+-extern XklEngine *gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration);
+-
+-extern const char * const *gkbd_configuration_get_group_names (GkbdConfiguration *configuration);
+-extern const char * const *gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration);
+-
+-G_END_DECLS
+-
+-#endif
+diff -uNrp a/plugins/keyboard/.indent.pro b/plugins/keyboard/.indent.pro
+--- a/plugins/keyboard/.indent.pro 1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/keyboard/.indent.pro 2013-08-25 16:36:02.000000000 +0100
+@@ -0,0 +1,2 @@
++-kr -i8 -pcs -lps -psl
++
+diff -uNrp a/plugins/keyboard/Makefile.am b/plugins/keyboard/Makefile.am
+--- a/plugins/keyboard/Makefile.am 2013-08-24 18:04:31.000000000 +0100
++++ b/plugins/keyboard/Makefile.am 2013-08-25 16:36:02.000000000 +0100
+@@ -20,25 +20,20 @@ libkeyboard_la_SOURCES = \
+ csd-keyboard-plugin.c \
+ csd-keyboard-manager.h \
+ csd-keyboard-manager.c \
+- csd-keyboard-xkb.h \
+- csd-keyboard-xkb.c \
+- delayed-dialog.h \
+- delayed-dialog.c \
+- gkbd-configuration.c \
+- gkbd-configuration.h \
+ $(NULL)
+
+ libkeyboard_la_CPPFLAGS = \
+ -I$(top_srcdir)/cinnamon-settings-daemon \
+ -I$(top_srcdir)/data \
++ -I$(top_srcdir)/plugins/common \
+ -DDATADIR=\""$(pkgdatadir)"\" \
++ -DLIBEXECDIR=\""$(libexecdir)"\" \
+ -DCINNAMON_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
+ $(AM_CPPFLAGS)
+
+ libkeyboard_la_CFLAGS = \
+ $(PLUGIN_CFLAGS) \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+- $(APPINDICATOR_CFLAGS) \
+ $(KEYBOARD_CFLAGS) \
+ $(AM_CFLAGS)
+
+@@ -46,19 +41,63 @@ libkeyboard_la_LDFLAGS = \
+ $(CSD_PLUGIN_LDFLAGS) \
+ $(NULL)
+
+-libkeyboard_la_LIBADD = \
+- $(SETTINGS_PLUGIN_LIBS) \
+- $(XF86MISC_LIBS) \
+- $(KEYBOARD_LIBS) \
+- $(APPINDICATOR_LIBS) \
++libkeyboard_la_LIBADD = \
++ $(top_builddir)/plugins/common/libcommon.la \
++ $(SETTINGS_PLUGIN_LIBS) \
++ $(XF86MISC_LIBS) \
++ $(KEYBOARD_LIBS) \
+ $(NULL)
+
++libexec_PROGRAMS = csd-test-keyboard
++csd_test_keyboard_SOURCES = \
++ test-keyboard.c \
++ csd-keyboard-manager.h \
++ csd-keyboard-manager.c \
++ $(NULL)
++
++csd_test_keyboard_CFLAGS = $(libkeyboard_la_CFLAGS)
++csd_test_keyboard_CPPFLAGS = $(libkeyboard_la_CPPFLAGS)
++csd_test_keyboard_LDADD = $(libkeyboard_la_LIBADD) $(top_builddir)/cinnamon-settings-daemon/libcsd.la
++
+ plugin_in_files = \
+ keyboard.cinnamon-settings-plugin.in \
+ $(NULL)
+
+ plugin_DATA = $(plugin_in_files:.cinnamon-settings-plugin.in=.cinnamon-settings-plugin)
+
++if HAVE_IBUS
++noinst_PROGRAMS = test-keyboard-ibus-utils
++test_keyboard_ibus_utils_SOURCES = test-keyboard-ibus-utils.c
++test_keyboard_ibus_utils_CFLAGS = $(libkeyboard_la_CFLAGS)
++test_keyboard_ibus_utils_CPPFLAGS = $(libkeyboard_la_CPPFLAGS)
++test_keyboard_ibus_utils_LDADD = $(libkeyboard_la_LIBADD) $(top_builddir)/cinnamon-settings-daemon/libcsd.la
++
++check-local: test-keyboard-ibus-utils
++ $(builddir)/test-keyboard-ibus-utils > /dev/null
++endif
++
++libexec_PROGRAMS += csd-input-sources-switcher
++
++csd_input_sources_switcher_SOURCES = \
++ csd-input-sources-switcher.c \
++ $(NULL)
++
++csd_input_sources_switcher_CPPFLAGS = \
++ -I$(top_srcdir)/data \
++ -I$(top_srcdir)/plugins/common \
++ $(AM_CPPFLAGS) \
++ $(NULL)
++
++csd_input_sources_switcher_CFLAGS = \
++ $(SETTINGS_PLUGIN_CFLAGS) \
++ $(AM_CFLAGS) \
++ $(NULL)
++
++csd_input_sources_switcher_LDADD = \
++ $(top_builddir)/plugins/common/libcommon.la \
++ $(SETTINGS_PLUGIN_LIBS) \
++ $(NULL)
++
+ EXTRA_DIST = \
+ $(icons_DATA) \
+ $(plugin_in_files) \
+diff -uNrp a/plugins/keyboard/test-keyboard.c b/plugins/keyboard/test-keyboard.c
+--- a/plugins/keyboard/test-keyboard.c 1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/keyboard/test-keyboard.c 2013-08-25 16:36:02.000000000 +0100
+@@ -0,0 +1,7 @@
++#define NEW csd_keyboard_manager_new
++#define START csd_keyboard_manager_start
++#define STOP csd_keyboard_manager_stop
++#define MANAGER CsdKeyboardManager
++#include "csd-keyboard-manager.h"
++
++#include "test-plugin.h"
+diff -uNrp a/plugins/keyboard/test-keyboard-ibus-utils.c b/plugins/keyboard/test-keyboard-ibus-utils.c
+--- a/plugins/keyboard/test-keyboard-ibus-utils.c 1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/keyboard/test-keyboard-ibus-utils.c 2013-08-25 16:36:02.000000000 +0100
+@@ -0,0 +1,116 @@
++#include "csd-keyboard-manager.c"
++
++static void
++test_make_xkb_source_id (void)
++{
++ gint i;
++ const gchar *test_strings[][2] = {
++ /* input output */
++ { "xkb:aa:bb:cc", "aa+bb" },
++ { "xkb:aa:bb:", "aa+bb" },
++ { "xkb:aa::cc", "aa" },
++ { "xkb:aa::", "aa" },
++ { "xkb::bb:cc", "+bb" },
++ { "xkb::bb:", "+bb" },
++ { "xkb:::cc", "" },
++ { "xkb:::", "" },
++ };
++
++ for (i = 0; i < G_N_ELEMENTS (test_strings); ++i)
++ g_assert_cmpstr (make_xkb_source_id (test_strings[i][0]), ==, test_strings[i][1]);
++}
++
++static void
++test_layout_from_ibus_layout (void)
++{
++ gint i;
++ const gchar *test_strings[][2] = {
++ /* input output */
++ { "", "" },
++ { "a", "a" },
++ { "a(", "a" },
++ { "a[", "a" },
++ };
++
++ for (i = 0; i < G_N_ELEMENTS (test_strings); ++i)
++ g_assert_cmpstr (layout_from_ibus_layout (test_strings[i][0]), ==, test_strings[i][1]);
++}
++
++static void
++test_variant_from_ibus_layout (void)
++{
++ gint i;
++ const gchar *test_strings[][2] = {
++ /* input output */
++ { "", NULL },
++ { "a", NULL },
++ { "(", NULL },
++ { "()", "" },
++ { "(b)", "b" },
++ { "a(", NULL },
++ { "a()", "" },
++ { "a(b)", "b" },
++ };
++
++ for (i = 0; i < G_N_ELEMENTS (test_strings); ++i)
++ g_assert_cmpstr (variant_from_ibus_layout (test_strings[i][0]), ==, test_strings[i][1]);
++}
++
++static void
++test_options_from_ibus_layout (void)
++{
++ gint i, j;
++ gchar *output_0[] = {
++ NULL
++ };
++ gchar *output_1[] = {
++ "",
++ NULL
++ };
++ gchar *output_2[] = {
++ "b",
++ NULL
++ };
++ gchar *output_3[] = {
++ "b", "",
++ NULL
++ };
++ gchar *output_4[] = {
++ "b", "c",
++ NULL
++ };
++ const gpointer tests[][2] = {
++ /* input output */
++ { "", NULL },
++ { "a", NULL },
++ { "a[", output_0 },
++ { "a[]", output_1 },
++ { "a[b]", output_2 },
++ { "a[b,]", output_3 },
++ { "a[b,c]", output_4 },
++ };
++
++ for (i = 0; i < G_N_ELEMENTS (tests); ++i) {
++ if (tests[i][1] == NULL) {
++ g_assert (options_from_ibus_layout (tests[i][0]) == NULL);
++ } else {
++ gchar **strv_a = options_from_ibus_layout (tests[i][0]);
++ gchar **strv_b = tests[i][1];
++
++ g_assert (g_strv_length (strv_a) == g_strv_length (strv_b));
++ for (j = 0; j < g_strv_length (strv_a); ++j)
++ g_assert_cmpstr (strv_a[j], ==, strv_b[j]);
++ }
++ }
++}
++
++int
++main (void)
++{
++ test_make_xkb_source_id ();
++ test_layout_from_ibus_layout ();
++ test_variant_from_ibus_layout ();
++ test_options_from_ibus_layout ();
++
++ return 0;
++}
+diff -uNrp a/plugins/keyboard/xxx/csd-keyboard-xkb.c b/plugins/keyboard/xxx/csd-keyboard-xkb.c
+--- a/plugins/keyboard/xxx/csd-keyboard-xkb.c 1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/keyboard/xxx/csd-keyboard-xkb.c 2013-08-25 16:36:02.000000000 +0100
+@@ -0,0 +1,579 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2001 Udaltsoft
++ *
++ * Written by Sergey V. Oudaltsov
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA
++ * 02110-1335, USA.
++ */
++
++#include "config.h"
++
++#include
++#include
++
++#include
++#include
++#include
++#include
++
++#include