mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-10-30 14:11:21 +00:00
Merge branch 'master' into staging
Resolved the following conflicts (by carefully applying patches from the both branches since the fork point): pkgs/development/libraries/epoxy/default.nix pkgs/development/libraries/gtk+/3.x.nix pkgs/development/python-modules/asgiref/default.nix pkgs/development/python-modules/daphne/default.nix pkgs/os-specific/linux/systemd/default.nix
This commit is contained in:
commit
7079e744d4
@ -39,6 +39,9 @@ nix-repl> :l <nixpkgs>
|
||||
nix-repl> texlive.collection-<TAB>
|
||||
</programlisting>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Note that the wrapper assumes that the result has a chance to be useful. For example, the core executables should be present, as well as some core data files. The supported way of ensuring this is by including some scheme, for example <varname>scheme-basic</varname>, into the combination.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
|
||||
|
@ -155,12 +155,6 @@ rec {
|
||||
outPath = assert condition; drv.outPath;
|
||||
};
|
||||
|
||||
/* Add attributes to each output of a derivation without changing
|
||||
the derivation itself. */
|
||||
addPassthru =
|
||||
lib.warn "`addPassthru drv passthru` is deprecated, replace with `extendDerivation true passthru drv`"
|
||||
(drv: passthru: extendDerivation true passthru drv);
|
||||
|
||||
/* Strip a derivation of all non-essential attributes, returning
|
||||
only those needed by hydra-eval-jobs. Also strictly evaluate the
|
||||
result to ensure that there are no thunks kept alive to prevent
|
||||
|
@ -21,10 +21,10 @@ let
|
||||
|
||||
# packaging
|
||||
customisation = callLibs ./customisation.nix;
|
||||
maintainers = callLibs ./maintainers.nix;
|
||||
maintainers = import ../maintainers/maintainer-list.nix;
|
||||
meta = callLibs ./meta.nix;
|
||||
sources = callLibs ./sources.nix;
|
||||
|
||||
versions = callLibs ./versions.nix;
|
||||
|
||||
# module system
|
||||
modules = callLibs ./modules.nix;
|
||||
@ -88,7 +88,7 @@ let
|
||||
inherit (stringsWithDeps) textClosureList textClosureMap
|
||||
noDepEntry fullDepEntry packEntry stringAfter;
|
||||
inherit (customisation) overrideDerivation makeOverridable
|
||||
callPackageWith callPackagesWith extendDerivation addPassthru
|
||||
callPackageWith callPackagesWith extendDerivation
|
||||
hydraJob makeScope;
|
||||
inherit (meta) addMetaAttrs dontDistribute setName updateName
|
||||
appendToName mapDerivationAttrset lowPrio lowPrioSet hiPrio
|
||||
|
@ -1,806 +0,0 @@
|
||||
{ ...}:
|
||||
/* List of NixOS maintainers. The format is:
|
||||
|
||||
handle = "Real Name <address@example.org>";
|
||||
|
||||
where <handle> is preferred to be your GitHub username (so it's easy
|
||||
to ping a package @<handle>), and <Real Name> is your real name, not
|
||||
a pseudonym. Please keep the list alphabetically sorted. */
|
||||
{
|
||||
a1russell = "Adam Russell <adamlr6+pub@gmail.com>";
|
||||
aaronschif = "Aaron Schif <aaronschif@gmail.com>";
|
||||
abaldeau = "Andreas Baldeau <andreas@baldeau.net>";
|
||||
abbradar = "Nikolay Amiantov <ab@fmap.me>";
|
||||
abigailbuccaneer = "Abigail Bunyan <abigailbuccaneer@gmail.com>";
|
||||
aboseley = "Adam Boseley <adam.boseley@gmail.com>";
|
||||
abuibrahim = "Ruslan Babayev <ruslan@babayev.com>";
|
||||
acowley = "Anthony Cowley <acowley@gmail.com>";
|
||||
adelbertc = "Adelbert Chang <adelbertc@gmail.com>";
|
||||
adev = "Adrien Devresse <adev@adev.name>";
|
||||
adisbladis = "Adam Hose <adis@blad.is>";
|
||||
Adjective-Object = "Maxwell Huang-Hobbs <mhuan13@gmail.com>";
|
||||
adnelson = "Allen Nelson <ithinkican@gmail.com>";
|
||||
adolfogc = "Adolfo E. García Castro <adolfo.garcia.cr@gmail.com>";
|
||||
aespinosa = "Allan Espinosa <allan.espinosa@outlook.com>";
|
||||
aflatter = "Alexander Flatter <flatter@fastmail.fm>";
|
||||
afldcr = "James Alexander Feldman-Crough <alex@fldcr.com>";
|
||||
aforemny = "Alexander Foremny <alexanderforemny@googlemail.com>";
|
||||
afranchuk = "Alex Franchuk <alex.franchuk@gmail.com>";
|
||||
aherrmann = "Andreas Herrmann <andreash87@gmx.ch>";
|
||||
ahmedtd = "Taahir Ahmed <ahmed.taahir@gmail.com>";
|
||||
aij = "Ivan Jager <aij+git@mrph.org>";
|
||||
ajgrf = "Alex Griffin <a@ajgrf.com>";
|
||||
ak = "Alexander Kjeldaas <ak@formalprivacy.com>";
|
||||
akaWolf = "Artjom Vejsel <akawolf0@gmail.com>";
|
||||
akc = "Anders Claesson <akc@akc.is>";
|
||||
alexvorobiev = "Alex Vorobiev <alexander.vorobiev@gmail.com";
|
||||
algorith = "Dries Van Daele <dries_van_daele@telenet.be>";
|
||||
alibabzo = "Alistair Bill <alistair.bill@gmail.com>";
|
||||
all = "Nix Committers <nix-commits@lists.science.uu.nl>";
|
||||
alunduil = "Alex Brandt <alunduil@alunduil.com>";
|
||||
ambrop72 = "Ambroz Bizjak <ambrop7@gmail.com>";
|
||||
amiddelk = "Arie Middelkoop <amiddelk@gmail.com>";
|
||||
amiloradovsky = "Andrew Miloradovsky <miloradovsky@gmail.com>";
|
||||
amorsillo = "Andrew Morsillo <andrew.morsillo@gmail.com>";
|
||||
AndersonTorres = "Anderson Torres <torres.anderson.85@gmail.com>";
|
||||
anderspapitto = "Anders Papitto <anderspapitto@gmail.com>";
|
||||
andir = "Andreas Rammhold <andreas@rammhold.de>";
|
||||
andres = "Andres Loeh <ksnixos@andres-loeh.de>";
|
||||
andrestylianos = "Andre S. Ramos <andre.stylianos@gmail.com>";
|
||||
andrew-d = "Andrew Dunham <andrew@du.nham.ca>";
|
||||
andrewrk = "Andrew Kelley <superjoe30@gmail.com>";
|
||||
andsild = "Anders Sildnes <andsild@gmail.com>";
|
||||
aneeshusa = "Aneesh Agrawal <aneeshusa@gmail.com>";
|
||||
ankhers = "Justin Wood <justin.k.wood@gmail.com>";
|
||||
antono = "Antono Vasiljev <self@antono.info>";
|
||||
antonxy = "Anton Schirg <anton.schirg@posteo.de>";
|
||||
apeschar = "Albert Peschar <albert@peschar.net>";
|
||||
apeyroux = "Alexandre Peyroux <alex@px.io>";
|
||||
arcadio = "Arcadio Rubio García <arc@well.ox.ac.uk>";
|
||||
ardumont = "Antoine R. Dumont <eniotna.t@gmail.com>";
|
||||
aristid = "Aristid Breitkreuz <aristidb@gmail.com>";
|
||||
arobyn = "Alexei Robyn <shados@shados.net>";
|
||||
artuuge = "Artur E. Ruuge <artuuge@gmail.com>";
|
||||
ashalkhakov = "Artyom Shalkhakov <artyom.shalkhakov@gmail.com>";
|
||||
ashgillman = "Ashley Gillman <gillmanash@gmail.com>";
|
||||
aske = "Kirill Boltaev <aske@fmap.me>";
|
||||
asppsa = "Alastair Pharo <asppsa@gmail.com>";
|
||||
astsmtl = "Alexander Tsamutali <astsmtl@yandex.ru>";
|
||||
asymmetric = "Lorenzo Manacorda <lorenzo@mailbox.org>";
|
||||
aszlig = "aszlig <aszlig@nix.build>";
|
||||
auntie = "Jonathan Glines <auntieNeo@gmail.com>";
|
||||
avnik = "Alexander V. Nikolaev <avn@avnik.info>";
|
||||
aycanirican = "Aycan iRiCAN <iricanaycan@gmail.com>";
|
||||
babariviere = "Bastien Riviere <babariviere@protonmail.com>";
|
||||
bachp = "Pascal Bach <pascal.bach@nextrem.ch>";
|
||||
backuitist = "Bruno Bieth";
|
||||
badi = "Badi' Abdul-Wahid <abdulwahidc@gmail.com>";
|
||||
balajisivaraman = "Balaji Sivaraman <sivaraman.balaji@gmail.com>";
|
||||
barrucadu = "Michael Walker <mike@barrucadu.co.uk>";
|
||||
basvandijk = "Bas van Dijk <v.dijk.bas@gmail.com>";
|
||||
Baughn = "Svein Ove Aas <sveina@gmail.com>";
|
||||
bcarrell = "Brandon Carrell <brandoncarrell@gmail.com>";
|
||||
bcdarwin = "Ben Darwin <bcdarwin@gmail.com>";
|
||||
bdimcheff = "Brandon Dimcheff <brandon@dimcheff.com>";
|
||||
bendlas = "Herwig Hochleitner <herwig@bendlas.net>";
|
||||
benley = "Benjamin Staffin <benley@gmail.com>";
|
||||
bennofs = "Benno Fünfstück <benno.fuenfstueck@gmail.com>";
|
||||
benwbooth = "Ben Booth <benwbooth@gmail.com>";
|
||||
berce = "Bert Moens <bert.moens@gmail.com>";
|
||||
berdario = "Dario Bertini <berdario@gmail.com>";
|
||||
bergey = "Daniel Bergey <bergey@teallabs.org>";
|
||||
bhipple = "Benjamin Hipple <bhipple@protonmail.com>";
|
||||
binarin = "Alexey Lebedeff <binarin@binarin.ru>";
|
||||
bjg = "Brian Gough <bjg@gnu.org>";
|
||||
bjornfor = "Bjørn Forsman <bjorn.forsman@gmail.com>";
|
||||
bluescreen303 = "Mathijs Kwik <mathijs@bluescreen303.nl>";
|
||||
bobakker = "Bo Bakker <bobakk3r@gmail.com>";
|
||||
bobvanderlinden = "Bob van der Linden <bobvanderlinden@gmail.com>";
|
||||
bodil = "Bodil Stokke <nix@bodil.org>";
|
||||
boothead = "Ben Ford <ben@perurbis.com>";
|
||||
bosu = "Boris Sukholitko <boriss@gmail.com>";
|
||||
bradediger = "Brad Ediger <brad@bradediger.com>";
|
||||
bramd = "Bram Duvigneau <bram@bramd.nl>";
|
||||
bstrik = "Berno Strik <dutchman55@gmx.com>";
|
||||
bugworm = "Roman Gerasimenko <bugworm@zoho.com>";
|
||||
bzizou = "Bruno Bzeznik <Bruno@bzizou.net>";
|
||||
c0bw3b = "Renaud <c0bw3b@gmail.com>";
|
||||
c0dehero = "CodeHero <codehero@nerdpol.ch>";
|
||||
calbrecht = "Christian Albrecht <christian.albrecht@mayflower.de>";
|
||||
calrama = "Moritz Maxeiner <moritz@ucworks.org>";
|
||||
calvertvl = "Victor Calvert <calvertvl@gmail.com>";
|
||||
campadrenalin = "Philip Horger <campadrenalin@gmail.com>";
|
||||
canndrew = "Andrew Cann <shum@canndrew.org>";
|
||||
carlsverre = "Carl Sverre <accounts@carlsverre.com>";
|
||||
casey = "Casey Rodarmor <casey@rodarmor.net>";
|
||||
catern = "Spencer Baugh <sbaugh@catern.com>";
|
||||
caugner = "Claas Augner <nixos@caugner.de>";
|
||||
cdepillabout = "Dennis Gosnell <cdep.illabout@gmail.com>";
|
||||
cfouche = "Chaddaï Fouché <chaddai.fouche@gmail.com>";
|
||||
changlinli = "Changlin Li <mail@changlinli.com>";
|
||||
chaoflow = "Florian Friesdorf <flo@chaoflow.net>";
|
||||
chattered = "Phil Scott <me@philscotted.com>";
|
||||
ChengCat = "Yucheng Zhang <yu@cheng.cat>";
|
||||
chiiruno = "Okina Matara <okinan@protonmail.com>";
|
||||
choochootrain = "Hurshal Patel <hurshal@imap.cc>";
|
||||
chpatrick = "Patrick Chilton <chpatrick@gmail.com>";
|
||||
chreekat = "Bryan Richter <b@chreekat.net>";
|
||||
chris-martin = "Chris Martin <ch.martin@gmail.com>";
|
||||
chrisjefferson = "Christopher Jefferson <chris@bubblescope.net>";
|
||||
chrisrosset = "Christopher Rosset <chris@rosset.org.uk>";
|
||||
christopherpoole = "Christopher Mark Poole <mail@christopherpoole.net>";
|
||||
ciil = "Simon Lackerbauer <simon@lackerbauer.com>";
|
||||
ck3d = "Christian Kögler <ck3d@gmx.de>";
|
||||
ckampka = "Christian Kampka <christian@kampka.net>";
|
||||
ckauhaus = "Christian Kauhaus <kc@flyingcircus.io>";
|
||||
cko = "Christine Koppelt <christine.koppelt@gmail.com>";
|
||||
cleverca22 = "Michael Bishop <cleverca22@gmail.com>";
|
||||
cmcdragonkai = "Roger Qiu <roger.qiu@matrix.ai>";
|
||||
cmfwyp = "cmfwyp <cmfwyp@riseup.net>";
|
||||
cobbal = "Andrew Cobb <andrew.cobb@gmail.com>";
|
||||
coconnor = "Corey O'Connor <coreyoconnor@gmail.com>";
|
||||
codsl = "codsl <codsl@riseup.net>";
|
||||
codyopel = "Cody Opel <codyopel@gmail.com>";
|
||||
colemickens = "Cole Mickens <cole.mickens@gmail.com>";
|
||||
colescott = "Cole Scott <colescottsf@gmail.com>";
|
||||
copumpkin = "Dan Peebles <pumpkingod@gmail.com>";
|
||||
corngood = "David McFarland <corngood@gmail.com>";
|
||||
coroa = "Jonas Hörsch <jonas@chaoflow.net>";
|
||||
couchemar = "Andrey Pavlov <couchemar@yandex.ru>";
|
||||
cpages = "Carles Pagès <page@ruiec.cat>";
|
||||
cransom = "Casey Ransom <cransom@hubns.net>";
|
||||
cryptix = "Henry Bubert <cryptix@riseup.net>";
|
||||
CrystalGamma = "Jona Stubbe <nixos@crystalgamma.de>";
|
||||
cstrahan = "Charles Strahan <charles@cstrahan.com>";
|
||||
csingley = "Christopher Singley <csingley@gmail.com>";
|
||||
cwoac = "Oliver Matthews <oliver@codersoffortune.net>";
|
||||
DamienCassou = "Damien Cassou <damien@cassou.me>";
|
||||
danbst = "Danylo Hlynskyi <abcz2.uprola@gmail.com>";
|
||||
dancek = "Hannu Hartikainen <hannu.hartikainen@gmail.com>";
|
||||
danharaj = "Dan Haraj <dan@obsidian.systems>";
|
||||
danielfullmer = "Daniel Fullmer <danielrf12@gmail.com>";
|
||||
dasuxullebt = "Christoph-Simon Senjak <christoph.senjak@googlemail.com>";
|
||||
david50407 = "David Kuo <me@davy.tw>";
|
||||
davidak = "David Kleuker <post@davidak.de>";
|
||||
davidrusu = "David Rusu <davidrusu.me@gmail.com>";
|
||||
davorb = "Davor Babic <davor@davor.se>";
|
||||
dbohdan = "Danyil Bohdan <danyil.bohdan@gmail.com>";
|
||||
dbrock = "Daniel Brockman <daniel@brockman.se>";
|
||||
deepfire = "Kosyrev Serge <_deepfire@feelingofgreen.ru>";
|
||||
demin-dmitriy = "Dmitriy Demin <demindf@gmail.com>";
|
||||
derchris = "Christian Gerbrandt <derchris@me.com>";
|
||||
DerGuteMoritz = "Moritz Heidkamp <moritz@twoticketsplease.de>";
|
||||
dermetfan = "Robin Stumm <serverkorken@gmail.com>";
|
||||
DerTim1 = "Tim Digel <tim.digel@active-group.de>";
|
||||
desiderius = "Didier J. Devroye <didier@devroye.name>";
|
||||
devhell = "devhell <\"^\"@regexmail.net>";
|
||||
dezgeg = "Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>";
|
||||
dfordivam = "Divam <dfordivam+nixpkgs@gmail.com>";
|
||||
dfoxfranke = "Daniel Fox Franke <dfoxfranke@gmail.com>";
|
||||
dgonyeo = "Derek Gonyeo <derek@gonyeo.com>";
|
||||
dipinhora = "Dipin Hora <dipinhora+github@gmail.com>";
|
||||
disassembler = "Samuel Leathers <disasm@gmail.com>";
|
||||
dizfer = "David Izquierdo <david@izquierdofernandez.com>";
|
||||
dmalikov = "Dmitry Malikov <malikov.d.y@gmail.com>";
|
||||
DmitryTsygankov = "Dmitry Tsygankov <dmitry.tsygankov@gmail.com>";
|
||||
dmjio = "David Johnson <djohnson.m@gmail.com>";
|
||||
dochang = "Desmond O. Chang <dochang@gmail.com>";
|
||||
domenkozar = "Domen Kozar <domen@dev.si>";
|
||||
dotlambda = "Robert Schütz <rschuetz17@gmail.com>";
|
||||
doublec = "Chris Double <chris.double@double.co.nz>";
|
||||
dpaetzel = "David Pätzel <david.a.paetzel@gmail.com>";
|
||||
dpflug = "David Pflug <david@pflug.email>";
|
||||
drets = "Dmytro Rets <dmitryrets@gmail.com>";
|
||||
drewkett = "Andrew Burkett <burkett.andrew@gmail.com>";
|
||||
dsferruzza = "David Sferruzza <david.sferruzza@gmail.com>";
|
||||
dtzWill = "Will Dietz <nix@wdtz.org>";
|
||||
dupgit = "Olivier Delhomme <olivier.delhomme@free.fr>";
|
||||
dywedir = "Vladyslav M. <dywedir@protonmail.ch>";
|
||||
dzabraev = "Maksim Dzabraev <dzabraew@gmail.com>";
|
||||
e-user = "Alexander Kahl <nixos@sodosopa.io>";
|
||||
earldouglas = "James Earl Douglas <james@earldouglas.com>";
|
||||
earvstedt = "Erik Arvstedt <erik.arvstedt@gmail.com>";
|
||||
ebzzry = "Rommel Martinez <ebzzry@ebzzry.io>";
|
||||
edanaher = "Evan Danaher <nixos@edanaher.net>";
|
||||
edef = "edef <edef@edef.eu>";
|
||||
ederoyd46 = "Matthew Brown <matt@ederoyd.co.uk>";
|
||||
eduarrrd = "Eduard Bachmakov <e.bachmakov@gmail.com>";
|
||||
edwtjo = "Edward Tjörnhammar <ed@cflags.cc>";
|
||||
eelco = "Eelco Dolstra <eelco.dolstra@logicblox.com>";
|
||||
ehegnes = "Eric Hegnes <eric.hegnes@gmail.com>";
|
||||
ehmry = "Emery Hemingway <emery@vfemail.net>";
|
||||
eikek = "Eike Kettner <eike.kettner@posteo.de>";
|
||||
ekleog = "Leo Gaspard <leo@gaspard.io>";
|
||||
elasticdog = "Aaron Bull Schaefer <aaron@elasticdog.com>";
|
||||
eleanor = "Dejan Lukan <dejan@proteansec.com>";
|
||||
elijahcaine = "Elijah Caine <elijahcainemv@gmail.com>";
|
||||
elitak = "Eric Litak <elitak@gmail.com>";
|
||||
ellis = "Ellis Whitehead <nixos@ellisw.net>";
|
||||
enzime = "Michael Hoang <enzime@users.noreply.github.com>";
|
||||
eperuffo = "Emanuele Peruffo <info@emanueleperuffo.com>";
|
||||
epitrochoid = "Mabry Cervin <mpcervin@uncg.edu>";
|
||||
eqyiel = "Ruben Maher <r@rkm.id.au>";
|
||||
ericbmerritt = "Eric Merritt <eric@afiniate.com>";
|
||||
ericsagnes = "Eric Sagnes <eric.sagnes@gmail.com>";
|
||||
ericson2314 = "John Ericson <John.Ericson@Obsidian.Systems>";
|
||||
erictapen = "Justin Humm <justin.humm@posteo.de>";
|
||||
erikryb = "Erik Rybakken <erik.rybakken@math.ntnu.no>";
|
||||
ertes = "Ertugrul Söylemez <esz@posteo.de>";
|
||||
erosennin = "Andrey Golovizin <ag@sologoc.com>";
|
||||
ethercrow = "Dmitry Ivanov <ethercrow@gmail.com>";
|
||||
etu = "Elis Hirwing <elis@hirwing.se>";
|
||||
exfalso = "Andras Slemmer <0slemi0@gmail.com>";
|
||||
exi = "Reno Reckling <nixos@reckling.org>";
|
||||
exlevan = "Alexey Levan <exlevan@gmail.com>";
|
||||
expipiplus1 = "Joe Hermaszewski <nix@monoid.al>";
|
||||
fadenb = "Tristan Helmich <tristan.helmich+nixos@gmail.com>";
|
||||
falsifian = "James Cook <james.cook@utoronto.ca>";
|
||||
fare = "Francois-Rene Rideau <fahree@gmail.com>";
|
||||
f-breidenstein = "Felix Breidenstein <mail@felixbreidenstein.de>";
|
||||
fgaz = "Francesco Gazzetta <francygazz@gmail.com>";
|
||||
FireyFly = "Jonas Höglund <nix@firefly.nu>";
|
||||
flokli = "Florian Klink <flokli@flokli.de>";
|
||||
florianjacob = "Florian Jacob <projects+nixos@florianjacob.de>";
|
||||
flosse = "Markus Kohlhase <mail@markus-kohlhase.de>";
|
||||
fluffynukeit = "Daniel Austin <dan@fluffynukeit.com>";
|
||||
fmthoma = "Franz Thoma <f.m.thoma@googlemail.com>";
|
||||
forkk = "Andrew Okin <forkk@forkk.net>";
|
||||
fornever = "Friedrich von Never <friedrich@fornever.me>";
|
||||
fpletz = "Franz Pletz <fpletz@fnordicwalking.de>";
|
||||
fps = "Florian Paul Schmidt <mista.tapas@gmx.net>";
|
||||
fridh = "Frederik Rietdijk <fridh@fridh.nl>";
|
||||
frlan = "Frank Lanitz <frank@frank.uvena.de>";
|
||||
fro_ozen = "fro_ozen <fro_ozen@gmx.de>";
|
||||
ftrvxmtrx = "Siarhei Zirukin <ftrvxmtrx@gmail.com>";
|
||||
funfunctor = "Edward O'Callaghan <eocallaghan@alterapraxis.com>";
|
||||
fuuzetsu = "Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>";
|
||||
fuzzy-id = "Thomas Bach <hacking+nixos@babibo.de>";
|
||||
fxfactorial = "Edgar Aroutiounian <edgar.factorial@gmail.com>";
|
||||
gabesoft = "Gabriel Adomnicai <gabesoft@gmail.com>";
|
||||
gal_bolle = "Florent Becker <florent.becker@ens-lyon.org>";
|
||||
garbas = "Rok Garbas <rok@garbas.si>";
|
||||
garrison = "Jim Garrison <jim@garrison.cc>";
|
||||
gavin = "Gavin Rogers <gavin@praxeology.co.uk>";
|
||||
gebner = "Gabriel Ebner <gebner@gebner.org>";
|
||||
geistesk = "Alvar Penning <post@0x21.biz>";
|
||||
genesis = "Ronan Bignaux <ronan@aimao.org>";
|
||||
georgewhewell = "George Whewell <georgerw@gmail.com>";
|
||||
gilligan = "Tobias Pflug <tobias.pflug@gmail.com>";
|
||||
giogadi = "Luis G. Torres <lgtorres42@gmail.com>";
|
||||
gleber = "Gleb Peregud <gleber.p@gmail.com>";
|
||||
glenns = "Glenn Searby <glenn.searby@gmail.com>";
|
||||
globin = "Robin Gloster <mail@glob.in>";
|
||||
gnidorah = "Alex Ivanov <yourbestfriend@opmbx.org>";
|
||||
goibhniu = "Cillian de Róiste <cillian.deroiste@gmail.com>";
|
||||
Gonzih = "Max Gonzih <gonzih@gmail.com>";
|
||||
goodrone = "Andrew Trachenko <goodrone@gmail.com>";
|
||||
gpyh = "Yacine Hmito <yacine.hmito@gmail.com>";
|
||||
grahamc = "Graham Christensen <graham@grahamc.com>";
|
||||
grburst = "Julius Elias <grburst@openmailbox.org>";
|
||||
gridaphobe = "Eric Seidel <eric@seidel.io>";
|
||||
guibert = "David Guibert <david.guibert@gmail.com>";
|
||||
guibou = "Guillaume Bouchard <guillaum.bouchard@gmail.com>";
|
||||
guillaumekoenig = "Guillaume Koenig <guillaume.edward.koenig@gmail.com>";
|
||||
guyonvarch = "Joris Guyonvarch <joris@guyonvarch.me>";
|
||||
hakuch = "Jesse Haber-Kucharsky <hakuch@gmail.com>";
|
||||
hamhut1066 = "Hamish Hutchings <github@hamhut1066.com>";
|
||||
havvy = "Ryan Scheel <ryan.havvy@gmail.com>";
|
||||
hbunke = "Hendrik Bunke <bunke.hendrik@gmail.com>";
|
||||
hce = "Hans-Christian Esperer <hc@hcesperer.org>";
|
||||
hectorj = "Hector Jusforgues <hector.jusforgues+nixos@gmail.com>";
|
||||
hedning = "Tor Hedin Brønner <torhedinbronner@gmail.com>";
|
||||
heel = "Sergii Paryzhskyi <parizhskiy@gmail.com>";
|
||||
henrytill = "Henry Till <henrytill@gmail.com>";
|
||||
hhm = "hhm <heehooman+nixpkgs@gmail.com>";
|
||||
hinton = "Tom Hinton <t@larkery.com>";
|
||||
hodapp = "Chris Hodapp <hodapp87@gmail.com>";
|
||||
hrdinka = "Christoph Hrdinka <c.nix@hrdinka.at>";
|
||||
htr = "Hugo Tavares Reis <hugo@linux.com>";
|
||||
hyphon81 = "Masato Yonekawa <zero812n@gmail.com>";
|
||||
iand675 = "Ian Duncan <ian@iankduncan.com>";
|
||||
ianwookim = "Ian-Woo Kim <ianwookim@gmail.com>";
|
||||
iblech = "Ingo Blechschmidt <iblech@speicherleck.de>";
|
||||
igsha = "Igor Sharonov <igor.sharonov@gmail.com>";
|
||||
ikervagyok = "Balázs Lengyel <ikervagyok@gmail.com>";
|
||||
ilya-kolpakov = "Ilya Kolpakov <ilya.kolpakov@gmail.com>";
|
||||
infinisil = "Silvan Mosberger <infinisil@icloud.com>";
|
||||
ironpinguin = "Michele Catalano <michele@catalano.de>";
|
||||
ivan-tkatchev = "Ivan Tkatchev <tkatchev@gmail.com>";
|
||||
ixmatus = "Parnell Springmeyer <parnell@digitalmentat.com>";
|
||||
izorkin = "Yurii Izorkin <Izorkin@gmail.com>";
|
||||
ixxie = "Matan Bendix Shenhav <matan@fluxcraft.net>";
|
||||
j-keck = "Jürgen Keck <jhyphenkeck@gmail.com>";
|
||||
jagajaga = "Arseniy Seroka <ars.seroka@gmail.com>";
|
||||
jammerful = "jammerful <jammerful@gmail.com>";
|
||||
jansol = "Jan Solanti <jan.solanti@paivola.fi>";
|
||||
javaguirre = "Javier Aguirre <contacto@javaguirre.net>";
|
||||
jb55 = "William Casarin <jb55@jb55.com>";
|
||||
jbedo = "Justin Bedő <cu@cua0.org>";
|
||||
jcumming = "Jack Cummings <jack@mudshark.org>";
|
||||
jdagilliland = "Jason Gilliland <jdagilliland@gmail.com>";
|
||||
jefdaj = "Jeffrey David Johnson <jefdaj@gmail.com>";
|
||||
jensbin = "Jens Binkert <jensbin@protonmail.com>";
|
||||
jerith666 = "Matt McHenry <github@matt.mchenryfamily.org>";
|
||||
jfb = "James Felix Black <james@yamtime.com>";
|
||||
jfrankenau = "Johannes Frankenau <johannes@frankenau.net>";
|
||||
jgeerds = "Jascha Geerds <jascha@jgeerds.name>";
|
||||
jgertm = "Tim Jaeger <jger.tm@gmail.com>";
|
||||
jgillich = "Jakob Gillich <jakob@gillich.me>";
|
||||
jhhuh = "Ji-Haeng Huh <jhhuh.note@gmail.com>";
|
||||
jirkamarsik = "Jirka Marsik <jiri.marsik89@gmail.com>";
|
||||
jlesquembre = "José Luis Lafuente <jl@lafuente.me>";
|
||||
jluttine = "Jaakko Luttinen <jaakko.luttinen@iki.fi>";
|
||||
Jo = "Joachim Ernst <0x4A6F@shackspace.de>";
|
||||
joachifm = "Joachim Fasting <joachifm@fastmail.fm>";
|
||||
joamaki = "Jussi Maki <joamaki@gmail.com>";
|
||||
joelmo = "Joel Moberg <joel.moberg@gmail.com>";
|
||||
joelteon = "Joel Taylor <me@joelt.io>";
|
||||
johbo = "Johannes Bornhold <johannes@bornhold.name>";
|
||||
johnazoidberg = "Daniel Schäfer <git@danielschaefer.me>";
|
||||
johnmh = "John M. Harris, Jr. <johnmh@openblox.org>";
|
||||
johnramsden = "John Ramsden <johnramsden@riseup.net>";
|
||||
joko = "Ioannis Koutras <ioannis.koutras@gmail.com>";
|
||||
jonafato = "Jon Banafato <jon@jonafato.com>";
|
||||
joncojonathan = "Jonathan Haddock <joncojonathan@gmail.com>";
|
||||
jpdoyle = "Joe Doyle <joethedoyle@gmail.com>";
|
||||
jpierre03 = "Jean-Pierre PRUNARET <nix@prunetwork.fr>";
|
||||
jpotier = "Martin Potier <jpo.contributes.to.nixos@marvid.fr>";
|
||||
jraygauthier = "Raymond Gauthier <jraygauthier@gmail.com>";
|
||||
jtojnar = "Jan Tojnar <jtojnar@gmail.com>";
|
||||
juliendehos = "Julien Dehos <dehos@lisic.univ-littoral.fr>";
|
||||
jwiegley = "John Wiegley <johnw@newartisans.com>";
|
||||
jwilberding = "Jordan Wilberding <jwilberding@afiniate.com>";
|
||||
jyp = "Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>";
|
||||
jzellner = "Jeff Zellner <jeffz@eml.cc>";
|
||||
kaiha = "Kai Harries <kai.harries@gmail.com>";
|
||||
kamilchm = "Kamil Chmielewski <kamil.chm@gmail.com>";
|
||||
kampfschlaefer = "Arnold Krille <arnold@arnoldarts.de>";
|
||||
karolchmist = "karolchmist <info+nix@chmist.com>";
|
||||
kentjames = "James Kent <jameschristopherkent@gmail.com";
|
||||
kevincox = "Kevin Cox <kevincox@kevincox.ca>";
|
||||
khumba = "Bryan Gardiner <bog@khumba.net>";
|
||||
KibaFox = "Kiba Fox <kiba.fox@foxypossibilities.com>";
|
||||
kierdavis = "Kier Davis <kierdavis@gmail.com>";
|
||||
kiloreux = "Kiloreux Emperex <kiloreux@gmail.com>";
|
||||
kini = "Keshav Kini <keshav.kini@gmail.com>";
|
||||
kkallio = "Karn Kallio <tierpluspluslists@gmail.com>";
|
||||
knedlsepp = "Josef Kemetmüller <josef.kemetmueller@gmail.com>";
|
||||
konimex = "Muhammad Herdiansyah <herdiansyah@netc.eu>";
|
||||
koral = "Koral <koral@mailoo.org>";
|
||||
kovirobi = "Kovacsics Robert <kovirobi@gmail.com>";
|
||||
kquick = "Kevin Quick <quick@sparq.org>";
|
||||
kragniz = "Louis Taylor <louis@kragniz.eu>";
|
||||
kristoff3r = "Kristoffer Søholm <k.soeholm@gmail.com>";
|
||||
ktosiek = "Tomasz Kontusz <tomasz.kontusz@gmail.com>";
|
||||
kuznero = "Roman Kuznetsov <roman@kuznero.com>";
|
||||
lasandell = "Luke Sandell <lasandell@gmail.com>";
|
||||
lassulus = "Lassulus <lassulus@gmail.com>";
|
||||
layus = "Guillaume Maudoux <layus.on@gmail.com>";
|
||||
lblasc = "Luka Blaskovic <lblasc@znode.net>";
|
||||
ldesgoui = "Lucas Desgouilles <ldesgoui@gmail.com>";
|
||||
league = "Christopher League <league@contrapunctus.net>";
|
||||
lebastr = "Alexander Lebedev <lebastr@gmail.com>";
|
||||
ledif = "Adam Fidel <refuse@gmail.com>";
|
||||
leemachin = "Lee Machin <me@mrl.ee>";
|
||||
leenaars = "Michiel Leenaars <ml.software@leenaa.rs>";
|
||||
lejonet = "Daniel Kuehn <daniel@kuehn.se>";
|
||||
leonardoce = "Leonardo Cecchi <leonardo.cecchi@gmail.com>";
|
||||
lethalman = "Luca Bruno <lucabru@src.gnome.org>";
|
||||
lewo = "Antoine Eiche <lewo@abesis.fr>";
|
||||
lheckemann = "Linus Heckemann <git@sphalerite.org>";
|
||||
lhvwb = "Nathaniel Baxter <nathaniel.baxter@gmail.com>";
|
||||
lihop = "Leroy Hopson <nixos@leroy.geek.nz>";
|
||||
limeytexan = "Michael Brantley <limeytexan@gmail.com>";
|
||||
linquize = "Linquize <linquize@yahoo.com.hk>";
|
||||
linus = "Linus Arver <linusarver@gmail.com>";
|
||||
lluchs = "Lukas Werling <lukas.werling@gmail.com>";
|
||||
lnl7 = "Daiderd Jordan <daiderd@gmail.com>";
|
||||
lo1tuma = "Mathias Schreck <schreck.mathias@gmail.com>";
|
||||
loskutov = "Ignat Loskutov <ignat.loskutov@gmail.com>";
|
||||
lovek323 = "Jason O'Conal <jason@oconal.id.au>";
|
||||
lowfatcomputing = "Andreas Wagner <andreas.wagner@lowfatcomputing.org>";
|
||||
lsix = "Lancelot SIX <lsix@lancelotsix.com>";
|
||||
lschuermann = "Leon Schuermann <leon.git@is.currently.online>";
|
||||
ltavard = "Laure Tavard <laure.tavard@univ-grenoble-alpes.fr>";
|
||||
lucas8 = "Luc Chabassier <luc.linux@mailoo.org>";
|
||||
ludo = "Ludovic Courtès <ludo@gnu.org>";
|
||||
lufia = "Kyohei Kadota <lufia@lufia.org>";
|
||||
luispedro = "Luis Pedro Coelho <luis@luispedro.org>";
|
||||
lukego = "Luke Gorrie <luke@snabb.co>";
|
||||
luz = "Luz <luz666@daum.net>";
|
||||
lw = "Sergey Sofeychuk <lw@fmap.me>";
|
||||
lyt = "Tim Liou <wheatdoge@gmail.com>";
|
||||
m3tti = "Mathaeus Sander <mathaeus.peter.sander@gmail.com>";
|
||||
ma27 = "Maximilian Bosch <maximilian@mbosch.me>";
|
||||
madjar = "Georges Dubus <georges.dubus@compiletoi.net>";
|
||||
magnetophon = "Bart Brouns <bart@magnetophon.nl>";
|
||||
mahe = "Matthias Herrmann <matthias.mh.herrmann@gmail.com>";
|
||||
makefu = "Felix Richter <makefu@syntax-fehler.de>";
|
||||
malyn = "Michael Alyn Miller <malyn@strangeGizmo.com>";
|
||||
manveru = "Michael Fellinger <m.fellinger@gmail.com>";
|
||||
marcweber = "Marc Weber <marco-oweber@gmx.de>";
|
||||
markus1189 = "Markus Hauck <markus1189@gmail.com>";
|
||||
markuskowa = "Markus Kowalewski <markus.kowalewski@gmail.com>";
|
||||
markWot = "Markus Wotringer <markus@wotringer.de>";
|
||||
martijnvermaat = "Martijn Vermaat <martijn@vermaat.name>";
|
||||
martingms = "Martin Gammelsæter <martin@mg.am>";
|
||||
matejc = "Matej Cotman <cotman.matej@gmail.com>";
|
||||
mathnerd314 = "Mathnerd314 <mathnerd314.gph+hs@gmail.com>";
|
||||
matthewbauer = "Matthew Bauer <mjbauer95@gmail.com>";
|
||||
matthiasbeyer = "Matthias Beyer <mail@beyermatthias.de>";
|
||||
maurer = "Matthew Maurer <matthew.r.maurer+nix@gmail.com>";
|
||||
mbakke = "Marius Bakke <mbakke@fastmail.com>";
|
||||
mbbx6spp = "Susan Potter <me@susanpotter.net>";
|
||||
mbe = "Brandon Edens <brandonedens@gmail.com>";
|
||||
mbode = "Maximilian Bode <maxbode@gmail.com>";
|
||||
mboes = "Mathieu Boespflug <mboes@tweag.net>";
|
||||
mbrgm = "Marius Bergmann <marius@yeai.de>";
|
||||
mcmtroffaes = "Matthias C. M. Troffaes <matthias.troffaes@gmail.com>";
|
||||
mdaiter = "Matthew S. Daiter <mdaiter8121@gmail.com>";
|
||||
meditans = "Carlo Nucera <meditans@gmail.com>";
|
||||
mehandes = "Matt Deming <niewskici@gmail.com>";
|
||||
meisternu = "Matt Miemiec <meister@krutt.org>";
|
||||
metabar = "Celine Mercier <softs@metabarcoding.org>";
|
||||
mgdelacroix = "Miguel de la Cruz <mgdelacroix@gmail.com>";
|
||||
mgttlinger = "Merlin Göttlinger <megoettlinger@gmail.com";
|
||||
mguentner = "Maximilian Güntner <code@klandest.in>";
|
||||
mic92 = "Jörg Thalheim <joerg@thalheim.io>";
|
||||
michaelpj = "Michael Peyton Jones <michaelpj@gmail.com>";
|
||||
michalrus = "Michal Rus <m@michalrus.com>";
|
||||
michelk = "Michel Kuhlmann <michel@kuhlmanns.info>";
|
||||
mickours = "Michael Mercier <mickours@gmail.com<";
|
||||
midchildan = "midchildan <midchildan+nix@gmail.com>";
|
||||
mikefaille = "Michaël Faille <michael@faille.io>";
|
||||
mikoim = "Eshin Kunishima <ek@esh.ink>";
|
||||
miltador = "Vasiliy Solovey <miltador@yandex.ua>";
|
||||
mimadrid = "Miguel Madrid <mimadrid@ucm.es>";
|
||||
mirdhyn = "Merlin Gaillard <mirdhyn@gmail.com>";
|
||||
mirrexagon = "Andrew Abbott <mirrexagon@mirrexagon.com>";
|
||||
mjanczyk = "Marcin Janczyk <m@dragonvr.pl>";
|
||||
mjp = "Mike Playle <mike@mythik.co.uk>"; # github = "MikePlayle";
|
||||
mkg = "Mark K Gardner <mkg@vt.edu>";
|
||||
mlieberman85 = "Michael Lieberman <mlieberman85@gmail.com>";
|
||||
mmahut = "Marek Mahut <marek.mahut@gmail.com>";
|
||||
moaxcp = "John Mercier <moaxcp@gmail.com>";
|
||||
modulistic = "Pablo Costa <modulistic@gmail.com>";
|
||||
mog = "Matthew O'Gorman <mog-lists@rldn.net>";
|
||||
montag451 = "montag451 <montag451@laposte.net>";
|
||||
moosingin3space = "Nathan Moos <moosingin3space@gmail.com>";
|
||||
moredread = "André-Patrick Bubel <code@apb.name>";
|
||||
moretea = "Maarten Hoogendoorn <maarten@moretea.nl>";
|
||||
mornfall = "Petr Ročkai <me@mornfall.net>";
|
||||
MostAwesomeDude = "Corbin Simpson <cds@corbinsimpson.com>";
|
||||
mounium = "Katona László <muoniurn@gmail.com>";
|
||||
MP2E = "Cray Elliott <MP2E@archlinux.us>";
|
||||
mpcsh = "Mark Cohen <m@mpc.sh>";
|
||||
mpickering = "Matthew Pickering <matthewtpickering@gmail.com>";
|
||||
mpscholten = "Marc Scholten <marc@mpscholten.de>";
|
||||
mpsyco = "Francis St-Amour <fr.st-amour@gmail.com>";
|
||||
mrVanDalo = "Ingolf Wanger <contact@ingolf-wagner.de>";
|
||||
msackman = "Matthew Sackman <matthew@wellquite.org>";
|
||||
mschristiansen = "Mikkel Christiansen <mikkel@rheosystems.com>";
|
||||
mstarzyk = "Maciek Starzyk <mstarzyk@gmail.com>";
|
||||
msteen = "Matthijs Steen <emailmatthijs@gmail.com>";
|
||||
mt-caret = "Masayuki Takeda <mtakeda.enigsol@gmail.com>";
|
||||
mtreskin = "Max Treskin <zerthurd@gmail.com>";
|
||||
mudri = "James Wood <lamudri@gmail.com>";
|
||||
muflax = "Stefan Dorn <mail@muflax.com>";
|
||||
myrl = "Myrl Hex <myrl.0xf@gmail.com>";
|
||||
nadrieril = "Nadrieril Feneanar <nadrieril@gmail.com>";
|
||||
namore = "Roman Naumann <namor@hemio.de>";
|
||||
nand0p = "Fernando Jose Pando <nando@hex7.com>";
|
||||
Nate-Devv = "Nathan Moore <natedevv@gmail.com>";
|
||||
nathan-gs = "Nathan Bijnens <nathan@nathan.gs>";
|
||||
nckx = "Tobias Geerinckx-Rice <github@tobias.gr>";
|
||||
ndowens = "Nathan Owens <ndowens04@gmail.com>";
|
||||
neeasade = "Nathan Isom <nathanisom27@gmail.com>";
|
||||
nequissimus = "Tim Steinbach <tim@nequissimus.com>";
|
||||
nfjinjing = "Jinjing Wang <nfjinjing@gmail.com>";
|
||||
nh2 = "Niklas Hambüchen <mail@nh2.me>";
|
||||
nhooyr = "Anmol Sethi <anmol@aubble.com>";
|
||||
nickhu = "Nick Hu <me@nickhu.co.uk>";
|
||||
nicknovitski = "Nick Novitski <nixpkgs@nicknovitski.com>";
|
||||
nico202 = "Nicolò Balzarotti <anothersms@gmail.com>";
|
||||
NikolaMandic = "Ratko Mladic <nikola@mandic.email>";
|
||||
ninjatrappeur = "Félix Baylac-Jacqué <felix@alternativebit.fr>";
|
||||
nipav = "Niko Pavlinek <niko.pavlinek@gmail.com>";
|
||||
nixy = "Andrew R. M. <nixy@nixy.moe>";
|
||||
nmattia = "Nicolas Mattia <nicolas@nmattia.com>";
|
||||
nocoolnametom = "Tom Doggett <nocoolnametom@gmail.com>";
|
||||
notthemessiah = "Brian Cohen <brian.cohen.88@gmail.com>";
|
||||
np = "Nicolas Pouillard <np.nix@nicolaspouillard.fr>";
|
||||
nslqqq = "Nikita Mikhailov <nslqqq@gmail.com>";
|
||||
nthorne = "Niklas Thörne <notrupertthorne@gmail.com>";
|
||||
nyarly = "Judson Lester <nyarly@gmail.com>";
|
||||
obadz = "obadz <obadz-nixos@obadz.com>";
|
||||
ocharles = "Oliver Charles <ollie@ocharles.org.uk>";
|
||||
odi = "Oliver Dunkl <oliver.dunkl@gmail.com>";
|
||||
offline = "Jaka Hudoklin <jakahudoklin@gmail.com>";
|
||||
oida = "oida <oida@posteo.de>";
|
||||
okasu = "Okasu <oka.sux@gmail.com>";
|
||||
olcai = "Erik Timan <dev@timan.info>";
|
||||
olejorgenb = "Ole Jørgen Brønner <olejorgenb@yahoo.no>";
|
||||
olynch = "Owen Lynch <owen@olynch.me>";
|
||||
orbekk = "KJ Ørbekk <kjetil.orbekk@gmail.com>";
|
||||
orbitz = "Malcolm Matalka <mmatalka@gmail.com>";
|
||||
orivej = "Orivej Desh <orivej@gmx.fr>";
|
||||
osener = "Ozan Sener <ozan@ozansener.com>";
|
||||
otwieracz = "Slawomir Gonet <slawek@otwiera.cz>";
|
||||
oxij = "Jan Malakhovski <oxij@oxij.org>";
|
||||
paholg = "Paho Lurie-Gregg <paho@paholg.com>";
|
||||
pakhfn = "Fedor Pakhomov <pakhfn@gmail.com>";
|
||||
panaeon = "Vitalii Voloshyn <vitalii.voloshyn@gmail.com";
|
||||
paperdigits = "Mica Semrick <mica@silentumbrella.com>";
|
||||
paraseba = "Sebastian Galkin <paraseba@gmail.com>";
|
||||
pashev = "Igor Pashev <pashev.igor@gmail.com>";
|
||||
patternspandemic = "Brad Christensen <patternspandemic@live.com>";
|
||||
pawelpacana = "Paweł Pacana <pawel.pacana@gmail.com>";
|
||||
pbogdan = "Piotr Bogdan <ppbogdan@gmail.com>";
|
||||
pcarrier = "Pierre Carrier <pc@rrier.ca>";
|
||||
periklis = "theopompos@gmail.com";
|
||||
pesterhazy = "Paulus Esterhazy <pesterhazy@gmail.com>";
|
||||
peterhoeg = "Peter Hoeg <peter@hoeg.com>";
|
||||
peterromfeldhk = "Peter Romfeld <peter.romfeld.hk@gmail.com>";
|
||||
peti = "Peter Simons <simons@cryp.to>";
|
||||
philandstuff = "Philip Potter <philip.g.potter@gmail.com>";
|
||||
phile314 = "Philipp Hausmann <nix@314.ch>";
|
||||
Phlogistique = "Noé Rubinstein <noe.rubinstein@gmail.com>";
|
||||
phreedom = "Evgeny Egorochkin <phreedom@yandex.ru>";
|
||||
phunehehe = "Hoang Xuan Phu <phunehehe@gmail.com>";
|
||||
pierrechevalier83 = "Pierre Chevalier <pierrechevalier83@gmail.com>";
|
||||
pierrer = "Pierre Radermecker <pierrer@pi3r.be>";
|
||||
pierron = "Nicolas B. Pierron <nixos@nbp.name>";
|
||||
piotr = "Piotr Pietraszkiewicz <ppietrasa@gmail.com>";
|
||||
pjbarnoy = "Perry Barnoy <pjbarnoy@gmail.com>";
|
||||
pjones = "Peter Jones <pjones@devalot.com>";
|
||||
pkmx = "Chih-Mao Chen <pkmx.tw@gmail.com>";
|
||||
plcplc = "Philip Lykke Carlsen <plcplc@gmail.com>";
|
||||
plumps = "Maksim Bronsky <maks.bronsky@web.de";
|
||||
pmahoney = "Patrick Mahoney <pat@polycrystal.org>";
|
||||
pmeunier = "Pierre-Étienne Meunier <pierre-etienne.meunier@inria.fr>";
|
||||
pmiddend = "Philipp Middendorf <pmidden@secure.mailbox.org>";
|
||||
pneumaticat = "Kevin Liu <kevin@potatofrom.space>";
|
||||
polyrod = "Maurizio Di Pietro <dc1mdp@gmail.com>";
|
||||
pradeepchhetri = "Pradeep Chhetri <pradeep.chhetri89@gmail.com>";
|
||||
prikhi = "Pavan Rikhi <pavan.rikhi@gmail.com>";
|
||||
primeos = "Michael Weiss <dev.primeos@gmail.com>";
|
||||
Profpatsch = "Profpatsch <mail@profpatsch.de>";
|
||||
proglodyte = "Proglodyte <proglodyte23@gmail.com>";
|
||||
pshendry = "Paul Hendry <paul@pshendry.com>";
|
||||
psibi = "Sibi <sibi@psibi.in>";
|
||||
pstn = "Philipp Steinpaß <philipp@xndr.de>";
|
||||
pSub = "Pascal Wittmann <mail@pascal-wittmann.de>";
|
||||
puffnfresh = "Brian McKenna <brian@brianmckenna.org>";
|
||||
pxc = "Patrick Callahan <patrick.callahan@latitudeengineering.com>";
|
||||
qknight = "Joachim Schiele <js@lastlog.de>";
|
||||
ragge = "Ragnar Dahlen <r.dahlen@gmail.com>";
|
||||
ralith = "Benjamin Saunders <ben.e.saunders@gmail.com>";
|
||||
ramkromberg = "Ram Kromberg <ramkromberg@mail.com>";
|
||||
rardiol = "Ricardo Ardissone <ricardo.ardissone@gmail.com>";
|
||||
rasendubi = "Alexey Shmalko <rasen.dubi@gmail.com>";
|
||||
raskin = "Michael Raskin <7c6f434c@mail.ru>";
|
||||
ravloony = "Tom Macdonald <ravloony@gmail.com>";
|
||||
razvan = "Răzvan Flavius Panda <razvan.panda@gmail.com>";
|
||||
rbasso = "Rafael Basso <rbasso@sharpgeeks.net>";
|
||||
redbaron = "Maxim Ivanov <ivanov.maxim@gmail.com>";
|
||||
redvers = "Redvers Davies <red@infect.me>";
|
||||
refnil = "Martin Lavoie <broemartino@gmail.com>";
|
||||
regnat = "Théophane Hufschmitt <regnat@regnat.ovh>";
|
||||
relrod = "Ricky Elrod <ricky@elrod.me>";
|
||||
renzo = "Renzo Carbonara <renzocarbonara@gmail.com>";
|
||||
retrry = "Tadas Barzdžius <retrry@gmail.com>";
|
||||
rht = "rht <rhtbot@protonmail.com>";
|
||||
richardipsum = "Richard Ipsum <richardipsum@fastmail.co.uk>";
|
||||
rick68 = "Wei-Ming Yang <rick68@gmail.com>";
|
||||
rickynils = "Rickard Nilsson <rickynils@gmail.com>";
|
||||
ris = "Robert Scott <code@humanleg.org.uk>";
|
||||
rlupton20 = "Richard Lupton <richard.lupton@gmail.com>";
|
||||
rnhmjoj = "Michele Guerini Rocco <micheleguerinirocco@me.com>";
|
||||
rob = "Rob Vermaas <rob.vermaas@gmail.com>";
|
||||
robberer = "Longrin Wischnewski <robberer@freakmail.de>";
|
||||
robbinch = "Robbin C. <robbinch33@gmail.com>";
|
||||
roberth = "Robert Hensing <nixpkgs@roberthensing.nl>";
|
||||
robertodr = "Roberto Di Remigio <roberto.diremigio@gmail.com>";
|
||||
robgssp = "Rob Glossop <robgssp@gmail.com>";
|
||||
roblabla = "Robin Lambertz <robinlambertz+dev@gmail.com>";
|
||||
roconnor = "Russell O'Connor <roconnor@theorem.ca>";
|
||||
romildo = "José Romildo Malaquias <malaquias@gmail.com>";
|
||||
rongcuid = "Rongcui Dong <rongcuid@outlook.com>";
|
||||
rszibele = "Richard Szibele <richard@szibele.com>";
|
||||
rtreffer = "Rene Treffer <treffer+nixos@measite.de>";
|
||||
rushmorem = "Rushmore Mushambi <rushmore@webenchanter.com>";
|
||||
rvl = "Rodney Lorrimar <dev+nix@rodney.id.au>";
|
||||
rvlander = "Gaëtan André <rvlander@gaetanandre.eu>";
|
||||
rvolosatovs = "Roman Volosatovs <rvolosatovs@riseup.net>";
|
||||
ryanartecona = "Ryan Artecona <ryanartecona@gmail.com>";
|
||||
ryansydnor = "Ryan Sydnor <ryan.t.sydnor@gmail.com>";
|
||||
ryantm = "Ryan Mulligan <ryan@ryantm.com>";
|
||||
ryantrinkle = "Ryan Trinkle <ryan.trinkle@gmail.com>";
|
||||
rybern = "Ryan Bernstein <ryan.bernstein@columbia.edu>";
|
||||
rycee = "Robert Helgesson <robert@rycee.net>";
|
||||
ryneeverett = "Ryne Everett <ryneeverett@gmail.com>";
|
||||
rzetterberg = "Richard Zetterberg <richard.zetterberg@gmail.com>";
|
||||
s1lvester = "Markus Silvester <s1lvester@bockhacker.me>";
|
||||
samdroid-apps = "Sam Parkinson <sam@sam.today>";
|
||||
samueldr = "Samuel Dionne-Riel <samuel@dionne-riel.com>";
|
||||
samuelrivas = "Samuel Rivas <samuelrivas@gmail.com>";
|
||||
sander = "Sander van der Burg <s.vanderburg@tudelft.nl>";
|
||||
sargon = "Daniel Ehlers <danielehlers@mindeye.net>";
|
||||
sauyon = "Sauyon Lee <s@uyon.co>";
|
||||
schmitthenner = "Fabian Schmitthenner <development@schmitthenner.eu>";
|
||||
schneefux = "schneefux <schneefux+nixos_pkg@schneefux.xyz>";
|
||||
schristo = "Scott Christopher <schristopher@konputa.com>";
|
||||
scode = "Peter Schuller <peter.schuller@infidyne.com>";
|
||||
scolobb = "Sergiu Ivanov <sivanov@colimite.fr>";
|
||||
sdll = "Sasha Illarionov <sasha.delly@gmail.com>";
|
||||
SeanZicari = "Sean Zicari <sean.zicari@gmail.com>";
|
||||
sellout = "Greg Pfeil <greg@technomadic.org>";
|
||||
sepi = "Raffael Mancini <raffael@mancini.lu>";
|
||||
seppeljordan = "Sebastian Jordan <sebastian.jordan.mail@googlemail.com>";
|
||||
sfrijters = "Stefan Frijters <sfrijters@gmail.com>";
|
||||
shanemikel = "Shane Pearlman <shanemikel1@gmail.com>";
|
||||
shawndellysse = "Shawn Dellysse <sdellysse@gmail.com>";
|
||||
sheenobu = "Sheena Artrip <sheena.artrip@gmail.com>";
|
||||
sheganinans = "Aistis Raulinaitis <sheganinans@gmail.com>";
|
||||
shell = "Shell Turner <cam.turn@gmail.com>";
|
||||
shlevy = "Shea Levy <shea@shealevy.com>";
|
||||
siddharthist = "Langston Barrett <langston.barrett@gmail.com>";
|
||||
sifmelcara = "Ming Chuan <ming@culpring.com>";
|
||||
sigma = "Yann Hodique <yann.hodique@gmail.com>";
|
||||
simonvandel = "Simon Vandel Sillesen <simon.vandel@gmail.com>";
|
||||
sivteck = "Sivaram Balakrishnan <sivaram1992@gmail.com>";
|
||||
sjagoe = "Simon Jagoe <simon@simonjagoe.com>";
|
||||
sjmackenzie = "Stewart Mackenzie <setori88@gmail.com>";
|
||||
sjourdois = "Stéphane ‘kwisatz’ Jourdois <sjourdois@gmail.com>";
|
||||
skeidel = "Sven Keidel <svenkeidel@gmail.com>";
|
||||
skrzyp = "Jakub Skrzypnik <jot.skrzyp@gmail.com>";
|
||||
sleexyz = "Sean Lee <freshdried@gmail.com>";
|
||||
smironov = "Sergey Mironov <grrwlf@gmail.com>";
|
||||
snyh = "Xia Bin <snyh@snyh.org>";
|
||||
solson = "Scott Olson <scott@solson.me>";
|
||||
sorpaas = "Wei Tang <hi@that.world>";
|
||||
sorki = "Richard Marko <srk@48.io>";
|
||||
spacefrogg = "Michael Raitza <spacefrogg-nixos@meterriblecrew.net>";
|
||||
spencerjanssen = "Spencer Janssen <spencerjanssen@gmail.com>";
|
||||
spinus = "Tomasz Czyż <tomasz.czyz@gmail.com>";
|
||||
sprock = "Roger Mason <rmason@mun.ca>";
|
||||
spwhitt = "Spencer Whitt <sw@swhitt.me>";
|
||||
srhb = "Sarah Brofeldt <sbrofeldt@gmail.com>";
|
||||
SShrike = "Severen Redwood <severen@shrike.me>";
|
||||
stephenmw = "Stephen Weinberg <stephen@q5comm.com>";
|
||||
sternenseemann = "Lukas Epple <post@lukasepple.de>";
|
||||
stesie = "Stefan Siegl <stesie@brokenpipe.de>";
|
||||
steveej = "Stefan Junker <mail@stefanjunker.de>";
|
||||
StijnDW = "Stijn DW <stekke@airmail.cc>";
|
||||
StillerHarpo = "Florian Engel <florianengel39@gmail.com>";
|
||||
stumoss = "Stuart Moss <samoss@gmail.com>";
|
||||
SuprDewd = "Bjarki Ágúst Guðmundsson <suprdewd@gmail.com>";
|
||||
suvash = "Suvash Thapaliya <suvash+nixpkgs@gmail.com>";
|
||||
svsdep = "Vasyl Solovei <svsdep@gmail.com>";
|
||||
swarren83 = "Shawn Warren <shawn.w.warren@gmail.com>";
|
||||
swflint = "Samuel W. Flint <swflint@flintfam.org>";
|
||||
swistak35 = "Rafał Łasocha <me@swistak35.com>";
|
||||
symphorien = "Guillaume Girol <symphorien_nixpkgs@xlumurb.eu>";
|
||||
szczyp = "Szczyp <qb@szczyp.com>";
|
||||
sztupi = "Attila Sztupak <attila.sztupak@gmail.com>";
|
||||
tadfisher = "Tad Fisher <tadfisher@gmail.com>";
|
||||
taeer = "Taeer Bar-Yam <taeer@necsi.edu>";
|
||||
tailhook = "Paul Colomiets <paul@colomiets.name>";
|
||||
taketwo = "Sergey Alexandrov <alexandrov88@gmail.com>";
|
||||
takikawa = "Asumu Takikawa <asumu@igalia.com>";
|
||||
taktoa = "Remy Goldschmidt <taktoa@gmail.com>";
|
||||
taku0 = "Takuo Yonezawa <mxxouy6x3m_github@tatapa.org>";
|
||||
tari = "Peter Marheine <peter@taricorp.net>";
|
||||
tavyc = "Octavian Cerna <octavian.cerna@gmail.com>";
|
||||
TealG = "Teal Gaure <~@Teal.Gr>";
|
||||
teh = "Tom Hunger <tehunger@gmail.com>";
|
||||
telotortium = "Robert Irelan <rirelan@gmail.com>";
|
||||
teozkr = "Teo Klestrup Röijezon <teo@nullable.se>";
|
||||
teto = "Matthieu Coudron <mcoudron@hotmail.com>";
|
||||
tex = "Milan Svoboda <milan.svoboda@centrum.cz>";
|
||||
thall = "Niclas Thall <niclas.thall@gmail.com>";
|
||||
thammers = "Tobias Hammerschmidt <jawr@gmx.de>";
|
||||
thanegill = "Thane Gill <me@thanegill.com>";
|
||||
the-kenny = "Moritz Ulrich <moritz@tarn-vedra.de>";
|
||||
theuni = "Christian Theune <ct@flyingcircus.io>";
|
||||
ThomasMader = "Thomas Mader <thomas.mader@gmail.com>";
|
||||
thoughtpolice = "Austin Seipp <aseipp@pobox.com>";
|
||||
thpham = "Thomas Pham <thomas.pham@ithings.ch>";
|
||||
tilpner = "Till Höppner <till@hoeppner.ws>";
|
||||
timbertson = "Tim Cuthbertson <tim@gfxmonk.net>";
|
||||
timokau = "Timo Kaufmann <timokau@zoho.com>";
|
||||
timor = "timor <timor.dd@googlemail.com>";
|
||||
tiramiseb = "Sébastien Maccagnoni <sebastien@maccagnoni.eu>";
|
||||
titanous = "Jonathan Rudenberg <jonathan@titanous.com>";
|
||||
tnias = "Philipp Bartsch <phil@grmr.de>";
|
||||
tohl = "Tomas Hlavaty <tom@logand.com>";
|
||||
tokudan = "Daniel Frank <git@danielfrank.net>";
|
||||
tomberek = "Thomas Bereknyei <tomberek@gmail.com>";
|
||||
tomsmeets = "Tom Smeets <tom@tsmeets.nl>";
|
||||
travisbhartwell = "Travis B. Hartwell <nafai@travishartwell.net>";
|
||||
treemo = "Matthieu Chevrier <matthieu.chevrier@treemo.fr>";
|
||||
trevorj = "Trevor Joynson <nix@trevor.joynson.io>";
|
||||
trino = "Hubert Mühlhans <muehlhans.hubert@ekodia.de>";
|
||||
troydm = "Dmitry Geurkov <d.geurkov@gmail.com>";
|
||||
tstrobel = "Thomas Strobel <4ZKTUB6TEP74PYJOPWIR013S2AV29YUBW5F9ZH2F4D5UMJUJ6S@hash.domains>";
|
||||
ttuegel = "Thomas Tuegel <ttuegel@mailbox.org>";
|
||||
tv = "Tomislav Viljetić <tv@shackspace.de>";
|
||||
tvestelind = "Tomas Vestelind <tomas.vestelind@fripost.org>";
|
||||
tvorog = "Marsel Zaripov <marszaripov@gmail.com>";
|
||||
tweber = "Thorsten Weber <tw+nixpkgs@360vier.de>";
|
||||
twey = "James ‘Twey’ Kay <twey@twey.co.uk>";
|
||||
unode = "Renato Alves <alves.rjc@gmail.com>";
|
||||
uralbash = "Svintsov Dmitry <root@uralbash.ru>";
|
||||
utdemir = "Utku Demir <me@utdemir.com>";
|
||||
#urkud = "Yury G. Kudryashov <urkud+nix@ya.ru>"; inactive since 2012
|
||||
uwap = "uwap <me@uwap.name>";
|
||||
va1entin = "Valentin Heidelberger <github@valentinsblog.com>";
|
||||
vaibhavsagar = "Vaibhav Sagar <vaibhavsagar@gmail.com>";
|
||||
valeriangalliat = "Valérian Galliat <val@codejam.info>";
|
||||
vandenoever = "Jos van den Oever <jos@vandenoever.info>";
|
||||
vanschelven = "Klaas van Schelven <klaas@vanschelven.com>";
|
||||
vanzef = "Ivan Solyankin <vanzef@gmail.com>";
|
||||
varunpatro = "Varun Patro <varun.kumar.patro@gmail.com>";
|
||||
vbgl = "Vincent Laporte <Vincent.Laporte@gmail.com>";
|
||||
vbmithr = "Vincent Bernardoff <vb@luminar.eu.org>";
|
||||
vcunat = "Vladimír Čunát <vcunat@gmail.com>";
|
||||
vdemeester = "Vincent Demeester <vincent@sbr.pm>";
|
||||
velovix = "Tyler Compton <xaviosx@gmail.com>";
|
||||
veprbl = "Dmitry Kalinkin <veprbl@gmail.com>";
|
||||
vidbina = "David Asabina <vid@bina.me>";
|
||||
vifino = "Adrian Pistol <vifino@tty.sh>";
|
||||
vinymeuh = "VinyMeuh <vinymeuh@gmail.com>";
|
||||
viric = "Lluís Batlle i Rossell <viric@viric.name>";
|
||||
vizanto = "Danny Wilson <danny@prime.vc>";
|
||||
vklquevs = "vklquevs <vklquevs@gmail.com>";
|
||||
vlstill = "Vladimír Štill <xstill@fi.muni.cz>";
|
||||
vmandela = "Venkateswara Rao Mandela <venkat.mandela@gmail.com>";
|
||||
vmchale = "Vanessa McHale <tmchale@wisc.edu>";
|
||||
volhovm = "Mikhail Volkhov <volhovm.cs@gmail.com>";
|
||||
volth = "Jaroslavas Pocepko <jaroslavas@volth.com>";
|
||||
vozz = "Oliver Hunt <oliver.huntuk@gmail.com>";
|
||||
vrthra = "Rahul Gopinath <rahul@gopinath.org>";
|
||||
vyp = "vyp <elisp.vim@gmail.com>";
|
||||
wedens = "wedens <kirill.wedens@gmail.com>";
|
||||
willibutz = "Willi Butz <willibutz@posteo.de>";
|
||||
willtim = "Tim Philip Williams <tim.williams.public@gmail.com>";
|
||||
winden = "Antonio Vargas Gonzalez <windenntw@gmail.com>";
|
||||
wizeman = "Ricardo M. Correia <rcorreia@wizy.org>";
|
||||
wjlroe = "William Roe <willroe@gmail.com>";
|
||||
wkennington = "William A. Kennington III <william@wkennington.com>";
|
||||
wmertens = "Wout Mertens <Wout.Mertens@gmail.com>";
|
||||
woffs = "Frank Doepper <github@woffs.de>";
|
||||
womfoo = "Kranium Gikos Mendoza <kranium@gikos.net>";
|
||||
wscott = "Wayne Scott <wsc9tt@gmail.com>";
|
||||
wyvie = "Elijah Rum <elijahrum@gmail.com>";
|
||||
xaverdh = "Dominik Xaver Hörl <hoe.dom@gmx.de>";
|
||||
xeji = "xeji <xeji@cat3.de>";
|
||||
xnwdd = "Guillermo NWDD <nwdd+nixos@no.team>";
|
||||
xurei = "Olivier Bourdoux <olivier.bourdoux@gmail.com>";
|
||||
xvapx = "Marti Serra <marti.serra.coscollano@gmail.com>";
|
||||
xwvvvvwx = "David Terry <davidterry@posteo.de>";
|
||||
xzfc = "Albert Safin <xzfcpw@gmail.com>";
|
||||
y0no = "Yoann Ono <y0no@y0no.fr>";
|
||||
yarr = "Dmitry V. <savraz@gmail.com>";
|
||||
yegortimoshenko = "Yegor Timoshenko <yegortimoshenko@gmail.com>";
|
||||
yesbox = "Jesper Geertsen Jonsson <jesper.geertsen.jonsson@gmail.com>";
|
||||
ylwghst = "Burim Augustin Berisa <ylwghst@onionmail.info>";
|
||||
yochai = "Yochai <yochai@titat.info>";
|
||||
yorickvp = "Yorick van Pelt <yorickvanpelt@gmail.com>";
|
||||
yrashk = "Yurii Rashkovskii <yrashk@gmail.com>";
|
||||
yuriaisaka = "Yuri Aisaka <yuri.aisaka+nix@gmail.com>";
|
||||
yurrriq = "Eric Bailey <eric@ericb.me>";
|
||||
z77z = "Marco Maggesi <maggesi@math.unifi.it>";
|
||||
zagy = "Christian Zagrodnick <cz@flyingcircus.io>";
|
||||
zalakain = "Unai Zalakain <contact@unaizalakain.info>";
|
||||
zarelit = "David Costa <david@zarel.net>";
|
||||
zauberpony = "Elmar Athmer <elmar@athmer.org>";
|
||||
zef = "Zef Hemel <zef@zef.me>";
|
||||
zimbatm = "zimbatm <zimbatm@zimbatm.com>";
|
||||
Zimmi48 = "Théo Zimmermann <theo.zimmermann@univ-paris-diderot.fr>";
|
||||
zohl = "Al Zohali <zohl@fmap.me>";
|
||||
zoomulator = "Kim Simmons <zoomulator@gmail.com>";
|
||||
zraexy = "David Mell <zraexy@gmail.com>";
|
||||
zx2c4 = "Jason A. Donenfeld <Jason@zx2c4.com>";
|
||||
zzamboni = "Diego Zamboni <diego@zzamboni.org>";
|
||||
}
|
@ -437,6 +437,13 @@ rec {
|
||||
*/
|
||||
fixedWidthNumber = width: n: fixedWidthString width "0" (toString n);
|
||||
|
||||
/* Check whether a value can be coerced to a string */
|
||||
isCoercibleToString = x:
|
||||
builtins.elem (builtins.typeOf x) [ "path" "string" "null" "int" "float" "bool" ] ||
|
||||
(builtins.isList x && lib.all isCoercibleToString x) ||
|
||||
x ? outPath ||
|
||||
x ? __toString;
|
||||
|
||||
/* Check whether a value is a store path.
|
||||
|
||||
Example:
|
||||
@ -450,7 +457,7 @@ rec {
|
||||
=> false
|
||||
*/
|
||||
isStorePath = x:
|
||||
builtins.isString x
|
||||
isCoercibleToString x
|
||||
&& builtins.substring 0 1 (toString x) == "/"
|
||||
&& dirOf (builtins.toPath x) == builtins.storeDir;
|
||||
|
||||
|
@ -93,6 +93,7 @@ runTests {
|
||||
"${builtins.storeDir}/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11";
|
||||
in {
|
||||
storePath = isStorePath goodPath;
|
||||
storePathDerivation = isStorePath (import ../.. {}).hello;
|
||||
storePathAppendix = isStorePath
|
||||
"${goodPath}/bin/python";
|
||||
nonAbsolute = isStorePath (concatStrings (tail (stringToCharacters goodPath)));
|
||||
@ -106,6 +107,7 @@ runTests {
|
||||
};
|
||||
expected = {
|
||||
storePath = true;
|
||||
storePathDerivation = true;
|
||||
storePathAppendix = false;
|
||||
nonAbsolute = false;
|
||||
asPath = true;
|
||||
|
@ -21,7 +21,7 @@ pkgs.stdenv.mkDerivation {
|
||||
nix-store --init
|
||||
|
||||
cd ${pkgs.path}/lib/tests
|
||||
./modules.sh
|
||||
bash ./modules.sh
|
||||
|
||||
[[ "$(nix-instantiate --eval --strict misc.nix)" == "[ ]" ]]
|
||||
|
||||
|
47
lib/versions.nix
Normal file
47
lib/versions.nix
Normal file
@ -0,0 +1,47 @@
|
||||
/* Version string functions. */
|
||||
{ lib }:
|
||||
|
||||
let
|
||||
|
||||
splitVersion = builtins.splitVersion or (lib.splitString ".");
|
||||
|
||||
in
|
||||
|
||||
rec {
|
||||
|
||||
/* Get the major version string from a string.
|
||||
|
||||
Example:
|
||||
major "1.2.3"
|
||||
=> "1"
|
||||
*/
|
||||
major = v: builtins.elemAt (splitVersion v) 0;
|
||||
|
||||
/* Get the minor version string from a string.
|
||||
|
||||
Example:
|
||||
minor "1.2.3"
|
||||
=> "2"
|
||||
*/
|
||||
minor = v: builtins.elemAt (splitVersion v) 1;
|
||||
|
||||
/* Get the patch version string from a string.
|
||||
|
||||
Example:
|
||||
patch "1.2.3"
|
||||
=> "3"
|
||||
*/
|
||||
patch = v: builtins.elemAt (splitVersion v) 2;
|
||||
|
||||
/* Get string of the first two parts (major and minor)
|
||||
of a version string.
|
||||
|
||||
Example:
|
||||
majorMinor "1.2.3"
|
||||
=> "1.2"
|
||||
*/
|
||||
majorMinor = v:
|
||||
builtins.concatStringsSep "."
|
||||
(lib.take 2 (splitVersion v));
|
||||
|
||||
}
|
3964
maintainers/maintainer-list.nix
Normal file
3964
maintainers/maintainer-list.nix
Normal file
File diff suppressed because it is too large
Load Diff
66
maintainers/scripts/check-maintainer-github-handles.sh
Executable file
66
maintainers/scripts/check-maintainer-github-handles.sh
Executable file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -i bash -p jq parallel
|
||||
|
||||
# Example how to work with the `lib.maintainers` attrset.
|
||||
# Can be used to check whether all user handles are still valid.
|
||||
|
||||
set -e
|
||||
|
||||
# nixpkgs='<nixpkgs>'
|
||||
# if [ -n "$1" ]; then
|
||||
|
||||
function checkCommits {
|
||||
local user="$1"
|
||||
local tmp=$(mktemp)
|
||||
curl --silent -w "%{http_code}" \
|
||||
"https://github.com/NixOS/nixpkgs/commits?author=$user" \
|
||||
> "$tmp"
|
||||
# the last line of tmp contains the http status
|
||||
local status=$(tail -n1 "$tmp")
|
||||
local ret=
|
||||
case $status in
|
||||
200) if <"$tmp" grep -i "no commits found" > /dev/null; then
|
||||
ret=1
|
||||
else
|
||||
ret=0
|
||||
fi
|
||||
;;
|
||||
# because of github’s hard request limits, this can take some time
|
||||
429) sleep 2
|
||||
printf "."
|
||||
checkCommits "$user"
|
||||
ret=$?
|
||||
;;
|
||||
*) printf "BAD STATUS: $(tail -n1 $tmp) for %s\n" "$user"; ret=1
|
||||
ret=1
|
||||
;;
|
||||
esac
|
||||
rm "$tmp"
|
||||
return $ret
|
||||
}
|
||||
export -f checkCommits
|
||||
|
||||
function checkUser {
|
||||
local user="$1"
|
||||
local status=
|
||||
status="$(curl --silent --head "https://github.com/${user}" | grep Status)"
|
||||
# checks whether a user handle can be found on github
|
||||
if [[ "$status" =~ 404 ]]; then
|
||||
printf "%s\t\t\t\t%s\n" "$status" "$user"
|
||||
# checks whether the user handle has any nixpkgs commits
|
||||
elif checkCommits "$user"; then
|
||||
printf "OK!\t\t\t\t%s\n" "$user"
|
||||
else
|
||||
printf "No Commits!\t\t\t%s\n" "$user"
|
||||
fi
|
||||
}
|
||||
export -f checkUser
|
||||
|
||||
# output the maintainers set as json
|
||||
# and filter out the github username of each maintainer (if it exists)
|
||||
# then check some at the same time
|
||||
nix-instantiate -A lib.maintainers --eval --strict --json \
|
||||
| jq -r '.[]|.github|select(.)' \
|
||||
| parallel -j5 checkUser
|
||||
|
||||
# parallel -j100 checkUser ::: "eelco" "profpatsch" "Profpatsch" "a"
|
@ -11,15 +11,17 @@ tedious, so here is a quick way to see if the installer works
|
||||
properly:
|
||||
|
||||
<screen>
|
||||
$ nix-build -A config.system.build.nixos-install
|
||||
# mount -t tmpfs none /mnt
|
||||
# nixos-generate-config --root /mnt
|
||||
$ nix-build '<nixpkgs/nixos>' -A config.system.build.nixos-install
|
||||
# ./result/bin/nixos-install</screen>
|
||||
|
||||
To start a login shell in the new NixOS installation in
|
||||
<filename>/mnt</filename>:
|
||||
|
||||
<screen>
|
||||
# ./result/bin/nixos-install --chroot
|
||||
$ nix-build '<nixpkgs/nixos>' -A config.system.build.nixos-enter
|
||||
# ./result/bin/nixos-enter
|
||||
</screen>
|
||||
|
||||
</para>
|
||||
|
309
nixos/doc/manual/installation/installing-from-other-distro.xml
Normal file
309
nixos/doc/manual/installation/installing-from-other-distro.xml
Normal file
@ -0,0 +1,309 @@
|
||||
<!-- vim: set expandtab ts=2 softtabstop=2 shiftwidth=2 smarttab textwidth=80 wrapmargin=2 -->
|
||||
<section
|
||||
xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-installing-from-other-distro">
|
||||
|
||||
<title>Installing from another Linux distribution</title>
|
||||
|
||||
<para>
|
||||
Because Nix (the package manager) & Nixpkgs (the Nix packages
|
||||
collection) can both be installed on any (most?) Linux distributions,
|
||||
they can be used to install NixOS in various creative ways. You can,
|
||||
for instance:
|
||||
</para>
|
||||
|
||||
<orderedlist>
|
||||
<listitem><para>Install NixOS on another partition, from your existing
|
||||
Linux distribution (without the use of a USB or optical
|
||||
device!)</para></listitem>
|
||||
|
||||
<listitem><para>Install NixOS on the same partition (in place!), from
|
||||
your existing non-NixOS Linux distribution using
|
||||
<literal>NIXOS_LUSTRATE</literal>.</para></listitem>
|
||||
|
||||
<listitem><para>Install NixOS on your hard drive from the Live CD of
|
||||
any Linux distribution.</para></listitem>
|
||||
</orderedlist>
|
||||
|
||||
<para>The first steps to all these are the same:</para>
|
||||
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Install the Nix package manager:</para>
|
||||
|
||||
<para>Short version:</para>
|
||||
|
||||
<screen>
|
||||
$ bash <(curl https://nixos.org/nix/install)
|
||||
$ . $HOME/.nix-profile/etc/profile.d/nix.sh # …or open a fresh shell</screen>
|
||||
|
||||
<para>More details in the <link
|
||||
xlink:href="https://nixos.org/nix/manual/#chap-quick-start">
|
||||
Nix manual</link></para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Switch to the NixOS channel:</para>
|
||||
|
||||
<para>If you've just installed Nix on a non-NixOS distribution, you
|
||||
will be on the <literal>nixpkgs</literal> channel by
|
||||
default.</para>
|
||||
|
||||
<screen>
|
||||
$ nix-channel --list
|
||||
nixpkgs https://nixos.org/channels/nixpkgs-unstable</screen>
|
||||
|
||||
<para>As that channel gets released without running the NixOS
|
||||
tests, it will be safer to use the <literal>nixos-*</literal>
|
||||
channels instead:</para>
|
||||
|
||||
<screen>
|
||||
$ nix-channel --add https://nixos.org/channels/nixos-<replaceable>version</replaceable> nixpkgs</screen>
|
||||
|
||||
<para>You may want to throw in a <literal>nix-channel
|
||||
--update</literal> for good measure.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Install the NixOS installation tools:</para>
|
||||
|
||||
<para>You'll need <literal>nixos-generate-config</literal> and
|
||||
<literal>nixos-install</literal> and we'll throw in some man
|
||||
pages and <literal>nixos-enter</literal> just in case you want
|
||||
to chroot into your NixOS partition. They are installed by
|
||||
default on NixOS, but you don't have NixOS yet..</para>
|
||||
|
||||
<screen>$ nix-env -iE "_: with import <nixpkgs/nixos> { configuration = {}; }; with config.system.build; [ nixos-generate-config nixos-install nixos-enter manual.manpages ]"</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<note><para>The following 5 steps are only for installing NixOS to
|
||||
another partition. For installing NixOS in place using
|
||||
<literal>NIXOS_LUSTRATE</literal>, skip ahead.</para></note>
|
||||
|
||||
<para>Prepare your target partition:</para>
|
||||
|
||||
<para>At this point it is time to prepare your target partition.
|
||||
Please refer to the partitioning, file-system creation, and
|
||||
mounting steps of <xref linkend="sec-installation" /></para>
|
||||
|
||||
<para>If you're about to install NixOS in place using
|
||||
<literal>NIXOS_LUSTRATE</literal> there is nothing to do for
|
||||
this step.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Generate your NixOS configuration:</para>
|
||||
|
||||
<screen>$ sudo `which nixos-generate-config` --root /mnt</screen>
|
||||
|
||||
<para>You'll probably want to edit the configuration files. Refer
|
||||
to the <literal>nixos-generate-config</literal> step in <xref
|
||||
linkend="sec-installation" /> for more information.</para>
|
||||
|
||||
<para>Consider setting up the NixOS bootloader to give you the
|
||||
ability to boot on your existing Linux partition. For instance,
|
||||
if you're using GRUB and your existing distribution is running
|
||||
Ubuntu, you may want to add something like this to your
|
||||
<literal>configuration.nix</literal>:</para>
|
||||
|
||||
<programlisting>
|
||||
boot.loader.grub.extraEntries = ''
|
||||
menuentry "Ubuntu" {
|
||||
search --set=ubuntu --fs-uuid 3cc3e652-0c1f-4800-8451-033754f68e6e
|
||||
configfile "($ubuntu)/boot/grub/grub.cfg"
|
||||
}
|
||||
'';</programlisting>
|
||||
|
||||
<para>(You can find the appropriate UUID for your partition in
|
||||
<literal>/dev/disk/by-uuid</literal>)</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Create the <literal>nixbld</literal> group and user on your
|
||||
original distribution:</para>
|
||||
|
||||
<screen>
|
||||
$ sudo groupadd -g 30000 nixbld
|
||||
$ sudo useradd -u 30000 -g nixbld -G nixbld nixbld</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Download/build/install NixOS:</para>
|
||||
|
||||
<warning><para>Once you complete this step, you might no longer be
|
||||
able to boot on existing systems without the help of a
|
||||
rescue USB drive or similar.</para></warning>
|
||||
|
||||
<screen>$ sudo PATH="$PATH" NIX_PATH="$NIX_PATH" `which nixos-install` --root /mnt</screen>
|
||||
|
||||
<para>Again, please refer to the <literal>nixos-install</literal>
|
||||
step in <xref linkend="sec-installation" /> for more
|
||||
information.</para>
|
||||
|
||||
<para>That should be it for installation to another partition!</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Optionally, you may want to clean up your non-NixOS distribution:</para>
|
||||
|
||||
<screen>
|
||||
$ sudo userdel nixbld
|
||||
$ sudo groupdel nixbld</screen>
|
||||
|
||||
<para>If you do not wish to keep the Nix package mananager
|
||||
installed either, run something like <literal>sudo rm -rv
|
||||
~/.nix-* /nix</literal> and remove the line that the Nix
|
||||
installer added to your <literal>~/.profile</literal>.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<note><para>The following steps are only for installing NixOS in
|
||||
place using
|
||||
<literal>NIXOS_LUSTRATE</literal>:</para></note>
|
||||
|
||||
<para>Generate your NixOS configuration:</para>
|
||||
|
||||
<screen>$ sudo `which nixos-generate-config` --root /</screen>
|
||||
|
||||
<para>Note that this will place the generated configuration files
|
||||
in <literal>/etc/nixos</literal>. You'll probably want to edit
|
||||
the configuration files. Refer to the
|
||||
<literal>nixos-generate-config</literal> step in <xref
|
||||
linkend="sec-installation" /> for more information.</para>
|
||||
|
||||
<para>You'll likely want to set a root password for your first boot
|
||||
using the configuration files because you won't have a chance
|
||||
to enter a password until after you reboot. You can initalize
|
||||
the root password to an empty one with this line: (and of course
|
||||
don't forget to set one once you've rebooted or to lock the
|
||||
account with <literal>sudo passwd -l root</literal> if you use
|
||||
<literal>sudo</literal>)</para>
|
||||
|
||||
<programlisting>users.extraUsers.root.initialHashedPassword = "";</programlisting>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Build the NixOS closure and install it in the
|
||||
<literal>system</literal> profile:</para>
|
||||
|
||||
<screen>$ nix-env -p /nix/var/nix/profiles/system -f '<nixpkgs/nixos>' -I nixos-config=/etc/nixos/configuration.nix -iA system</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Change ownership of the <literal>/nix</literal> tree to root
|
||||
(since your Nix install was probably single user):</para>
|
||||
|
||||
<screen>$ sudo chown -R 0.0 /nix</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Set up the <literal>/etc/NIXOS</literal> and
|
||||
<literal>/etc/NIXOS_LUSTRATE</literal> files:</para>
|
||||
|
||||
<para><literal>/etc/NIXOS</literal> officializes that this is now a
|
||||
NixOS partition (the bootup scripts require its presence).</para>
|
||||
|
||||
<para><literal>/etc/NIXOS_LUSTRATE</literal> tells the NixOS bootup
|
||||
scripts to move <emphasis>everything</emphasis> that's in the
|
||||
root partition to <literal>/old-root</literal>. This will move
|
||||
your existing distribution out of the way in the very early
|
||||
stages of the NixOS bootup. There are exceptions (we do need to
|
||||
keep NixOS there after all), so the NixOS lustrate process will
|
||||
not touch:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>The <literal>/nix</literal>
|
||||
directory</para></listitem>
|
||||
|
||||
<listitem><para>The <literal>/boot</literal>
|
||||
directory</para></listitem>
|
||||
|
||||
<listitem><para>Any file or directory listed in
|
||||
<literal>/etc/NIXOS_LUSTRATE</literal> (one per
|
||||
line)</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<note><para>Support for <literal>NIXOS_LUSTRATE</literal> was added
|
||||
in NixOS 16.09. The act of "lustrating" refers to the
|
||||
wiping of the existing distribution. Creating
|
||||
<literal>/etc/NIXOS_LUSTRATE</literal> can also be used on
|
||||
NixOS to remove all mutable files from your root partition
|
||||
(anything that's not in <literal>/nix</literal> or
|
||||
<literal>/boot</literal> gets "lustrated" on the next
|
||||
boot.</para>
|
||||
<para>lustrate /ˈlʌstreɪt/ verb.</para>
|
||||
<para>purify by expiatory sacrifice, ceremonial washing, or
|
||||
some other ritual action.</para></note>
|
||||
|
||||
<para>Let's create the files:</para>
|
||||
|
||||
<screen>
|
||||
$ sudo touch /etc/NIXOS
|
||||
$ sudo touch /etc/NIXOS_LUSTRATE</screen>
|
||||
|
||||
<para>Let's also make sure the NixOS configuration files are kept
|
||||
once we reboot on NixOS:</para>
|
||||
|
||||
<screen>
|
||||
$ echo etc/nixos | sudo tee -a /etc/NIXOS_LUSTRATE</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Finally, move the <literal>/boot</literal> directory of your
|
||||
current distribution out of the way (the lustrate process will
|
||||
take care of the rest once you reboot, but this one must be
|
||||
moved out now because NixOS needs to install its own boot
|
||||
files:</para>
|
||||
|
||||
<warning><para>Once you complete this step, your current
|
||||
distribution will no longer be bootable! If you didn't get
|
||||
all the NixOS configuration right, especially those
|
||||
settings pertaining to boot loading and root partition,
|
||||
NixOS may not be bootable either. Have a USB rescue device
|
||||
ready in case this happens. </para></warning>
|
||||
|
||||
<screen>
|
||||
$ sudo mv -v /boot /boot.bak &&
|
||||
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration boot</screen>
|
||||
|
||||
<para>Cross your fingers, reboot, hopefully you should get a NixOS
|
||||
prompt!</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>If for some reason you want to revert to the old
|
||||
distribution, you'll need to boot on a USB rescue disk and do
|
||||
something along these lines:</para>
|
||||
|
||||
<screen>
|
||||
# mkdir root
|
||||
# mount /dev/sdaX root
|
||||
# mkdir root/nixos-root
|
||||
# mv -v root/* root/nixos-root/
|
||||
# mv -v root/nixos-root/old-root/* root/
|
||||
# mv -v root/boot.bak root/boot # We had renamed this by hand earlier
|
||||
# umount root
|
||||
# reboot</screen>
|
||||
|
||||
<para>This may work as is or you might also need to reinstall the
|
||||
boot loader</para>
|
||||
|
||||
<para>And of course, if you're happy with NixOS and no longer need
|
||||
the old distribution:</para>
|
||||
|
||||
<screen>sudo rm -rf /old-root</screen>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>It's also worth noting that this whole process can be
|
||||
automated. This is especially useful for Cloud VMs, where
|
||||
provider do not provide NixOS. For instance, <link
|
||||
xlink:href="https://github.com/elitak/nixos-infect">nixos-infect</link>
|
||||
uses the lustrate process to convert Digital Ocean droplets to
|
||||
NixOS from other distributions automatically.</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</section>
|
@ -401,5 +401,6 @@ drive (here <filename>/dev/sda</filename>). <xref linkend="ex-config"
|
||||
<xi:include href="installing-usb.xml" />
|
||||
<xi:include href="installing-pxe.xml" />
|
||||
<xi:include href="installing-virtualbox-guest.xml" />
|
||||
<xi:include href="installing-from-other-distro.xml" />
|
||||
|
||||
</chapter>
|
||||
|
119
nixos/doc/manual/man-nixos-enter.xml
Normal file
119
nixos/doc/manual/man-nixos-enter.xml
Normal file
@ -0,0 +1,119 @@
|
||||
<refentry xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle><command>nixos-enter</command></refentrytitle>
|
||||
<manvolnum>8</manvolnum>
|
||||
<refmiscinfo class="source">NixOS</refmiscinfo>
|
||||
<!-- <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> -->
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname><command>nixos-enter</command></refname>
|
||||
<refpurpose>run a command in a NixOS chroot environment</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>nixos-enter</command>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--root</option></arg>
|
||||
<replaceable>root</replaceable>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--system</option></arg>
|
||||
<replaceable>system</replaceable>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>-c</option></arg>
|
||||
<replaceable>shell-command</replaceable>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--help</option></arg>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--</option></arg>
|
||||
<replaceable>arguments</replaceable>
|
||||
</arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
|
||||
<refsection><title>Description</title>
|
||||
|
||||
<para>This command runs a command in a NixOS chroot environment, that
|
||||
is, in a filesystem hierarchy previously prepared using
|
||||
<command>nixos-install</command>.</para>
|
||||
|
||||
</refsection>
|
||||
|
||||
<refsection><title>Options</title>
|
||||
|
||||
<para>This command accepts the following options:</para>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--root</option></term>
|
||||
<listitem>
|
||||
<para>The path to the NixOS system you want to enter. It defaults to <filename>/mnt</filename>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--system</option></term>
|
||||
<listitem>
|
||||
<para>The NixOS system configuration to use. It defaults to
|
||||
<filename>/nix/var/nix/profiles/system</filename>. You can enter
|
||||
a previous NixOS configuration by specifying a path such as
|
||||
<filename>/nix/var/nix/profiles/system-106-link</filename>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--command</option></term>
|
||||
<term><option>-c</option></term>
|
||||
<listitem>
|
||||
<para>The bash command to execute.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--</option></term>
|
||||
|
||||
<listitem><para>Interpret the remaining arguments as the program
|
||||
name and arguments to be invoked. The program is not executed in a
|
||||
shell.</para></listitem>
|
||||
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</refsection>
|
||||
|
||||
|
||||
<refsection><title>Examples</title>
|
||||
|
||||
<para>Start an interactive shell in the NixOS installation in
|
||||
<filename>/mnt</filename>:</para>
|
||||
|
||||
<screen>
|
||||
# nixos-enter /mnt
|
||||
</screen>
|
||||
|
||||
<para>Run a shell command:</para>
|
||||
|
||||
<screen>
|
||||
# nixos-enter -c 'ls -l /; cat /proc/mounts'
|
||||
</screen>
|
||||
|
||||
<para>Run a non-shell command:</para>
|
||||
|
||||
<screen>
|
||||
# nixos-enter -- cat /proc/mounts
|
||||
</screen>
|
||||
|
||||
</refsection>
|
||||
|
||||
</refentry>
|
@ -26,8 +26,8 @@
|
||||
<replaceable>root</replaceable>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--closure</option></arg>
|
||||
<replaceable>closure</replaceable>
|
||||
<arg choice='plain'><option>--system</option></arg>
|
||||
<replaceable>path</replaceable>
|
||||
</arg>
|
||||
<arg>
|
||||
<arg choice='plain'><option>--no-channel-copy</option></arg>
|
||||
@ -118,7 +118,7 @@ it.</para>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--closure</option></term>
|
||||
<term><option>--system</option></term>
|
||||
<listitem>
|
||||
<para>If this option is provided, <command>nixos-install</command> will install the specified closure
|
||||
rather than attempt to build one from <filename>/mnt/etc/nixos/configuration.nix</filename>.</para>
|
||||
|
@ -15,7 +15,7 @@
|
||||
</author>
|
||||
|
||||
<copyright>
|
||||
<year>2007-2015</year>
|
||||
<year>2007-2018</year>
|
||||
<holder>Eelco Dolstra</holder>
|
||||
</copyright>
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
<xi:include href="man-nixos-build-vms.xml" />
|
||||
<xi:include href="man-nixos-generate-config.xml" />
|
||||
<xi:include href="man-nixos-install.xml" />
|
||||
<xi:include href="man-nixos-enter.xml" />
|
||||
<xi:include href="man-nixos-option.xml" />
|
||||
<xi:include href="man-nixos-rebuild.xml" />
|
||||
<xi:include href="man-nixos-version.xml" />
|
||||
|
@ -9,6 +9,7 @@
|
||||
<para>This section lists the release notes for each stable version of NixOS
|
||||
and current unstable revision.</para>
|
||||
|
||||
<xi:include href="rl-1809.xml" />
|
||||
<xi:include href="rl-1803.xml" />
|
||||
<xi:include href="rl-1709.xml" />
|
||||
<xi:include href="rl-1703.xml" />
|
||||
|
@ -18,6 +18,25 @@
|
||||
has the following highlights: </para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Nix now defaults to 2.0; see its
|
||||
<link xlink:href="https://nixos.org/nix/manual/#ssec-relnotes-2.0">release notes</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Linux kernel defaults to the 4.14 branch (it was 4.9).
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
GCC defaults to 7.x (it was 6.x).
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
MariaDB 10.2, updated from 10.1, is now the default MySQL implementation. While upgrading a few changes
|
||||
@ -181,7 +200,7 @@ following incompatible changes:</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<literal>lib.addPassthru drv passthru</literal> is removed. Use <literal>lib.extendDerivation true passthru drv</literal> instead. <emphasis role="strong">TODO: actually remove it before branching 18.03 off.</emphasis>
|
||||
<literal>lib.addPassthru drv passthru</literal> is removed. Use <literal>lib.extendDerivation true passthru drv</literal> instead.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
@ -296,6 +315,13 @@ following incompatible changes:</para>
|
||||
<literal>nodejs-4_x</literal>, <literal>nodejs-slim-4_x</literal> and <literal>nodePackages_4_x</literal> are removed.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>pump.io</literal> NixOS module was removed.
|
||||
It is now maintained as an
|
||||
<link xlink:href="https://github.com/rvl/pump.io-nixos">external module</link>.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</section>
|
||||
|
82
nixos/doc/manual/release-notes/rl-1809.xml
Normal file
82
nixos/doc/manual/release-notes/rl-1809.xml
Normal file
@ -0,0 +1,82 @@
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-release-18.09">
|
||||
|
||||
<title>Release 18.09 (“??”, 2018/09/??)</title>
|
||||
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-release-18.09-highlights">
|
||||
|
||||
<title>Highlights</title>
|
||||
|
||||
<para>In addition to numerous new and upgraded packages, this release
|
||||
has the following highlights: </para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
TODO
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
</itemizedlist>
|
||||
|
||||
</section>
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-release-18.09-new-services">
|
||||
|
||||
<title>New Services</title>
|
||||
|
||||
<para>The following new services were added since the last release:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para></para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</section>
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-release-18.09-incompatibilities">
|
||||
|
||||
<title>Backward Incompatibilities</title>
|
||||
|
||||
<para>When upgrading from a previous release, please be aware of the
|
||||
following incompatible changes:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</section>
|
||||
<section xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
version="5.0"
|
||||
xml:id="sec-release-18.09-notable-changes">
|
||||
|
||||
<title>Other Notable Changes</title>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</section>
|
||||
</section>
|
@ -51,7 +51,7 @@ with lib;
|
||||
|
||||
let format' = format; in let
|
||||
|
||||
format = if (format' == "qcow2-compressed") then "qcow2" else format';
|
||||
format = if format' == "qcow2-compressed" then "qcow2" else format';
|
||||
|
||||
compress = optionalString (format' == "qcow2-compressed") "-c";
|
||||
|
||||
@ -84,6 +84,7 @@ let format' = format; in let
|
||||
|
||||
nixpkgs = cleanSource pkgs.path;
|
||||
|
||||
# FIXME: merge with channel.nix / make-channel.nix.
|
||||
channelSources = pkgs.runCommand "nixos-${config.system.nixos.version}" {} ''
|
||||
mkdir -p $out
|
||||
cp -prd ${nixpkgs} $out/nixos
|
||||
@ -95,13 +96,16 @@ let format' = format; in let
|
||||
echo -n ${config.system.nixos.versionSuffix} > $out/nixos/.version-suffix
|
||||
'';
|
||||
|
||||
metaClosure = pkgs.writeText "meta" ''
|
||||
${config.system.build.toplevel}
|
||||
${config.nix.package.out}
|
||||
${channelSources}
|
||||
'';
|
||||
|
||||
prepareImageInputs = with pkgs; [ rsync utillinux parted e2fsprogs lkl fakeroot config.system.build.nixos-prepare-root ] ++ stdenv.initialPath;
|
||||
binPath = with pkgs; makeBinPath (
|
||||
[ rsync
|
||||
utillinux
|
||||
parted
|
||||
e2fsprogs
|
||||
lkl
|
||||
config.system.build.nixos-install
|
||||
config.system.build.nixos-enter
|
||||
nix
|
||||
] ++ stdenv.initialPath);
|
||||
|
||||
# I'm preserving the line below because I'm going to search for it across nixpkgs to consolidate
|
||||
# image building logic. The comment right below this now appears in 4 different places in nixpkgs :)
|
||||
@ -109,8 +113,10 @@ let format' = format; in let
|
||||
sources = map (x: x.source) contents;
|
||||
targets = map (x: x.target) contents;
|
||||
|
||||
closureInfo = pkgs.closureInfo { rootPaths = [ config.system.build.toplevel channelSources ]; };
|
||||
|
||||
prepareImage = ''
|
||||
export PATH=${makeBinPath prepareImageInputs}
|
||||
export PATH=${binPath}
|
||||
|
||||
# Yes, mkfs.ext4 takes different units in different contexts. Fun.
|
||||
sectorsToKilobytes() {
|
||||
@ -168,11 +174,15 @@ let format' = format; in let
|
||||
fi
|
||||
done
|
||||
|
||||
# TODO: Nix really likes to chown things it creates to its current user...
|
||||
fakeroot nixos-prepare-root $root ${channelSources} ${config.system.build.toplevel} closure
|
||||
export HOME=$TMPDIR
|
||||
|
||||
# fakeroot seems to always give the owner write permissions, which we do not want
|
||||
find $root/nix/store -mindepth 1 -maxdepth 1 -type f -o -type d | xargs chmod -R a-w
|
||||
# Provide a Nix database so that nixos-install can copy closures.
|
||||
export NIX_STATE_DIR=$TMPDIR/state
|
||||
nix-store --load-db < ${closureInfo}/registration
|
||||
|
||||
echo "running nixos-install..."
|
||||
nixos-install --root $root --no-bootloader --no-root-passwd \
|
||||
--system ${config.system.build.toplevel} --channel ${channelSources} --substituters ""
|
||||
|
||||
echo "copying staging root to image..."
|
||||
cptofs -p ${optionalString (partitionTableType != "none") "-P ${rootPartition}"} -t ${fsType} -i $diskImage $root/* /
|
||||
@ -181,7 +191,6 @@ in pkgs.vmTools.runInLinuxVM (
|
||||
pkgs.runCommand name
|
||||
{ preVM = prepareImage;
|
||||
buildInputs = with pkgs; [ utillinux e2fsprogs dosfstools ];
|
||||
exportReferencesGraph = [ "closure" metaClosure ];
|
||||
postVM = ''
|
||||
${if format == "raw" then ''
|
||||
mv $diskImage $out/${filename}
|
||||
@ -194,6 +203,8 @@ in pkgs.vmTools.runInLinuxVM (
|
||||
memSize = 1024;
|
||||
}
|
||||
''
|
||||
export PATH=${binPath}:$PATH
|
||||
|
||||
rootDisk=${if partitionTableType != "none" then "/dev/vda${rootPartition}" else "/dev/vda"}
|
||||
|
||||
# Some tools assume these exist
|
||||
@ -218,15 +229,8 @@ in pkgs.vmTools.runInLinuxVM (
|
||||
cp ${configFile} /mnt/etc/nixos/configuration.nix
|
||||
''}
|
||||
|
||||
mount --rbind /dev $mountPoint/dev
|
||||
mount --rbind /proc $mountPoint/proc
|
||||
mount --rbind /sys $mountPoint/sys
|
||||
|
||||
# Set up core system link, GRUB, etc.
|
||||
NIXOS_INSTALL_BOOTLOADER=1 chroot $mountPoint /nix/var/nix/profiles/system/bin/switch-to-configuration boot
|
||||
|
||||
# TODO: figure out if I should activate, but for now I won't
|
||||
# chroot $mountPoint /nix/var/nix/profiles/system/activate
|
||||
NIXOS_INSTALL_BOOTLOADER=1 nixos-enter --root $mountPoint -- /nix/var/nix/profiles/system/bin/switch-to-configuration boot
|
||||
|
||||
# The above scripts will generate a random machine-id and we don't want to bake a single ID into all our images
|
||||
rm -f $mountPoint/etc/machine-id
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, perl, pathsFromGraph, xorriso, syslinux
|
||||
{ stdenv, perl, closureInfo, xorriso, syslinux
|
||||
|
||||
, # The file name of the resulting ISO image.
|
||||
isoName ? "cd.iso"
|
||||
@ -48,9 +48,9 @@ assert usbBootable -> isohybridMbrImage != "";
|
||||
stdenv.mkDerivation {
|
||||
name = isoName;
|
||||
builder = ./make-iso9660-image.sh;
|
||||
buildInputs = [perl xorriso syslinux];
|
||||
buildInputs = [ xorriso syslinux ];
|
||||
|
||||
inherit isoName bootable bootImage compressImage volumeID pathsFromGraph efiBootImage efiBootable isohybridMbrImage usbBootable;
|
||||
inherit isoName bootable bootImage compressImage volumeID efiBootImage efiBootable isohybridMbrImage usbBootable;
|
||||
|
||||
# !!! should use XML.
|
||||
sources = map (x: x.source) contents;
|
||||
@ -61,6 +61,5 @@ stdenv.mkDerivation {
|
||||
symlinks = map (x: x.symlink) storeContents;
|
||||
|
||||
# For obtaining the closure of `storeContents'.
|
||||
exportReferencesGraph =
|
||||
map (x: [("closure-" + baseNameOf x.object) x.object]) storeContents;
|
||||
closureInfo = closureInfo { rootPaths = map (x: x.object) storeContents; };
|
||||
}
|
||||
|
@ -72,16 +72,15 @@ done
|
||||
|
||||
|
||||
# Add the closures of the top-level store objects.
|
||||
storePaths=$(perl $pathsFromGraph closure-*)
|
||||
for i in $storePaths; do
|
||||
for i in $(< $closureInfo/store-paths); do
|
||||
addPath "${i:1}" "$i"
|
||||
done
|
||||
|
||||
|
||||
# Also include a manifest of the closures in a format suitable for
|
||||
# nix-store --load-db.
|
||||
if [ -n "$object" ]; then
|
||||
printRegistration=1 perl $pathsFromGraph closure-* > nix-path-registration
|
||||
if [[ ${#objects[*]} != 0 ]]; then
|
||||
cp $closureInfo/registration nix-path-registration
|
||||
addPath "nix-path-registration" "nix-path-registration"
|
||||
fi
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, squashfsTools, perl, pathsFromGraph
|
||||
{ stdenv, squashfsTools, closureInfo
|
||||
|
||||
, # The root directory of the squashfs filesystem is filled with the
|
||||
# closures of the Nix store paths listed here.
|
||||
@ -8,50 +8,18 @@
|
||||
stdenv.mkDerivation {
|
||||
name = "squashfs.img";
|
||||
|
||||
nativeBuildInputs = [perl squashfsTools];
|
||||
|
||||
# For obtaining the closure of `storeContents'.
|
||||
exportReferencesGraph =
|
||||
map (x: [("closure-" + baseNameOf x) x]) storeContents;
|
||||
nativeBuildInputs = [ squashfsTools ];
|
||||
|
||||
buildCommand =
|
||||
''
|
||||
# Add the closures of the top-level store objects.
|
||||
storePaths=$(perl ${pathsFromGraph} closure-*)
|
||||
|
||||
# If a Hydra slave happens to have store paths with bad permissions/mtime,
|
||||
# abort now so that they don't end up in ISO images in the channel.
|
||||
# https://github.com/NixOS/nixpkgs/issues/32242
|
||||
hasBadPaths=""
|
||||
for path in $storePaths; do
|
||||
if [ -h "$path" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
mtime=$(stat -c %Y "$path")
|
||||
mode=$(stat -c %a "$path")
|
||||
|
||||
if [ "$mtime" != 1 ]; then
|
||||
echo "Store path '$path' has an invalid mtime."
|
||||
hasBadPaths=1
|
||||
fi
|
||||
if [ "$mode" != 444 ] && [ "$mode" != 555 ]; then
|
||||
echo "Store path '$path' has invalid permissions ($mode)."
|
||||
hasBadPaths=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$hasBadPaths" ]; then
|
||||
echo "You have bad paths in your store, please fix them."
|
||||
exit 1
|
||||
fi
|
||||
closureInfo=${closureInfo { rootPaths = storeContents; }}
|
||||
|
||||
# Also include a manifest of the closures in a format suitable
|
||||
# for nix-store --load-db.
|
||||
printRegistration=1 perl ${pathsFromGraph} closure-* > nix-path-registration
|
||||
cp $closureInfo/registration nix-path-registration
|
||||
|
||||
# Generate the squashfs image.
|
||||
mksquashfs nix-path-registration $storePaths $out \
|
||||
mksquashfs nix-path-registration $(cat $closureInfo/store-paths) $out \
|
||||
-keep-as-directory -all-root -b 1048576 -comp xz -Xdict-size 100%
|
||||
'';
|
||||
}
|
||||
|
@ -3,7 +3,11 @@
|
||||
with import ./build-vms.nix { inherit system minimal config; };
|
||||
with pkgs;
|
||||
|
||||
rec {
|
||||
let
|
||||
jquery-ui = callPackage ./testing/jquery-ui.nix { };
|
||||
jquery = callPackage ./testing/jquery.nix { };
|
||||
|
||||
in rec {
|
||||
|
||||
inherit pkgs;
|
||||
|
||||
@ -143,8 +147,8 @@ rec {
|
||||
test = passMeta (runTests driver);
|
||||
report = passMeta (releaseTools.gcovReport { coverageRuns = [ test ]; });
|
||||
|
||||
in (if makeCoverageReport then report else test) // {
|
||||
inherit nodes driver test;
|
||||
in (if makeCoverageReport then report else test) // {
|
||||
inherit nodes driver test;
|
||||
};
|
||||
|
||||
runInMachine =
|
||||
|
@ -529,6 +529,9 @@ in {
|
||||
|
||||
system.activationScripts.users = stringAfter [ "stdio" ]
|
||||
''
|
||||
install -m 0700 -d /root
|
||||
install -m 0755 -d /home
|
||||
|
||||
${pkgs.perl}/bin/perl -w \
|
||||
-I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl \
|
||||
-I${pkgs.perlPackages.JSON}/lib/perl5/site_perl \
|
||||
|
@ -34,10 +34,17 @@ in
|
||||
{
|
||||
options = {
|
||||
hardware.opengl.enable = mkOption {
|
||||
description = "Whether this configuration requires OpenGL.";
|
||||
description = ''
|
||||
Whether to enable OpenGL drivers. This is needed to enable
|
||||
OpenGL support in X11 systems, as well as for Wayland compositors
|
||||
like sway, way-cooler and Weston. It is enabled by default
|
||||
by the corresponding modules, so you do not usually have to
|
||||
set it yourself, only if there is no module for your wayland
|
||||
compositor of choice. See services.xserver.enable,
|
||||
programs.sway.enable, and programs.way-cooler.enable.
|
||||
'';
|
||||
type = types.bool;
|
||||
default = false;
|
||||
internal = true;
|
||||
};
|
||||
|
||||
hardware.opengl.driSupport = mkOption {
|
||||
|
@ -331,8 +331,7 @@ in
|
||||
config.system.build.toplevel.drvPath;
|
||||
|
||||
# Create the squashfs image that contains the Nix store.
|
||||
system.build.squashfsStore = import ../../../lib/make-squashfs.nix {
|
||||
inherit (pkgs) stdenv squashfsTools perl pathsFromGraph;
|
||||
system.build.squashfsStore = pkgs.callPackage ../../../lib/make-squashfs.nix {
|
||||
storeContents = config.isoImage.storeContents;
|
||||
};
|
||||
|
||||
@ -383,11 +382,8 @@ in
|
||||
boot.loader.timeout = 10;
|
||||
|
||||
# Create the ISO image.
|
||||
system.build.isoImage = import ../../../lib/make-iso9660-image.nix ({
|
||||
inherit (pkgs) stdenv perl pathsFromGraph xorriso syslinux;
|
||||
|
||||
system.build.isoImage = pkgs.callPackage ../../../lib/make-iso9660-image.nix ({
|
||||
inherit (config.isoImage) isoName compressImage volumeID contents;
|
||||
|
||||
bootable = true;
|
||||
bootImage = "/isolinux/isolinux.bin";
|
||||
} // optionalAttrs config.isoImage.makeUsbBootable {
|
||||
|
@ -67,7 +67,7 @@ with lib;
|
||||
|
||||
# Create the squashfs image that contains the Nix store.
|
||||
system.build.squashfsStore = import ../../../lib/make-squashfs.nix {
|
||||
inherit (pkgs) stdenv squashfsTools perl pathsFromGraph;
|
||||
inherit (pkgs) stdenv squashfsTools closureInfo;
|
||||
storeContents = config.netboot.storeContents;
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
x86_64-linux = "/nix/store/gy4yv67gv3j6in0lalw37j353zdmfcwm-nix-1.11.16";
|
||||
i686-linux = "/nix/store/ifmyq5ryfxhhrzh62hiq65xyz1fwffga-nix-1.11.16";
|
||||
aarch64-linux = "/nix/store/y9mfv3sx75mbfibf1zna1kq9v98fk2nb-nix-1.11.16";
|
||||
x86_64-darwin = "/nix/store/hwpp7kia2f0in5ns2hiw41q38k30jpj2-nix-1.11.16";
|
||||
x86_64-linux = "/nix/store/6p2gambjac7xdkd2a7w1dsxdk1q5cq4d-nix-2.0";
|
||||
i686-linux = "/nix/store/zznnaijjk3nwx0cmpczxsvngmqzhl7r4-nix-2.0";
|
||||
aarch64-linux = "/nix/store/ci96w9kxfkmlc7x2vwqiz4da0r6abxnq-nix-2.0";
|
||||
x86_64-darwin = "/nix/store/xmi4fylvx4qc79ji9v5q3zfy9vfdy4sv-nix-2.0";
|
||||
}
|
||||
|
60
nixos/modules/installer/tools/nixos-enter.sh
Normal file
60
nixos/modules/installer/tools/nixos-enter.sh
Normal file
@ -0,0 +1,60 @@
|
||||
#! @shell@
|
||||
|
||||
set -e
|
||||
|
||||
# Re-exec ourselves in a private mount namespace so that our bind
|
||||
# mounts get cleaned up automatically.
|
||||
if [ -z "$NIXOS_ENTER_REEXEC" ]; then
|
||||
export NIXOS_ENTER_REEXEC=1
|
||||
if [ "$(id -u)" != 0 ]; then
|
||||
extraFlags="-r"
|
||||
fi
|
||||
exec unshare --fork --mount --uts --mount-proc --pid $extraFlags -- "$0" "$@"
|
||||
else
|
||||
mount --make-rprivate /
|
||||
fi
|
||||
|
||||
mountPoint=/mnt
|
||||
system=/nix/var/nix/profiles/system
|
||||
command=($system/sw/bin/bash "--login")
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
i="$1"; shift 1
|
||||
case "$i" in
|
||||
--root)
|
||||
mountPoint="$1"; shift 1
|
||||
;;
|
||||
--system)
|
||||
system="$1"; shift 1
|
||||
;;
|
||||
--help)
|
||||
exec man nixos-enter
|
||||
exit 1
|
||||
;;
|
||||
--command|-c)
|
||||
command=($system/sw/bin/bash "-c" "$1")
|
||||
shift 1
|
||||
;;
|
||||
--)
|
||||
command=("$@")
|
||||
break
|
||||
;;
|
||||
*)
|
||||
echo "$0: unknown option \`$i'"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ! -e $mountPoint/etc/NIXOS ]]; then
|
||||
echo "$0: '$mountPoint' is not a NixOS installation" >&2
|
||||
exit 126
|
||||
fi
|
||||
|
||||
mkdir -m 0755 -p "$mountPoint/dev"
|
||||
mount --rbind /dev "$mountPoint/dev"
|
||||
|
||||
# Run the activation script. Set $LOCALE_ARCHIVE to supress some Perl locale warnings.
|
||||
LOCALE_ARCHIVE=$system/sw/lib/locale/locale-archive chroot "$mountPoint" "$system/activate" >&2 || true
|
||||
|
||||
exec chroot "$mountPoint" "${command[@]}"
|
@ -1,35 +1,23 @@
|
||||
#! @shell@
|
||||
|
||||
# - make Nix store etc.
|
||||
# - copy closure of Nix to target device
|
||||
# - register validity
|
||||
# - with a chroot to the target device:
|
||||
# * nix-env -p /nix/var/nix/profiles/system -i <nix-expr for the configuration>
|
||||
# * install the boot loader
|
||||
set -e
|
||||
shopt -s nullglob
|
||||
|
||||
export PATH=@path@:$PATH
|
||||
|
||||
# Ensure a consistent umask.
|
||||
umask 0022
|
||||
|
||||
# Re-exec ourselves in a private mount namespace so that our bind
|
||||
# mounts get cleaned up automatically.
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
if [ -z "$NIXOS_INSTALL_REEXEC" ]; then
|
||||
export NIXOS_INSTALL_REEXEC=1
|
||||
exec unshare --mount --uts -- "$0" "$@"
|
||||
else
|
||||
mount --make-rprivate /
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parse the command line for the -I flag
|
||||
extraBuildFlags=()
|
||||
chrootCommand=(/run/current-system/sw/bin/bash)
|
||||
buildUsersGroup="nixbld"
|
||||
|
||||
mountPoint=/mnt
|
||||
channelPath=
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
i="$1"; shift 1
|
||||
case "$i" in
|
||||
--max-jobs|-j|--cores|-I)
|
||||
--max-jobs|-j|--cores|-I|--substituters)
|
||||
j="$1"; shift 1
|
||||
extraBuildFlags+=("$i" "$j")
|
||||
;;
|
||||
@ -41,9 +29,11 @@ while [ "$#" -gt 0 ]; do
|
||||
--root)
|
||||
mountPoint="$1"; shift 1
|
||||
;;
|
||||
--closure)
|
||||
closure="$1"; shift 1
|
||||
buildUsersGroup=""
|
||||
--system|--closure)
|
||||
system="$1"; shift 1
|
||||
;;
|
||||
--channel)
|
||||
channelPath="$1"; shift 1
|
||||
;;
|
||||
--no-channel-copy)
|
||||
noChannelCopy=1
|
||||
@ -57,17 +47,13 @@ while [ "$#" -gt 0 ]; do
|
||||
--show-trace)
|
||||
extraBuildFlags+=("$i")
|
||||
;;
|
||||
--chroot)
|
||||
runChroot=1
|
||||
if [[ "$@" != "" ]]; then
|
||||
chrootCommand=("$@")
|
||||
fi
|
||||
break
|
||||
;;
|
||||
--help)
|
||||
exec man nixos-install
|
||||
exit 1
|
||||
;;
|
||||
--debug)
|
||||
set -x
|
||||
;;
|
||||
*)
|
||||
echo "$0: unknown option \`$i'"
|
||||
exit 1
|
||||
@ -75,132 +61,83 @@ while [ "$#" -gt 0 ]; do
|
||||
esac
|
||||
done
|
||||
|
||||
set -e
|
||||
shopt -s nullglob
|
||||
|
||||
if test -z "$mountPoint"; then
|
||||
mountPoint=/mnt
|
||||
fi
|
||||
|
||||
if ! test -e "$mountPoint"; then
|
||||
echo "mount point $mountPoint doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the path of the NixOS configuration file.
|
||||
if test -z "$NIXOS_CONFIG"; then
|
||||
NIXOS_CONFIG=/etc/nixos/configuration.nix
|
||||
if [[ -z $NIXOS_CONFIG ]]; then
|
||||
NIXOS_CONFIG=$mountPoint/etc/nixos/configuration.nix
|
||||
fi
|
||||
|
||||
if [ ! -e "$mountPoint/$NIXOS_CONFIG" ] && [ -z "$closure" ]; then
|
||||
echo "configuration file $mountPoint/$NIXOS_CONFIG doesn't exist"
|
||||
if [[ ${NIXOS_CONFIG:0:1} != / ]]; then
|
||||
echo "$0: \$NIXOS_CONFIG is not an absolute path"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Builds will use users that are members of this group
|
||||
extraBuildFlags+=(--option "build-users-group" "$buildUsersGroup")
|
||||
|
||||
# Inherit binary caches from the host
|
||||
# TODO: will this still work with Nix 1.12 now that it has no perl? Probably not...
|
||||
binary_caches="$(@perl@/bin/perl -I @nix@/lib/perl5/site_perl/*/* -e 'use Nix::Config; Nix::Config::readConfig; print $Nix::Config::config{"binary-caches"};')"
|
||||
extraBuildFlags+=(--option "binary-caches" "$binary_caches")
|
||||
|
||||
# We only need nixpkgs in the path if we don't already have a system closure to install
|
||||
if [[ -z "$closure" ]]; then
|
||||
nixpkgs="$(readlink -f "$(nix-instantiate --find-file nixpkgs)")"
|
||||
export NIX_PATH="nixpkgs=$nixpkgs:nixos-config=$mountPoint/$NIXOS_CONFIG"
|
||||
fi
|
||||
unset NIXOS_CONFIG
|
||||
|
||||
# These get created in nixos-prepare-root as well, but we want to make sure they're here in case we're
|
||||
# running with --chroot. TODO: --chroot should just be split into a separate tool.
|
||||
mkdir -m 0755 -p "$mountPoint/dev" "$mountPoint/proc" "$mountPoint/sys"
|
||||
|
||||
# Set up some bind mounts we'll want regardless of chroot or not
|
||||
mount --rbind /dev "$mountPoint/dev"
|
||||
mount --rbind /proc "$mountPoint/proc"
|
||||
mount --rbind /sys "$mountPoint/sys"
|
||||
|
||||
# If we asked for a chroot, that means we're not actually installing anything (yeah I was confused too)
|
||||
# and we just want to run a command in the context of a $mountPoint that we're assuming has already been
|
||||
# set up by a previous nixos-install invocation. In that case we set up some remaining bind mounts and
|
||||
# exec the requested command, skipping the rest of the installation procedure.
|
||||
if [ -n "$runChroot" ]; then
|
||||
mount -t tmpfs -o "mode=0755" none $mountPoint/run
|
||||
rm -rf $mountPoint/var/run
|
||||
ln -s /run $mountPoint/var/run
|
||||
for f in /etc/resolv.conf /etc/hosts; do rm -f $mountPoint/$f; [ -f "$f" ] && cp -Lf $f $mountPoint/etc/; done
|
||||
for f in /etc/passwd /etc/group; do touch $mountPoint/$f; [ -f "$f" ] && mount --rbind -o ro $f $mountPoint/$f; done
|
||||
|
||||
if ! [ -L $mountPoint/nix/var/nix/profiles/system ]; then
|
||||
echo "$0: installation not finished; cannot chroot into installation directory"
|
||||
exit 1
|
||||
fi
|
||||
ln -s /nix/var/nix/profiles/system $mountPoint/run/current-system
|
||||
exec chroot $mountPoint "${chrootCommand[@]}"
|
||||
if [[ ! -e $NIXOS_CONFIG && -z $system ]]; then
|
||||
echo "configuration file $NIXOS_CONFIG doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# A place to drop temporary closures
|
||||
# A place to drop temporary stuff.
|
||||
trap "rm -rf $tmpdir" EXIT
|
||||
tmpdir="$(mktemp -d)"
|
||||
|
||||
# Build a closure (on the host; we then copy it into the guest)
|
||||
function closure() {
|
||||
nix-build "${extraBuildFlags[@]}" --no-out-link -E "with import <nixpkgs> {}; runCommand \"closure\" { exportReferencesGraph = [ \"x\" (buildEnv { name = \"env\"; paths = [ ($1) stdenv ]; }) ]; } \"cp x \$out\""
|
||||
}
|
||||
sub="auto?trusted=1"
|
||||
|
||||
system_closure="$tmpdir/system.closure"
|
||||
# Use a FIFO for piping nix-store --export into nix-store --import, saving disk
|
||||
# I/O and space. nix-store --import is run by nixos-prepare-root.
|
||||
mkfifo $system_closure
|
||||
|
||||
if [ -z "$closure" ]; then
|
||||
expr="(import <nixpkgs/nixos> {}).system"
|
||||
system_root="$(nix-build -E "$expr")"
|
||||
system_closure="$(closure "$expr")"
|
||||
else
|
||||
system_root=$closure
|
||||
# Create a temporary file ending in .closure (so nixos-prepare-root knows to --import it) to transport the store closure
|
||||
# to the filesytem we're preparing. Also delete it on exit!
|
||||
# Run in background to avoid blocking while trying to write to the FIFO
|
||||
# $system_closure refers to
|
||||
nix-store --export $(nix-store -qR $closure) > $system_closure &
|
||||
# Build the system configuration in the target filesystem.
|
||||
if [[ -z $system ]]; then
|
||||
echo "building the configuration in $NIXOS_CONFIG..."
|
||||
outLink="$tmpdir/system"
|
||||
nix build --out-link "$outLink" --store "$mountPoint" "${extraBuildFlags[@]}" \
|
||||
--extra-substituters "$sub" \
|
||||
-f '<nixpkgs/nixos>' system -I "nixos-config=$NIXOS_CONFIG"
|
||||
system=$(readlink -f $outLink)
|
||||
fi
|
||||
|
||||
channel_root="$(nix-env -p /nix/var/nix/profiles/per-user/root/channels -q nixos --no-name --out-path 2>/dev/null || echo -n "")"
|
||||
channel_closure="$tmpdir/channel.closure"
|
||||
nix-store --export $channel_root > $channel_closure
|
||||
# Set the system profile to point to the configuration. TODO: combine
|
||||
# this with the previous step once we have a nix-env replacement with
|
||||
# a progress bar.
|
||||
nix-env --store "$mountPoint" "${extraBuildFlags[@]}" \
|
||||
--extra-substituters "$sub" \
|
||||
-p $mountPoint/nix/var/nix/profiles/system --set "$system"
|
||||
|
||||
# Populate the target root directory with the basics
|
||||
@prepare_root@/bin/nixos-prepare-root "$mountPoint" "$channel_root" "$system_root" @nixClosure@ "$system_closure" "$channel_closure"
|
||||
# Copy the NixOS/Nixpkgs sources to the target as the initial contents
|
||||
# of the NixOS channel.
|
||||
if [[ -z $noChannelCopy ]]; then
|
||||
if [[ -z $channelPath ]]; then
|
||||
channelPath="$(nix-env -p /nix/var/nix/profiles/per-user/root/channels -q nixos --no-name --out-path 2>/dev/null || echo -n "")"
|
||||
fi
|
||||
if [[ -n $channelPath ]]; then
|
||||
echo "copying channel..."
|
||||
mkdir -p $mountPoint/nix/var/nix/profiles/per-user/root
|
||||
nix-env --store "$mountPoint" "${extraBuildFlags[@]}" --extra-substituters "$sub" \
|
||||
-p $mountPoint/nix/var/nix/profiles/per-user/root/channels --set "$channelPath" --quiet
|
||||
install -m 0700 -d $mountPoint/root/.nix-defexpr
|
||||
ln -sfn /nix/var/nix/profiles/per-user/root/channels $mountPoint/root/.nix-defexpr/channels
|
||||
fi
|
||||
fi
|
||||
|
||||
# nixos-prepare-root doesn't currently do anything with file ownership, so we set it up here instead
|
||||
chown @root_uid@:@nixbld_gid@ $mountPoint/nix/store
|
||||
|
||||
|
||||
|
||||
# Grub needs an mtab.
|
||||
ln -sfn /proc/mounts $mountPoint/etc/mtab
|
||||
# Mark the target as a NixOS installation, otherwise switch-to-configuration will chicken out.
|
||||
mkdir -m 0755 -p "$mountPoint/etc"
|
||||
touch "$mountPoint/etc/NIXOS"
|
||||
|
||||
# Switch to the new system configuration. This will install Grub with
|
||||
# a menu default pointing at the kernel/initrd/etc of the new
|
||||
# configuration.
|
||||
echo "finalising the installation..."
|
||||
if [ -z "$noBootLoader" ]; then
|
||||
NIXOS_INSTALL_BOOTLOADER=1 chroot $mountPoint \
|
||||
/nix/var/nix/profiles/system/bin/switch-to-configuration boot
|
||||
if [[ -z $noBootLoader ]]; then
|
||||
echo "installing the boot loader..."
|
||||
# Grub needs an mtab.
|
||||
ln -sfn /proc/mounts $mountPoint/etc/mtab
|
||||
NIXOS_INSTALL_BOOTLOADER=1 nixos-enter --root "$mountPoint" -- /run/current-system/bin/switch-to-configuration boot
|
||||
fi
|
||||
|
||||
# Run the activation script.
|
||||
chroot $mountPoint /nix/var/nix/profiles/system/activate
|
||||
|
||||
|
||||
# Ask the user to set a root password.
|
||||
if [ -z "$noRootPasswd" ] && chroot $mountPoint [ -x /run/wrappers/bin/passwd ] && [ -t 0 ]; then
|
||||
echo "setting root password..."
|
||||
chroot $mountPoint /run/wrappers/bin/passwd
|
||||
# Ask the user to set a root password, but only if the passwd command
|
||||
# exists (i.e. when mutable user accounts are enabled).
|
||||
if [[ -z $noRootPasswd ]] && [ -t 0 ]; then
|
||||
nixos-enter --root "$mountPoint" -c '[[ -e /nix/var/nix/profiles/system/sw/bin/passwd ]] && echo "setting root password..." && /nix/var/nix/profiles/system/sw/bin/passwd'
|
||||
fi
|
||||
|
||||
|
||||
echo "installation finished!"
|
||||
|
@ -1,104 +0,0 @@
|
||||
#! @shell@
|
||||
|
||||
# This script's goal is to perform all "static" setup of a filesystem structure from pre-built store paths. Everything
|
||||
# in here should run in a non-root context and inside a Nix builder. It's designed primarily to be called from image-
|
||||
# building scripts and from nixos-install, but because it makes very few assumptions about the context in which it runs,
|
||||
# it could be useful in other contexts as well.
|
||||
#
|
||||
# Current behavior:
|
||||
# - set up basic filesystem structure
|
||||
# - make Nix store etc.
|
||||
# - copy Nix, system, channel, and misceallaneous closures to target Nix store
|
||||
# - register validity of all paths in the target store
|
||||
# - set up channel and system profiles
|
||||
|
||||
# Ensure a consistent umask.
|
||||
umask 0022
|
||||
|
||||
set -e
|
||||
|
||||
mountPoint="$1"
|
||||
channel="$2"
|
||||
system="$3"
|
||||
shift 3
|
||||
closures="$@"
|
||||
|
||||
PATH="@coreutils@/bin:@nix@/bin:@perl@/bin:@utillinux@/bin:@rsync@/bin"
|
||||
|
||||
if ! test -e "$mountPoint"; then
|
||||
echo "mount point $mountPoint doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create a few of the standard directories in the target root directory.
|
||||
install -m 0755 -d $mountPoint/dev $mountPoint/proc $mountPoint/sys $mountPoint/etc $mountPoint/run $mountPoint/home
|
||||
install -m 01777 -d $mountPoint/tmp
|
||||
install -m 0755 -d $mountPoint/tmp/root
|
||||
install -m 0755 -d $mountPoint/var
|
||||
install -m 0700 -d $mountPoint/root
|
||||
|
||||
ln -sf /run $mountPoint/var/run
|
||||
|
||||
# Create the necessary Nix directories on the target device
|
||||
install -m 0755 -d \
|
||||
$mountPoint/nix/var/nix/gcroots \
|
||||
$mountPoint/nix/var/nix/temproots \
|
||||
$mountPoint/nix/var/nix/userpool \
|
||||
$mountPoint/nix/var/nix/profiles \
|
||||
$mountPoint/nix/var/nix/db \
|
||||
$mountPoint/nix/var/log/nix/drvs
|
||||
|
||||
install -m 1775 -d $mountPoint/nix/store
|
||||
|
||||
# All Nix operations below should operate on our target store, not /nix/store.
|
||||
# N.B: this relies on Nix 1.12 or higher
|
||||
export NIX_REMOTE=local?root=$mountPoint
|
||||
|
||||
# Copy our closures to the Nix store on the target mount point, unless they're already there.
|
||||
for i in $closures; do
|
||||
# We support closures both in the format produced by `nix-store --export` and by `exportReferencesGraph`,
|
||||
# mostly because there doesn't seem to be a single format that can be produced outside of a nix build and
|
||||
# inside one. See https://github.com/NixOS/nix/issues/1242 for more discussion.
|
||||
if [[ "$i" =~ \.closure$ ]]; then
|
||||
echo "importing serialized closure $i to $mountPoint..."
|
||||
nix-store --import < $i
|
||||
else
|
||||
# There has to be a better way to do this, right?
|
||||
echo "copying closure $i to $mountPoint..."
|
||||
for j in $(perl @pathsFromGraph@ $i); do
|
||||
echo " $j... "
|
||||
rsync -a $j $mountPoint/nix/store/
|
||||
done
|
||||
|
||||
nix-store --option build-users-group root --register-validity < $i
|
||||
fi
|
||||
done
|
||||
|
||||
# Create the required /bin/sh symlink; otherwise lots of things
|
||||
# (notably the system() function) won't work.
|
||||
if [ ! -x $mountPoint/@shell@ ]; then
|
||||
echo "Error: @shell@ wasn't included in the closure" >&2
|
||||
exit 1
|
||||
fi
|
||||
install -m 0755 -d $mountPoint/bin
|
||||
ln -sf @shell@ $mountPoint/bin/sh
|
||||
|
||||
echo "setting the system closure to '$system'..."
|
||||
nix-env "${extraBuildFlags[@]}" -p $mountPoint/nix/var/nix/profiles/system --set "$system"
|
||||
|
||||
ln -sfn /nix/var/nix/profiles/system $mountPoint/run/current-system
|
||||
|
||||
# Copy the NixOS/Nixpkgs sources to the target as the initial contents of the NixOS channel.
|
||||
install -m 0755 -d $mountPoint/nix/var/nix/profiles
|
||||
install -m 1777 -d $mountPoint/nix/var/nix/profiles/per-user
|
||||
install -m 0755 -d $mountPoint/nix/var/nix/profiles/per-user/root
|
||||
|
||||
if [ -z "$noChannelCopy" ] && [ -n "$channel" ]; then
|
||||
echo "copying channel..."
|
||||
nix-env --option build-use-substitutes false "${extraBuildFlags[@]}" -p $mountPoint/nix/var/nix/profiles/per-user/root/channels --set "$channel" --quiet
|
||||
fi
|
||||
install -m 0700 -d $mountPoint/root/.nix-defexpr
|
||||
ln -sfn /nix/var/nix/profiles/per-user/root/channels $mountPoint/root/.nix-defexpr/channels
|
||||
|
||||
# Mark the target as a NixOS installation, otherwise switch-to-configuration will chicken out.
|
||||
touch $mountPoint/etc/NIXOS
|
@ -1,7 +1,9 @@
|
||||
# This module generates nixos-install, nixos-rebuild,
|
||||
# nixos-generate-config, etc.
|
||||
|
||||
{ config, pkgs, modulesPath, ... }:
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.installer;
|
||||
@ -16,28 +18,11 @@ let
|
||||
src = ./nixos-build-vms/nixos-build-vms.sh;
|
||||
};
|
||||
|
||||
nixos-prepare-root = makeProg {
|
||||
name = "nixos-prepare-root";
|
||||
src = ./nixos-prepare-root.sh;
|
||||
|
||||
nix = pkgs.nixUnstable;
|
||||
inherit (pkgs) perl pathsFromGraph rsync utillinux coreutils;
|
||||
};
|
||||
|
||||
nixos-install = makeProg {
|
||||
name = "nixos-install";
|
||||
src = ./nixos-install.sh;
|
||||
|
||||
inherit (pkgs) perl pathsFromGraph rsync;
|
||||
nix = config.nix.package.out;
|
||||
cacert = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||
root_uid = config.ids.uids.root;
|
||||
nixbld_gid = config.ids.gids.nixbld;
|
||||
prepare_root = nixos-prepare-root;
|
||||
|
||||
nixClosure = pkgs.runCommand "closure"
|
||||
{ exportReferencesGraph = ["refs" config.nix.package.out]; }
|
||||
"cp refs $out";
|
||||
path = makeBinPath [ nixos-enter ];
|
||||
};
|
||||
|
||||
nixos-rebuild =
|
||||
@ -69,6 +54,11 @@ let
|
||||
inherit (config.system.nixos) version codeName revision;
|
||||
};
|
||||
|
||||
nixos-enter = makeProg {
|
||||
name = "nixos-enter";
|
||||
src = ./nixos-enter.sh;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
@ -77,16 +67,16 @@ in
|
||||
|
||||
environment.systemPackages =
|
||||
[ nixos-build-vms
|
||||
nixos-prepare-root
|
||||
nixos-install
|
||||
nixos-rebuild
|
||||
nixos-generate-config
|
||||
nixos-option
|
||||
nixos-version
|
||||
nixos-enter
|
||||
];
|
||||
|
||||
system.build = {
|
||||
inherit nixos-install nixos-prepare-root nixos-generate-config nixos-option nixos-rebuild;
|
||||
inherit nixos-install nixos-prepare-root nixos-generate-config nixos-option nixos-rebuild nixos-enter;
|
||||
};
|
||||
|
||||
};
|
||||
|
@ -19,4 +19,6 @@ with 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" "modesetting" ];
|
||||
|
||||
powerManagement.enable = false;
|
||||
}
|
||||
|
@ -233,7 +233,7 @@
|
||||
calibre-server = 213;
|
||||
heapster = 214;
|
||||
bepasty = 215;
|
||||
pumpio = 216;
|
||||
# pumpio = 216; # unused, removed 2018-02-24
|
||||
nm-openvpn = 217;
|
||||
mathics = 218;
|
||||
ejabberd = 219;
|
||||
@ -514,7 +514,7 @@
|
||||
xtreemfs = 212;
|
||||
calibre-server = 213;
|
||||
bepasty = 215;
|
||||
pumpio = 216;
|
||||
# pumpio = 216; # unused, removed 2018-02-24
|
||||
nm-openvpn = 217;
|
||||
mathics = 218;
|
||||
ejabberd = 219;
|
||||
|
@ -642,7 +642,6 @@
|
||||
./services/web-apps/nexus.nix
|
||||
./services/web-apps/pgpkeyserver-lite.nix
|
||||
./services/web-apps/matomo.nix
|
||||
./services/web-apps/pump.io.nix
|
||||
./services/web-apps/restya-board.nix
|
||||
./services/web-apps/tt-rss.nix
|
||||
./services/web-apps/selfoss.nix
|
||||
|
@ -10,4 +10,10 @@
|
||||
password = "demo";
|
||||
uid = 1000;
|
||||
};
|
||||
|
||||
services.xserver.displayManager.sddm.autoLogin = {
|
||||
enable = true;
|
||||
relogin = true;
|
||||
user = "demo";
|
||||
};
|
||||
}
|
||||
|
@ -72,7 +72,13 @@ with lib;
|
||||
|
||||
# To speed up installation a little bit, include the complete
|
||||
# stdenv in the Nix store on the CD.
|
||||
system.extraDependencies = with pkgs; [ stdenv stdenvNoCC busybox ];
|
||||
system.extraDependencies = with pkgs;
|
||||
[
|
||||
stdenv
|
||||
stdenvNoCC # for runCommand
|
||||
busybox
|
||||
jq # for closureInfo
|
||||
];
|
||||
|
||||
# Show all debug messages from the kernel but don't log refused packets
|
||||
# because we have the firewall enabled. This makes installs from the
|
||||
|
@ -126,7 +126,7 @@ in
|
||||
programs.bash = {
|
||||
|
||||
shellInit = ''
|
||||
. ${config.system.build.setEnvironment}
|
||||
${config.system.build.setEnvironment.text}
|
||||
|
||||
${cfge.shellInit}
|
||||
'';
|
||||
|
@ -108,7 +108,7 @@ in
|
||||
if [ -n "$__ETC_ZSHENV_SOURCED" ]; then return; fi
|
||||
export __ETC_ZSHENV_SOURCED=1
|
||||
|
||||
. ${config.system.build.setEnvironment}
|
||||
${config.system.build.setEnvironment.text}
|
||||
|
||||
${cfge.shellInit}
|
||||
|
||||
|
@ -7,8 +7,10 @@ let
|
||||
cfg = config.services.openldap;
|
||||
openldap = pkgs.openldap;
|
||||
|
||||
dataFile = pkgs.writeText "ldap-contents.ldif" cfg.declarativeContents;
|
||||
configFile = pkgs.writeText "slapd.conf" cfg.extraConfig;
|
||||
|
||||
configOpts = if cfg.configDir == null then "-f ${configFile}"
|
||||
else "-F ${cfg.configDir}";
|
||||
in
|
||||
|
||||
{
|
||||
@ -81,6 +83,34 @@ in
|
||||
'''
|
||||
'';
|
||||
};
|
||||
|
||||
declarativeContents = mkOption {
|
||||
type = with types; nullOr lines;
|
||||
default = null;
|
||||
description = ''
|
||||
Declarative contents for the LDAP database, in LDIF format.
|
||||
|
||||
Note a few facts when using it. First, the database
|
||||
<emphasis>must</emphasis> be stored in the directory defined by
|
||||
<code>dataDir</code>. Second, all <code>dataDir</code> will be erased
|
||||
when starting the LDAP server. Third, modifications to the database
|
||||
are not prevented, they are just dropped on the next reboot of the
|
||||
server. Finally, performance-wise the database and indexes are rebuilt
|
||||
on each server startup, so this will slow down server startup,
|
||||
especially with large databases.
|
||||
'';
|
||||
example = ''
|
||||
dn: dc=example,dc=org
|
||||
objectClass: domain
|
||||
dc: example
|
||||
|
||||
dn: ou=users,dc=example,dc=org
|
||||
objectClass = organizationalUnit
|
||||
ou: users
|
||||
|
||||
# ...
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
@ -88,7 +118,7 @@ in
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf config.services.openldap.enable {
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
environment.systemPackages = [ openldap ];
|
||||
|
||||
@ -98,11 +128,21 @@ in
|
||||
after = [ "network.target" ];
|
||||
preStart = ''
|
||||
mkdir -p /var/run/slapd
|
||||
chown -R ${cfg.user}:${cfg.group} /var/run/slapd
|
||||
mkdir -p ${cfg.dataDir}
|
||||
chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir}
|
||||
chown -R "${cfg.user}:${cfg.group}" /var/run/slapd
|
||||
${optionalString (cfg.declarativeContents != null) ''
|
||||
rm -Rf "${cfg.dataDir}"
|
||||
''}
|
||||
mkdir -p "${cfg.dataDir}"
|
||||
${optionalString (cfg.declarativeContents != null) ''
|
||||
${openldap.out}/bin/slapadd ${configOpts} -l ${dataFile}
|
||||
''}
|
||||
chown -R "${cfg.user}:${cfg.group}" "${cfg.dataDir}"
|
||||
'';
|
||||
serviceConfig.ExecStart = "${openldap.out}/libexec/slapd -u ${cfg.user} -g ${cfg.group} -d 0 -h \"${concatStringsSep " " cfg.urlList}\" ${if cfg.configDir == null then "-f "+configFile else "-F "+cfg.configDir}";
|
||||
serviceConfig.ExecStart =
|
||||
"${openldap.out}/libexec/slapd -d 0 " +
|
||||
"-u '${cfg.user}' -g '${cfg.group}' " +
|
||||
"-h '${concatStringsSep " " cfg.urlList}' " +
|
||||
"${configOpts}";
|
||||
};
|
||||
|
||||
users.extraUsers.openldap =
|
||||
|
@ -33,9 +33,9 @@ let
|
||||
sh = pkgs.runtimeShell;
|
||||
binshDeps = pkgs.writeReferencesToFile sh;
|
||||
in
|
||||
pkgs.runCommand "nix.conf" { extraOptions = cfg.extraOptions; inherit binshDeps; } ''
|
||||
pkgs.runCommand "nix.conf" { extraOptions = cfg.extraOptions; } ''
|
||||
${optionalString (!isNix20) ''
|
||||
extraPaths=$(for i in $(cat binshDeps); do if test -d $i; then echo $i; fi; done)
|
||||
extraPaths=$(for i in $(cat ${binshDeps}); do if test -d $i; then echo $i; fi; done)
|
||||
''}
|
||||
cat > $out <<END
|
||||
# WARNING: this file is generated from the nix.* options in
|
||||
|
@ -335,6 +335,7 @@ in {
|
||||
|
||||
preStart = ''
|
||||
mkdir -m 700 -p /etc/NetworkManager/system-connections
|
||||
mkdir -m 700 -p /etc/ipsec.d
|
||||
mkdir -m 755 -p ${stateDirs}
|
||||
'';
|
||||
};
|
||||
|
@ -55,6 +55,8 @@ in
|
||||
environment.NIX_SECRET_KEY_FILE = cfg.secretKeyFile;
|
||||
|
||||
serviceConfig = {
|
||||
Restart = "always";
|
||||
RestartSec = "5s";
|
||||
ExecStart = "${pkgs.nix-serve}/bin/nix-serve " +
|
||||
"--listen ${cfg.bindAddress}:${toString cfg.port} ${cfg.extraParams}";
|
||||
User = "nix-serve";
|
||||
|
@ -32,13 +32,13 @@ let
|
||||
${caConf}
|
||||
'';
|
||||
|
||||
strongswanConf = {setup, connections, ca, secrets, managePlugins, enabledPlugins}: toFile "strongswan.conf" ''
|
||||
strongswanConf = {setup, connections, ca, secretsFile, managePlugins, enabledPlugins}: toFile "strongswan.conf" ''
|
||||
charon {
|
||||
${if managePlugins then "load_modular = no" else ""}
|
||||
${if managePlugins then ("load = " + (concatStringsSep " " enabledPlugins)) else ""}
|
||||
plugins {
|
||||
stroke {
|
||||
secrets_file = ${ipsecSecrets secrets}
|
||||
secrets_file = ${secretsFile}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -135,7 +135,18 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
config = with cfg; mkIf enable {
|
||||
|
||||
config = with cfg;
|
||||
let
|
||||
secretsFile = ipsecSecrets cfg.secrets;
|
||||
in
|
||||
mkIf enable
|
||||
{
|
||||
|
||||
# here we should use the default strongswan ipsec.secrets and
|
||||
# append to it (default one is empty so not a pb for now)
|
||||
environment.etc."ipsec.secrets".source = secretsFile;
|
||||
|
||||
systemd.services.strongswan = {
|
||||
description = "strongSwan IPSec Service";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
@ -143,11 +154,15 @@ in
|
||||
wants = [ "keys.target" ];
|
||||
after = [ "network-online.target" "keys.target" ];
|
||||
environment = {
|
||||
STRONGSWAN_CONF = strongswanConf { inherit setup connections ca secrets managePlugins enabledPlugins; };
|
||||
STRONGSWAN_CONF = strongswanConf { inherit setup connections ca secretsFile managePlugins enabledPlugins; };
|
||||
};
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.strongswan}/sbin/ipsec start --nofork";
|
||||
};
|
||||
preStart = ''
|
||||
# with 'nopeerdns' setting, ppp writes into this folder
|
||||
mkdir -m 700 -p /etc/ppp
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -1,23 +0,0 @@
|
||||
var fs = require('fs');
|
||||
|
||||
var opts = JSON.parse(fs.readFileSync("/dev/stdin").toString());
|
||||
var config = opts.config;
|
||||
|
||||
var readSecret = function(filename) {
|
||||
return fs.readFileSync(filename).toString().trim();
|
||||
};
|
||||
|
||||
if (opts.secretFile) {
|
||||
config.secret = readSecret(opts.secretFile);
|
||||
}
|
||||
if (opts.dbPasswordFile) {
|
||||
config.params.dbpass = readSecret(opts.dbPasswordFile);
|
||||
}
|
||||
if (opts.smtpPasswordFile) {
|
||||
config.smtppass = readSecret(opts.smtpPasswordFile);
|
||||
}
|
||||
if (opts.spamClientSecretFile) {
|
||||
config.spamclientsecret = readSecret(opts.opts.spamClientSecretFile);
|
||||
}
|
||||
|
||||
fs.writeFileSync(opts.outputFile, JSON.stringify(config));
|
@ -1,438 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.pumpio;
|
||||
dataDir = "/var/lib/pump.io";
|
||||
runDir = "/run/pump.io";
|
||||
user = "pumpio";
|
||||
|
||||
optionalSet = condition: value: if condition then value else {};
|
||||
|
||||
configScript = ./pump.io-configure.js;
|
||||
configOptions = {
|
||||
outputFile = "${runDir}/config.json";
|
||||
config =
|
||||
(optionalSet (cfg.driver != "disk") {
|
||||
driver = cfg.driver;
|
||||
}) //
|
||||
{
|
||||
params = (optionalSet (cfg.driver == "disk") { dir = dataDir; }) //
|
||||
(optionalSet (cfg.driver == "mongodb" || cfg.driver == "redis") {
|
||||
host = cfg.dbHost;
|
||||
port = cfg.dbPort;
|
||||
dbname = cfg.dbName;
|
||||
dbuser = cfg.dbUser;
|
||||
dbpass = cfg.dbPassword;
|
||||
}) //
|
||||
(optionalSet (cfg.driver == "memcached") {
|
||||
host = cfg.dbHost;
|
||||
port = cfg.dbPort;
|
||||
}) // cfg.driverParams;
|
||||
secret = cfg.secret;
|
||||
|
||||
address = cfg.address;
|
||||
port = cfg.port;
|
||||
|
||||
noweb = false;
|
||||
urlPort = cfg.urlPort;
|
||||
hostname = cfg.hostname;
|
||||
favicon = cfg.favicon;
|
||||
|
||||
site = cfg.site;
|
||||
owner = cfg.owner;
|
||||
ownerURL = cfg.ownerURL;
|
||||
|
||||
key = cfg.sslKey;
|
||||
cert = cfg.sslCert;
|
||||
bounce = false;
|
||||
|
||||
spamhost = cfg.spamHost;
|
||||
spamclientid = cfg.spamClientId;
|
||||
spamclientsecret = cfg.spamClientSecret;
|
||||
|
||||
requireEmail = cfg.requireEmail;
|
||||
smtpserver = cfg.smtpHost;
|
||||
smtpport = cfg.smtpPort;
|
||||
smtpuser = cfg.smtpUser;
|
||||
smtppass = cfg.smtpPassword;
|
||||
smtpusessl = cfg.smtpUseSSL;
|
||||
smtpfrom = cfg.smtpFrom;
|
||||
|
||||
nologger = false;
|
||||
enableUploads = cfg.enableUploads;
|
||||
datadir = dataDir;
|
||||
debugClient = false;
|
||||
firehose = cfg.firehose;
|
||||
disableRegistration = cfg.disableRegistration;
|
||||
|
||||
inherit (cfg) secretFile dbPasswordFile smtpPasswordFile spamClientSecretFile;
|
||||
} //
|
||||
(optionalSet (cfg.port < 1024) {
|
||||
serverUser = user; # have pump.io listen then drop privileges
|
||||
}) // cfg.extraConfig;
|
||||
}; in {
|
||||
options = {
|
||||
|
||||
services.pumpio = {
|
||||
|
||||
enable = mkEnableOption "Pump.io social streams server";
|
||||
|
||||
secret = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "my dog has fleas";
|
||||
description = ''
|
||||
A session-generating secret, server-wide password. Warning:
|
||||
this is stored in cleartext in the Nix store!
|
||||
'';
|
||||
};
|
||||
|
||||
secretFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
example = "/run/keys/pump.io-secret";
|
||||
description = ''
|
||||
A file containing the session-generating secret,
|
||||
server-wide password.
|
||||
'';
|
||||
};
|
||||
|
||||
site = mkOption {
|
||||
type = types.str;
|
||||
example = "Awesome Sauce";
|
||||
description = "Name of the server";
|
||||
};
|
||||
|
||||
owner = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "Awesome Inc.";
|
||||
description = "Name of owning entity, if you want to link to it.";
|
||||
};
|
||||
|
||||
ownerURL = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "https://pump.io";
|
||||
description = "URL of owning entity, if you want to link to it.";
|
||||
};
|
||||
|
||||
address = mkOption {
|
||||
type = types.str;
|
||||
default = "localhost";
|
||||
description = ''
|
||||
Web server listen address.
|
||||
'';
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = 31337;
|
||||
description = ''
|
||||
Port to listen on. Defaults to 31337, which is suitable for
|
||||
running behind a reverse proxy. For a standalone server,
|
||||
use 443.
|
||||
'';
|
||||
};
|
||||
|
||||
hostname = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "localhost";
|
||||
description = ''
|
||||
The hostname of the server, used for generating
|
||||
URLs. Defaults to "localhost" which doesn't do much for you.
|
||||
'';
|
||||
};
|
||||
|
||||
urlPort = mkOption {
|
||||
type = types.int;
|
||||
default = 443;
|
||||
description = ''
|
||||
Port to use for generating URLs. This basically has to be
|
||||
either 80 or 443 because the host-meta and Webfinger
|
||||
protocols don't make any provision for HTTP/HTTPS servers
|
||||
running on other ports.
|
||||
'';
|
||||
};
|
||||
|
||||
favicon = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
Local filesystem path to the favicon.ico file to use. This
|
||||
will be served as "/favicon.ico" by the server.
|
||||
'';
|
||||
};
|
||||
|
||||
enableUploads = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
If you want to disable file uploads, set this to false. Uploaded files will be stored
|
||||
in ${dataDir}/uploads.
|
||||
'';
|
||||
};
|
||||
|
||||
sslKey = mkOption {
|
||||
type = types.path;
|
||||
example = "${dataDir}/myserver.key";
|
||||
default = "";
|
||||
description = ''
|
||||
The path to the server certificate private key. The
|
||||
certificate is required, but it can be self-signed.
|
||||
'';
|
||||
};
|
||||
|
||||
sslCert = mkOption {
|
||||
type = types.path;
|
||||
example = "${dataDir}/myserver.crt";
|
||||
default = "";
|
||||
description = ''
|
||||
The path to the server certificate. The certificate is
|
||||
required, but it can be self-signed.
|
||||
'';
|
||||
};
|
||||
|
||||
firehose = mkOption {
|
||||
type = types.str;
|
||||
default = "ofirehose.com";
|
||||
description = ''
|
||||
Firehose host running the ofirehose software. Defaults to
|
||||
"ofirehose.com". Public notices will be ping this firehose
|
||||
server and from there go out to search engines and the
|
||||
world. If you want to disconnect from the public web, set
|
||||
this to something falsy.
|
||||
'';
|
||||
};
|
||||
|
||||
disableRegistration = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Disables registering new users on the site through the Web
|
||||
or the API.
|
||||
'';
|
||||
};
|
||||
|
||||
requireEmail = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Require an e-mail address to register.";
|
||||
};
|
||||
|
||||
extraConfig = mkOption {
|
||||
default = { };
|
||||
description = ''
|
||||
Extra configuration options which are serialized to json and added
|
||||
to the pump.io.json config file.
|
||||
'';
|
||||
};
|
||||
|
||||
driver = mkOption {
|
||||
type = types.enum [ "mongodb" "disk" "lrucache" "memcached" "redis" ];
|
||||
default = "mongodb";
|
||||
description = "Type of database. Corresponds to a nodejs databank driver.";
|
||||
};
|
||||
|
||||
driverParams = mkOption {
|
||||
default = { };
|
||||
description = "Extra parameters for the driver.";
|
||||
};
|
||||
|
||||
dbHost = mkOption {
|
||||
type = types.str;
|
||||
default = "localhost";
|
||||
description = "The database host to connect to.";
|
||||
};
|
||||
|
||||
dbPort = mkOption {
|
||||
type = types.int;
|
||||
default = 27017;
|
||||
description = "The port that the database is listening on.";
|
||||
};
|
||||
|
||||
dbName = mkOption {
|
||||
type = types.str;
|
||||
default = "pumpio";
|
||||
description = "The name of the database to use.";
|
||||
};
|
||||
|
||||
dbUser = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
The username. Defaults to null, meaning no authentication.
|
||||
'';
|
||||
};
|
||||
|
||||
dbPassword = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
The password corresponding to dbUser. Warning: this is
|
||||
stored in cleartext in the Nix store!
|
||||
'';
|
||||
};
|
||||
|
||||
dbPasswordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
example = "/run/keys/pump.io-dbpassword";
|
||||
description = ''
|
||||
A file containing the password corresponding to dbUser.
|
||||
'';
|
||||
};
|
||||
|
||||
smtpHost = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "localhost";
|
||||
description = ''
|
||||
Server to use for sending transactional email. If it's not
|
||||
set up, no email is sent and features like password recovery
|
||||
and email notification won't work.
|
||||
'';
|
||||
};
|
||||
|
||||
smtpPort = mkOption {
|
||||
type = types.int;
|
||||
default = 25;
|
||||
description = ''
|
||||
Port to connect to on SMTP server.
|
||||
'';
|
||||
};
|
||||
|
||||
smtpUser = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Username to use to connect to SMTP server. Might not be
|
||||
necessary for some servers.
|
||||
'';
|
||||
};
|
||||
|
||||
smtpPassword = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Password to use to connect to SMTP server. Might not be
|
||||
necessary for some servers. Warning: this is stored in
|
||||
cleartext in the Nix store!
|
||||
'';
|
||||
};
|
||||
|
||||
smtpPasswordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
example = "/run/keys/pump.io-smtppassword";
|
||||
description = ''
|
||||
A file containing the password used to connect to SMTP
|
||||
server. Might not be necessary for some servers.
|
||||
'';
|
||||
};
|
||||
|
||||
|
||||
smtpUseSSL = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Only use SSL with the SMTP server. By default, a SSL
|
||||
connection is negotiated using TLS. You may need to change
|
||||
the smtpPort value if you set this.
|
||||
'';
|
||||
};
|
||||
|
||||
smtpFrom = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Email address to use in the "From:" header of outgoing
|
||||
notifications. Defaults to 'no-reply@' plus the site
|
||||
hostname.
|
||||
'';
|
||||
};
|
||||
|
||||
spamHost = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
Host running activityspam software to use to test updates
|
||||
for spam.
|
||||
'';
|
||||
};
|
||||
spamClientId = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = "OAuth pair for spam server.";
|
||||
};
|
||||
spamClientSecret = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
OAuth pair for spam server. Warning: this is
|
||||
stored in cleartext in the Nix store!
|
||||
'';
|
||||
};
|
||||
spamClientSecretFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
example = "/run/keys/pump.io-spamclientsecret";
|
||||
description = ''
|
||||
A file containing the OAuth key for the spam server.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
warnings = let warn = k: optional (cfg.${k} != null)
|
||||
"config.services.pumpio.${k} is insecure. Use ${k}File instead.";
|
||||
in concatMap warn [ "secret" "dbPassword" "smtpPassword" "spamClientSecret" ];
|
||||
|
||||
assertions = [
|
||||
{ assertion = !(isNull cfg.secret && isNull cfg.secretFile);
|
||||
message = "pump.io needs a secretFile configured";
|
||||
}
|
||||
];
|
||||
|
||||
systemd.services."pump.io" =
|
||||
{ description = "Pump.io - stream server that does most of what people really want from a social network";
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
preStart = ''
|
||||
mkdir -p ${dataDir}/uploads
|
||||
mkdir -p ${runDir}
|
||||
chown pumpio:pumpio ${dataDir}/uploads ${runDir}
|
||||
chmod 770 ${dataDir}/uploads ${runDir}
|
||||
|
||||
${pkgs.nodejs}/bin/node ${configScript} <<EOF
|
||||
${builtins.toJSON configOptions}
|
||||
EOF
|
||||
|
||||
chgrp pumpio ${configOptions.outputFile}
|
||||
chmod 640 ${configOptions.outputFile}
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.pumpio}/bin/pump -c ${configOptions.outputFile}";
|
||||
PermissionsStartOnly = true;
|
||||
User = if cfg.port < 1024 then "root" else user;
|
||||
Group = user;
|
||||
};
|
||||
environment = { NODE_ENV = "production"; };
|
||||
};
|
||||
|
||||
users.extraGroups.pumpio.gid = config.ids.gids.pumpio;
|
||||
users.extraUsers.pumpio = {
|
||||
group = "pumpio";
|
||||
uid = config.ids.uids.pumpio;
|
||||
description = "Pump.io user";
|
||||
home = dataDir;
|
||||
createHome = true;
|
||||
};
|
||||
};
|
||||
}
|
@ -505,7 +505,7 @@ let
|
||||
${cfg.database.name}''
|
||||
|
||||
else if cfg.database.type == "mysql" then ''
|
||||
echo '${e}' | ${pkgs.mysql}/bin/mysql \
|
||||
echo '${e}' | ${pkgs.sudo}/bin/sudo -u ${cfg.user} ${config.services.mysql.package}/bin/mysql \
|
||||
-u ${cfg.database.user} \
|
||||
${optionalString (cfg.database.password != null) "-p${cfg.database.password}"} \
|
||||
${optionalString (cfg.database.host != null) "-h ${cfg.database.host} -P ${toString dbPort}"} \
|
||||
|
@ -19,11 +19,7 @@ in
|
||||
options = {
|
||||
|
||||
services.tomcat = {
|
||||
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
description = "Whether to enable Apache Tomcat";
|
||||
};
|
||||
enable = mkEnableOption "Apache Tomcat";
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
@ -36,10 +32,30 @@ in
|
||||
};
|
||||
|
||||
baseDir = mkOption {
|
||||
type = lib.types.path;
|
||||
default = "/var/tomcat";
|
||||
description = "Location where Tomcat stores configuration files, webapplications and logfiles";
|
||||
};
|
||||
|
||||
logDirs = mkOption {
|
||||
default = [];
|
||||
type = types.listOf types.path;
|
||||
description = "Directories to create in baseDir/logs/";
|
||||
};
|
||||
|
||||
extraConfigFiles = mkOption {
|
||||
default = [];
|
||||
type = types.listOf types.path;
|
||||
description = "Extra configuration files to pull into the tomcat conf directory";
|
||||
};
|
||||
|
||||
extraEnvironment = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [ "ENVIRONMENT=production" ];
|
||||
description = "Environment Variables to pass to the tomcat service";
|
||||
};
|
||||
|
||||
extraGroups = mkOption {
|
||||
default = [];
|
||||
example = [ "users" ];
|
||||
@ -47,31 +63,46 @@ in
|
||||
};
|
||||
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "tomcat";
|
||||
description = "User account under which Apache Tomcat runs.";
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "tomcat";
|
||||
description = "Group account under which Apache Tomcat runs.";
|
||||
};
|
||||
|
||||
javaOpts = mkOption {
|
||||
type = types.either (types.listOf types.str) types.str;
|
||||
default = "";
|
||||
description = "Parameters to pass to the Java Virtual Machine which spawns Apache Tomcat";
|
||||
};
|
||||
|
||||
catalinaOpts = mkOption {
|
||||
type = types.either (types.listOf types.str) types.str;
|
||||
default = "";
|
||||
description = "Parameters to pass to the Java Virtual Machine which spawns the Catalina servlet container";
|
||||
};
|
||||
|
||||
sharedLibs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "List containing JAR files or directories with JAR files which are libraries shared by the web applications";
|
||||
};
|
||||
|
||||
serverXml = mkOption {
|
||||
type = types.lines;
|
||||
default = "";
|
||||
description = "
|
||||
Verbatim server.xml configuration.
|
||||
This is mutually exclusive with the virtualHosts options.
|
||||
";
|
||||
};
|
||||
|
||||
commonLibs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = "List containing JAR files or directories with JAR files which are libraries shared by the web applications and the servlet container";
|
||||
};
|
||||
@ -84,11 +115,21 @@ in
|
||||
};
|
||||
|
||||
virtualHosts = mkOption {
|
||||
type = types.listOf (types.submodule {
|
||||
options = {
|
||||
name = mkOption {
|
||||
type = types.listOf types.str;
|
||||
description = "name of the virtualhost";
|
||||
default = [];
|
||||
};
|
||||
};
|
||||
});
|
||||
default = [];
|
||||
description = "List consisting of a virtual host name and a list of web applications to deploy on each virtual host";
|
||||
};
|
||||
|
||||
logPerVirtualHost = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Whether to enable logging per virtual host.";
|
||||
};
|
||||
@ -104,11 +145,13 @@ in
|
||||
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = "Whether to enable an Apache Axis2 container";
|
||||
};
|
||||
|
||||
services = mkOption {
|
||||
default = [];
|
||||
type = types.listOf types.str;
|
||||
description = "List containing AAR files or directories with AAR files which are web services to be deployed on Axis2";
|
||||
};
|
||||
|
||||
@ -140,130 +183,104 @@ in
|
||||
description = "Apache Tomcat server";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" ];
|
||||
serviceConfig.Type = "oneshot";
|
||||
serviceConfig.RemainAfterExit = true;
|
||||
|
||||
preStart = ''
|
||||
# Create the base directory
|
||||
mkdir -p ${cfg.baseDir}
|
||||
mkdir -p \
|
||||
${cfg.baseDir}/{conf,virtualhosts,logs,temp,lib,shared/lib,webapps,work}
|
||||
chown ${cfg.user}:${cfg.group} \
|
||||
${cfg.baseDir}/{conf,virtualhosts,logs,temp,lib,shared/lib,webapps,work}
|
||||
|
||||
# Create a symlink to the bin directory of the tomcat component
|
||||
ln -sfn ${tomcat}/bin ${cfg.baseDir}/bin
|
||||
|
||||
# Create a conf/ directory
|
||||
mkdir -p ${cfg.baseDir}/conf
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/conf
|
||||
|
||||
# Symlink the config files in the conf/ directory (except for catalina.properties and server.xml)
|
||||
for i in $(ls ${tomcat}/conf | grep -v catalina.properties | grep -v server.xml)
|
||||
do
|
||||
ln -sfn ${tomcat}/conf/$i ${cfg.baseDir}/conf/`basename $i`
|
||||
for i in $(ls ${tomcat}/conf | grep -v catalina.properties | grep -v server.xml); do
|
||||
ln -sfn ${tomcat}/conf/$i ${cfg.baseDir}/conf/`basename $i`
|
||||
done
|
||||
|
||||
# Create subdirectory for virtual hosts
|
||||
mkdir -p ${cfg.baseDir}/virtualhosts
|
||||
${if cfg.extraConfigFiles != [] then ''
|
||||
for i in ${toString cfg.extraConfigFiles}; do
|
||||
ln -sfn $i ${cfg.baseDir}/conf/`basename $i`
|
||||
done
|
||||
'' else ""}
|
||||
|
||||
# Create a modified catalina.properties file
|
||||
# Change all references from CATALINA_HOME to CATALINA_BASE and add support for shared libraries
|
||||
sed -e 's|''${catalina.home}|''${catalina.base}|g' \
|
||||
-e 's|shared.loader=|shared.loader=''${catalina.base}/shared/lib/*.jar|' \
|
||||
${tomcat}/conf/catalina.properties > ${cfg.baseDir}/conf/catalina.properties
|
||||
-e 's|shared.loader=|shared.loader=''${catalina.base}/shared/lib/*.jar|' \
|
||||
${tomcat}/conf/catalina.properties > ${cfg.baseDir}/conf/catalina.properties
|
||||
|
||||
# Create a modified server.xml which also includes all virtual hosts
|
||||
sed -e "/<Engine name=\"Catalina\" defaultHost=\"localhost\">/a\ ${
|
||||
toString (map (virtualHost: ''<Host name=\"${virtualHost.name}\" appBase=\"virtualhosts/${virtualHost.name}/webapps\" unpackWARs=\"true\" autoDeploy=\"true\" xmlValidation=\"false\" xmlNamespaceAware=\"false\" >${if cfg.logPerVirtualHost then ''<Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs/${virtualHost.name}\" prefix=\"${virtualHost.name}_access_log.\" pattern=\"combined\" resolveHosts=\"false\"/>'' else ""}</Host>'') cfg.virtualHosts)}" \
|
||||
${tomcat}/conf/server.xml > ${cfg.baseDir}/conf/server.xml
|
||||
|
||||
# Create a logs/ directory
|
||||
mkdir -p ${cfg.baseDir}/logs
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/logs
|
||||
${if cfg.logPerVirtualHost then
|
||||
toString (map (h: ''
|
||||
mkdir -p ${cfg.baseDir}/logs/${h.name}
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/logs/${h.name}
|
||||
'') cfg.virtualHosts) else ''''}
|
||||
|
||||
# Create a temp/ directory
|
||||
mkdir -p ${cfg.baseDir}/temp
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/temp
|
||||
|
||||
# Create a lib/ directory
|
||||
mkdir -p ${cfg.baseDir}/lib
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/lib
|
||||
|
||||
# Create a shared/lib directory
|
||||
mkdir -p ${cfg.baseDir}/shared/lib
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/shared/lib
|
||||
|
||||
# Create a webapps/ directory
|
||||
mkdir -p ${cfg.baseDir}/webapps
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/webapps
|
||||
${if cfg.serverXml != "" then ''
|
||||
cp -f ${pkgs.writeTextDir "server.xml" cfg.serverXml}/* ${cfg.baseDir}/conf/
|
||||
'' else ''
|
||||
# Create a modified server.xml which also includes all virtual hosts
|
||||
sed -e "/<Engine name=\"Catalina\" defaultHost=\"localhost\">/a\ ${toString (map (virtualHost: ''<Host name=\"${virtualHost.name}\" appBase=\"virtualhosts/${virtualHost.name}/webapps\" unpackWARs=\"true\" autoDeploy=\"true\" xmlValidation=\"false\" xmlNamespaceAware=\"false\" >${if cfg.logPerVirtualHost then ''<Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs/${virtualHost.name}\" prefix=\"${virtualHost.name}_access_log.\" pattern=\"combined\" resolveHosts=\"false\"/>'' else ""}</Host>'') cfg.virtualHosts)}" \
|
||||
${tomcat}/conf/server.xml > ${cfg.baseDir}/conf/server.xml
|
||||
''
|
||||
}
|
||||
${optionalString (cfg.logDirs != []) ''
|
||||
for i in ${toString cfg.logDirs}; do
|
||||
mkdir -p ${cfg.baseDir}/logs/$i
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/logs/$i
|
||||
done
|
||||
''}
|
||||
${optionalString cfg.logPerVirtualHost (toString (map (h: ''
|
||||
mkdir -p ${cfg.baseDir}/logs/${h.name}
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/logs/${h.name}
|
||||
'') cfg.virtualHosts))}
|
||||
|
||||
# Symlink all the given common libs files or paths into the lib/ directory
|
||||
for i in ${tomcat} ${toString cfg.commonLibs}
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
# If the given web application is a file, symlink it into the common/lib/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/lib/`basename $i`
|
||||
elif [ -d $i ]
|
||||
then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
for i in ${tomcat} ${toString cfg.commonLibs}; do
|
||||
if [ -f $i ]; then
|
||||
# If the given web application is a file, symlink it into the common/lib/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/lib/`basename $i`
|
||||
elif [ -d $i ]; then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
for j in $i/lib/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/lib/`basename $j`
|
||||
done
|
||||
fi
|
||||
for j in $i/lib/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/lib/`basename $j`
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
# Symlink all the given shared libs files or paths into the shared/lib/ directory
|
||||
for i in ${toString cfg.sharedLibs}
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
# If the given web application is a file, symlink it into the common/lib/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/shared/lib/`basename $i`
|
||||
elif [ -d $i ]
|
||||
then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
for i in ${toString cfg.sharedLibs}; do
|
||||
if [ -f $i ]; then
|
||||
# If the given web application is a file, symlink it into the common/lib/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/shared/lib/`basename $i`
|
||||
elif [ -d $i ]; then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
for j in $i/shared/lib/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/shared/lib/`basename $j`
|
||||
done
|
||||
fi
|
||||
for j in $i/shared/lib/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/shared/lib/`basename $j`
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
# Symlink all the given web applications files or paths into the webapps/ directory
|
||||
for i in ${toString cfg.webapps}
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
# If the given web application is a file, symlink it into the webapps/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/webapps/`basename $i`
|
||||
elif [ -d $i ]
|
||||
then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
for i in ${toString cfg.webapps}; do
|
||||
if [ -f $i ]; then
|
||||
# If the given web application is a file, symlink it into the webapps/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/webapps/`basename $i`
|
||||
elif [ -d $i ]; then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
for j in $i/webapps/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/webapps/`basename $j`
|
||||
done
|
||||
for j in $i/webapps/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/webapps/`basename $j`
|
||||
done
|
||||
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]
|
||||
then
|
||||
for j in $i/conf/Catalina/*
|
||||
do
|
||||
mkdir -p ${cfg.baseDir}/conf/Catalina/localhost
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/localhost/`basename $j`
|
||||
done
|
||||
fi
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]; then
|
||||
for j in $i/conf/Catalina/*; do
|
||||
mkdir -p ${cfg.baseDir}/conf/Catalina/localhost
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/localhost/`basename $j`
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
${toString (map (virtualHost: ''
|
||||
@ -275,94 +292,79 @@ in
|
||||
|
||||
# Symlink all the given web applications files or paths into the webapps/ directory
|
||||
# of this virtual host
|
||||
for i in "${if virtualHost ? webapps then toString virtualHost.webapps else ""}"
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
# If the given web application is a file, symlink it into the webapps/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/virtualhosts/${virtualHost.name}/webapps/`basename $i`
|
||||
elif [ -d $i ]
|
||||
then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
for i in "${if virtualHost ? webapps then toString virtualHost.webapps else ""}"; do
|
||||
if [ -f $i ]; then
|
||||
# If the given web application is a file, symlink it into the webapps/ directory
|
||||
ln -sfn $i ${cfg.baseDir}/virtualhosts/${virtualHost.name}/webapps/`basename $i`
|
||||
elif [ -d $i ]; then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
for j in $i/webapps/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/virtualhosts/${virtualHost.name}/webapps/`basename $j`
|
||||
done
|
||||
for j in $i/webapps/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/virtualhosts/${virtualHost.name}/webapps/`basename $j`
|
||||
done
|
||||
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]
|
||||
then
|
||||
for j in $i/conf/Catalina/*
|
||||
do
|
||||
mkdir -p ${cfg.baseDir}/conf/Catalina/${virtualHost.name}
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/${virtualHost.name}/`basename $j`
|
||||
done
|
||||
fi
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]; then
|
||||
for j in $i/conf/Catalina/*; do
|
||||
mkdir -p ${cfg.baseDir}/conf/Catalina/${virtualHost.name}
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/${virtualHost.name}/`basename $j`
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
'') cfg.virtualHosts)}
|
||||
|
||||
''
|
||||
) cfg.virtualHosts) }
|
||||
${optionalString cfg.axis2.enable ''
|
||||
# Copy the Axis2 web application
|
||||
cp -av ${pkgs.axis2}/webapps/axis2 ${cfg.baseDir}/webapps
|
||||
|
||||
# Create a work/ directory
|
||||
mkdir -p ${cfg.baseDir}/work
|
||||
chown ${cfg.user}:${cfg.group} ${cfg.baseDir}/work
|
||||
# Turn off addressing, which causes many errors
|
||||
sed -i -e 's%<module ref="addressing"/>%<!-- <module ref="addressing"/> -->%' ${cfg.baseDir}/webapps/axis2/WEB-INF/conf/axis2.xml
|
||||
|
||||
${if cfg.axis2.enable then
|
||||
''
|
||||
# Copy the Axis2 web application
|
||||
cp -av ${pkgs.axis2}/webapps/axis2 ${cfg.baseDir}/webapps
|
||||
# Modify permissions on the Axis2 application
|
||||
chown -R ${cfg.user}:${cfg.group} ${cfg.baseDir}/webapps/axis2
|
||||
|
||||
# Turn off addressing, which causes many errors
|
||||
sed -i -e 's%<module ref="addressing"/>%<!-- <module ref="addressing"/> -->%' ${cfg.baseDir}/webapps/axis2/WEB-INF/conf/axis2.xml
|
||||
# Symlink all the given web service files or paths into the webapps/axis2/WEB-INF/services directory
|
||||
for i in ${toString cfg.axis2.services}; do
|
||||
if [ -f $i ]; then
|
||||
# If the given web service is a file, symlink it into the webapps/axis2/WEB-INF/services
|
||||
ln -sfn $i ${cfg.baseDir}/webapps/axis2/WEB-INF/services/`basename $i`
|
||||
elif [ -d $i ]; then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
# Modify permissions on the Axis2 application
|
||||
chown -R ${cfg.user}:${cfg.group} ${cfg.baseDir}/webapps/axis2
|
||||
for j in $i/webapps/axis2/WEB-INF/services/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/webapps/axis2/WEB-INF/services/`basename $j`
|
||||
done
|
||||
|
||||
# Symlink all the given web service files or paths into the webapps/axis2/WEB-INF/services directory
|
||||
for i in ${toString cfg.axis2.services}
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
# If the given web service is a file, symlink it into the webapps/axis2/WEB-INF/services
|
||||
ln -sfn $i ${cfg.baseDir}/webapps/axis2/WEB-INF/services/`basename $i`
|
||||
elif [ -d $i ]
|
||||
then
|
||||
# If the given web application is a directory, then iterate over the files
|
||||
# in the special purpose directories and symlink them into the tomcat tree
|
||||
|
||||
for j in $i/webapps/axis2/WEB-INF/services/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/webapps/axis2/WEB-INF/services/`basename $j`
|
||||
done
|
||||
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]
|
||||
then
|
||||
for j in $i/conf/Catalina/*
|
||||
do
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/localhost/`basename $j`
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
''
|
||||
else ""}
|
||||
'';
|
||||
|
||||
script = ''
|
||||
${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${cfg.user} -c 'CATALINA_BASE=${cfg.baseDir} JAVA_HOME=${cfg.jdk} JAVA_OPTS="${cfg.javaOpts}" CATALINA_OPTS="${cfg.catalinaOpts}" ${tomcat}/bin/startup.sh'
|
||||
'';
|
||||
|
||||
preStop = ''
|
||||
echo "Stopping tomcat..."
|
||||
CATALINA_BASE=${cfg.baseDir} JAVA_HOME=${cfg.jdk} ${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${cfg.user} -c ${tomcat}/bin/shutdown.sh
|
||||
# Also symlink the configuration files if they are included
|
||||
if [ -d $i/conf/Catalina ]; then
|
||||
for j in $i/conf/Catalina/*; do
|
||||
ln -sfn $j ${cfg.baseDir}/conf/Catalina/localhost/`basename $j`
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
''}
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
Type = "forking";
|
||||
PermissionsStartOnly = true;
|
||||
PIDFile="/run/tomcat/tomcat.pid";
|
||||
RuntimeDirectory = "tomcat";
|
||||
User = cfg.user;
|
||||
Environment=[
|
||||
"CATALINA_BASE=${cfg.baseDir}"
|
||||
"CATALINA_PID=/run/tomcat/tomcat.pid"
|
||||
"JAVA_HOME='${cfg.jdk}'"
|
||||
"JAVA_OPTS='${builtins.toString cfg.javaOpts}'"
|
||||
"CATALINA_OPTS='${builtins.toString cfg.catalinaOpts}'"
|
||||
] ++ cfg.extraEnvironment;
|
||||
ExecStart = "${tomcat}/bin/startup.sh";
|
||||
ExecStop = "${tomcat}/bin/shutdown.sh";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -9,6 +9,10 @@ let
|
||||
xEnv = config.systemd.services."display-manager".environment;
|
||||
cfg = dmcfg.lightdm;
|
||||
|
||||
dmDefault = xcfg.desktopManager.default;
|
||||
wmDefault = xcfg.windowManager.default;
|
||||
hasDefaultUserSession = dmDefault != "none" || wmDefault != "none";
|
||||
|
||||
inherit (pkgs) stdenv lightdm writeScript writeText;
|
||||
|
||||
# lightdm runs with clearenv(), but we need a few things in the enviornment for X to startup
|
||||
@ -54,14 +58,13 @@ let
|
||||
autologin-user-timeout = ${toString cfg.autoLogin.timeout}
|
||||
autologin-session = ${defaultSessionName}
|
||||
''}
|
||||
${optionalString hasDefaultUserSession ''
|
||||
user-session=${defaultSessionName}
|
||||
''}
|
||||
${cfg.extraSeatDefaults}
|
||||
'';
|
||||
|
||||
defaultSessionName =
|
||||
let
|
||||
dm = xcfg.desktopManager.default;
|
||||
wm = xcfg.windowManager.default;
|
||||
in dm + optionalString (wm != "none") ("+" + wm);
|
||||
defaultSessionName = dmDefault + optionalString (wmDefault != "none") ("+" + wmDefault);
|
||||
in
|
||||
{
|
||||
# Note: the order in which lightdm greeter modules are imported
|
||||
@ -179,6 +182,14 @@ in
|
||||
default session: ${defaultSessionName} is not valid.
|
||||
'';
|
||||
}
|
||||
{ assertion = hasDefaultUserSession -> elem defaultSessionName dmcfg.session.names;
|
||||
message = ''
|
||||
services.xserver.desktopManager.default and
|
||||
services.xserver.windowMananger.default are not set to valid
|
||||
values. The current default session: ${defaultSessionName}
|
||||
is not valid.
|
||||
'';
|
||||
}
|
||||
{ assertion = !cfg.greeter.enable -> (cfg.autoLogin.enable && cfg.autoLogin.timeout == 0);
|
||||
message = ''
|
||||
LightDM can only run without greeter if automatic login is enabled and the timeout for it
|
||||
|
@ -117,14 +117,7 @@ in
|
||||
|
||||
config = {
|
||||
|
||||
system.activationScripts.stdio =
|
||||
''
|
||||
# Needed by some programs.
|
||||
ln -sfn /proc/self/fd /dev/fd
|
||||
ln -sfn /proc/self/fd/0 /dev/stdin
|
||||
ln -sfn /proc/self/fd/1 /dev/stdout
|
||||
ln -sfn /proc/self/fd/2 /dev/stderr
|
||||
'';
|
||||
system.activationScripts.stdio = ""; # obsolete
|
||||
|
||||
system.activationScripts.var =
|
||||
''
|
||||
|
@ -23,6 +23,8 @@ let
|
||||
fi
|
||||
'';
|
||||
|
||||
udhcpcArgs = toString cfg.udhcpc.extraArgs;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
@ -47,6 +49,16 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
boot.initrd.network.udhcpc.extraArgs = mkOption {
|
||||
default = [];
|
||||
type = types.listOf types.str;
|
||||
description = ''
|
||||
Additional command-line arguments passed verbatim to udhcpc if
|
||||
<option>boot.initrd.network.enable</option> and <option>networking.useDHCP</option>
|
||||
are enabled.
|
||||
'';
|
||||
};
|
||||
|
||||
boot.initrd.network.postCommands = mkOption {
|
||||
default = "";
|
||||
type = types.lines;
|
||||
@ -91,7 +103,7 @@ in
|
||||
|
||||
# Acquire a DHCP lease.
|
||||
echo "acquiring IP address via DHCP..."
|
||||
udhcpc --quit --now --script ${udhcpcScript} && hasNetwork=1
|
||||
udhcpc --quit --now --script ${udhcpcScript} ${udhcpcArgs} && hasNetwork=1
|
||||
fi
|
||||
''
|
||||
|
||||
|
@ -5,7 +5,7 @@ with lib;
|
||||
let
|
||||
luks = config.boot.initrd.luks;
|
||||
|
||||
openCommand = name': { name, device, header, keyFile, keyFileSize, allowDiscards, yubikey, ... }: assert name' == name; ''
|
||||
openCommand = name': { name, device, header, keyFile, keyFileSize, allowDiscards, yubikey, fallbackToPassword, ... }: assert name' == name; ''
|
||||
|
||||
# Wait for a target (e.g. device, keyFile, header, ...) to appear.
|
||||
wait_target() {
|
||||
@ -43,8 +43,17 @@ let
|
||||
open_normally() {
|
||||
echo luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} \
|
||||
${optionalString (header != null) "--header=${header}"} \
|
||||
${optionalString (keyFile != null) "--key-file=${keyFile} ${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"}"} \
|
||||
> /.luksopen_args
|
||||
${optionalString (keyFile != null) ''
|
||||
${optionalString fallbackToPassword "if [ -e ${keyFile} ]; then"}
|
||||
echo " --key-file=${keyFile} ${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"}" \
|
||||
>> /.luksopen_args
|
||||
${optionalString fallbackToPassword ''
|
||||
else
|
||||
echo "keyfile ${keyFile} not found -- fallback to interactive unlocking"
|
||||
fi
|
||||
''}
|
||||
''}
|
||||
cryptsetup-askpass
|
||||
rm /.luksopen_args
|
||||
}
|
||||
@ -324,6 +333,16 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
fallbackToPassword = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
Whether to fallback to interactive passphrase prompt if the keyfile
|
||||
cannot be found. This will prevent unattended boot should the keyfile
|
||||
go missing.
|
||||
'';
|
||||
};
|
||||
|
||||
yubikey = mkOption {
|
||||
default = null;
|
||||
description = ''
|
||||
|
@ -54,7 +54,7 @@ with lib;
|
||||
|
||||
environment.systemPackages = [ pkgs.kmod ];
|
||||
|
||||
system.activationScripts.modprobe =
|
||||
system.activationScripts.modprobe = stringAfter ["specialfs"]
|
||||
''
|
||||
# Allow the kernel to find our wrapped modprobe (which searches
|
||||
# in the right location in the Nix store for kernel modules).
|
||||
|
@ -650,11 +650,7 @@ let
|
||||
unitFiles = map (name: {
|
||||
target = "systemd/network/${name}";
|
||||
source = "${cfg.units.${name}.unit}/${name}";
|
||||
}) (attrNames cfg.units) ++
|
||||
(map (entry: {
|
||||
target = "systemd/network/${entry}";
|
||||
source = "${config.systemd.package}/lib/systemd/network/${entry}";
|
||||
}) (attrNames (builtins.readDir "${config.systemd.package}/lib/systemd/network")));
|
||||
}) (attrNames cfg.units);
|
||||
in
|
||||
|
||||
{
|
||||
|
@ -82,7 +82,6 @@ ln -s /proc/mounts /etc/mtab
|
||||
mkdir -m 01777 -p /tmp
|
||||
mkdir -m 0755 -p /var/{log,lib,db} /nix/var /etc/nixos/ \
|
||||
/run/lock /home /bin # for the /bin/sh symlink
|
||||
install -m 0700 -d /root
|
||||
|
||||
|
||||
# Miscellaneous boot time cleanup.
|
||||
|
@ -288,6 +288,17 @@ let
|
||||
${i}
|
||||
'')}" > /run/${n}.interfaces
|
||||
|
||||
${optionalString config.virtualisation.libvirtd.enable ''
|
||||
# Enslave dynamically added interfaces which may be lost on nixos-rebuild
|
||||
for uri in qemu:///system lxc:///; do
|
||||
for dom in $(${pkgs.libvirt}/bin/virsh -c $uri list --name); do
|
||||
${pkgs.libvirt}/bin/virsh -c $uri dumpxml "$dom" | \
|
||||
${pkgs.xmlstarlet}/bin/xmlstarlet sel -t -m "//domain/devices/interface[@type='bridge'][source/@bridge='${n}'][target/@dev]" -v "concat('ip link set ',target/@dev,' master ',source/@bridge,';')" | \
|
||||
${pkgs.bash}/bin/bash
|
||||
done
|
||||
done
|
||||
''}
|
||||
|
||||
# Enable stp on the interface
|
||||
${optionalString v.rstp ''
|
||||
echo 2 >/sys/class/net/${n}/bridge/stp_state
|
||||
|
@ -3,9 +3,7 @@
|
||||
with lib;
|
||||
|
||||
let
|
||||
|
||||
prl-tools = config.boot.kernelPackages.prl-tools;
|
||||
|
||||
prl-tools = config.hardware.parallels.package;
|
||||
in
|
||||
|
||||
{
|
||||
@ -22,6 +20,26 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
autoMountShares = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Control prlfsmountd service. When this service is running, shares can not be manually
|
||||
mounted through `mount -t prl_fs ...` as this service will remount and trample any set options.
|
||||
Recommended to enable for simple file sharing, but extended share use such as for code should
|
||||
disable this to manually mount shares.
|
||||
'';
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = config.boot.kernelPackages.prl-tools;
|
||||
defaultText = "config.boot.kernelPackages.prl-tools";
|
||||
example = literalExample "config.boot.kernelPackages.prl-tools";
|
||||
description = ''
|
||||
Defines which package to use for prl-tools. Override to change the version.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
@ -67,7 +85,7 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.prlfsmountd = {
|
||||
systemd.services.prlfsmountd = mkIf config.hardware.parallels.autoMountShares {
|
||||
description = "Parallels Shared Folders Daemon";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig = rec {
|
||||
|
@ -241,6 +241,12 @@ in
|
||||
'';
|
||||
target = "default/xendomains";
|
||||
}
|
||||
]
|
||||
++ lib.optionals (builtins.compareVersions cfg.package.version "4.10" >= 0) [
|
||||
# in V 4.10 oxenstored requires /etc/xen/oxenstored.conf to start
|
||||
{ source = "${cfg.package}/etc/xen/oxenstored.conf";
|
||||
target = "xen/oxenstored.conf";
|
||||
}
|
||||
];
|
||||
|
||||
# Xen provides udev rules.
|
||||
@ -262,7 +268,7 @@ in
|
||||
mkdir -p /var/lib/xen # so we create them here unconditionally.
|
||||
grep -q control_d /proc/xen/capabilities
|
||||
'';
|
||||
serviceConfig = if cfg.package.version < "4.8" then
|
||||
serviceConfig = if (builtins.compareVersions cfg.package.version "4.8" < 0) then
|
||||
{ ExecStart = ''
|
||||
${cfg.stored}${optionalString cfg.trace " -T /var/log/xen/xenstored-trace.log"} --no-fork
|
||||
'';
|
||||
@ -275,7 +281,7 @@ in
|
||||
NotifyAccess = "all";
|
||||
};
|
||||
postStart = ''
|
||||
${optionalString (cfg.package.version < "4.8") ''
|
||||
${optionalString (builtins.compareVersions cfg.package.version "4.8" < 0) ''
|
||||
time=0
|
||||
timeout=30
|
||||
# Wait for xenstored to actually come up, timing out after 30 seconds
|
||||
@ -320,7 +326,7 @@ in
|
||||
serviceConfig = {
|
||||
ExecStart = ''
|
||||
${cfg.package}/bin/xenconsoled\
|
||||
${optionalString ((cfg.package.version >= "4.8")) " -i"}\
|
||||
${optionalString ((builtins.compareVersions cfg.package.version "4.8" >= 0)) " -i"}\
|
||||
${optionalString cfg.trace " --log=all --log-dir=/var/log/xen"}
|
||||
'';
|
||||
};
|
||||
|
@ -52,17 +52,17 @@ in rec {
|
||||
(all nixos.dummy)
|
||||
(all nixos.manual)
|
||||
|
||||
nixos.iso_minimal.x86_64-linux
|
||||
nixos.iso_minimal.i686-linux
|
||||
nixos.iso_graphical.x86_64-linux
|
||||
nixos.ova.x86_64-linux
|
||||
nixos.iso_minimal.x86_64-linux or []
|
||||
nixos.iso_minimal.i686-linux or []
|
||||
nixos.iso_graphical.x86_64-linux or []
|
||||
nixos.ova.x86_64-linux or []
|
||||
|
||||
#(all nixos.tests.containers)
|
||||
nixos.tests.chromium.x86_64-linux
|
||||
nixos.tests.chromium.x86_64-linux or []
|
||||
(all nixos.tests.firefox)
|
||||
(all nixos.tests.firewall)
|
||||
(all nixos.tests.gnome3)
|
||||
nixos.tests.installer.zfsroot.x86_64-linux # ZFS is 64bit only
|
||||
nixos.tests.installer.zfsroot.x86_64-linux or [] # ZFS is 64bit only
|
||||
(all nixos.tests.installer.lvm)
|
||||
(all nixos.tests.installer.luksroot)
|
||||
(all nixos.tests.installer.separateBoot)
|
||||
@ -81,7 +81,7 @@ in rec {
|
||||
(all nixos.tests.boot.uefiUsb)
|
||||
(all nixos.tests.boot-stage1)
|
||||
(all nixos.tests.hibernate)
|
||||
nixos.tests.docker.x86_64-linux
|
||||
nixos.tests.docker.x86_64-linux or []
|
||||
(all nixos.tests.ecryptfs)
|
||||
(all nixos.tests.env)
|
||||
(all nixos.tests.ipv6)
|
||||
|
@ -50,6 +50,10 @@ in rec {
|
||||
separateBoot
|
||||
simple;
|
||||
};
|
||||
boot = {
|
||||
inherit (nixos'.tests.boot)
|
||||
biosCdrom;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ nixpkgs ? { outPath = (import ../lib).cleanSource ./..; revCount = 56789; shortRev = "gfedcba"; }
|
||||
{ nixpkgs ? { outPath = (import ../lib).cleanSource ./..; revCount = 130979; shortRev = "gfedcba"; }
|
||||
, stableBranch ? false
|
||||
, supportedSystems ? [ "x86_64-linux" "aarch64-linux" ]
|
||||
}:
|
||||
@ -16,7 +16,11 @@ let
|
||||
inherit system;
|
||||
} // args);
|
||||
|
||||
callTestOnTheseSystems = systems: fn: args: forTheseSystems systems (system: hydraJob (importTest fn args system));
|
||||
# Note: only supportedSystems are considered.
|
||||
callTestOnTheseSystems = systems: fn: args:
|
||||
forTheseSystems
|
||||
(intersectLists supportedSystems systems)
|
||||
(system: hydraJob (importTest fn args system));
|
||||
callTest = callTestOnTheseSystems supportedSystems;
|
||||
|
||||
callSubTests = callSubTestsOnTheseSystems supportedSystems;
|
||||
@ -231,7 +235,7 @@ in rec {
|
||||
tests.buildbot = callTest tests/buildbot.nix {};
|
||||
tests.cadvisor = callTestOnTheseSystems ["x86_64-linux"] tests/cadvisor.nix {};
|
||||
tests.ceph = callTestOnTheseSystems ["x86_64-linux"] tests/ceph.nix {};
|
||||
tests.chromium = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/chromium.nix {}).stable;
|
||||
tests.chromium = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/chromium.nix {}).stable or {};
|
||||
tests.cjdns = callTest tests/cjdns.nix {};
|
||||
tests.cloud-init = callTest tests/cloud-init.nix {};
|
||||
tests.containers-ipv4 = callTest tests/containers-ipv4.nix {};
|
||||
@ -252,8 +256,8 @@ in rec {
|
||||
tests.dnscrypt-proxy = callTestOnTheseSystems ["x86_64-linux"] tests/dnscrypt-proxy.nix {};
|
||||
tests.ecryptfs = callTest tests/ecryptfs.nix {};
|
||||
tests.etcd = callTestOnTheseSystems ["x86_64-linux"] tests/etcd.nix {};
|
||||
tests.ec2-nixops = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-nixops;
|
||||
tests.ec2-config = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-config;
|
||||
tests.ec2-nixops = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-nixops or {};
|
||||
tests.ec2-config = (callSubTestsOnTheseSystems ["x86_64-linux"] tests/ec2.nix {}).boot-ec2-config or {};
|
||||
tests.elk = callSubTestsOnTheseSystems ["x86_64-linux"] tests/elk.nix {};
|
||||
tests.env = callTest tests/env.nix {};
|
||||
tests.ferm = callTest tests/ferm.nix {};
|
||||
@ -274,6 +278,7 @@ in rec {
|
||||
tests.hibernate = callTest tests/hibernate.nix {};
|
||||
tests.home-assistant = callTest tests/home-assistant.nix { };
|
||||
tests.hound = callTest tests/hound.nix {};
|
||||
tests.hocker-fetchdocker = callTest tests/hocker-fetchdocker {};
|
||||
tests.i3wm = callTest tests/i3wm.nix {};
|
||||
tests.initrd-network-ssh = callTest tests/initrd-network-ssh {};
|
||||
tests.installer = callSubTests tests/installer.nix {};
|
||||
@ -291,7 +296,7 @@ in rec {
|
||||
tests.kernel-copperhead = callTest tests/kernel-copperhead.nix {};
|
||||
tests.kernel-latest = callTest tests/kernel-latest.nix {};
|
||||
tests.kernel-lts = callTest tests/kernel-lts.nix {};
|
||||
tests.kubernetes = hydraJob (import tests/kubernetes/default.nix { system = "x86_64-linux"; });
|
||||
tests.kubernetes = callSubTestsOnTheseSystems ["x86_64-linux"] tests/kubernetes/default.nix {};
|
||||
tests.latestKernel.login = callTest tests/login.nix { latestKernel = true; };
|
||||
tests.ldap = callTest tests/ldap.nix {};
|
||||
#tests.lightdm = callTest tests/lightdm.nix {};
|
||||
@ -325,6 +330,7 @@ in rec {
|
||||
tests.leaps = callTest tests/leaps.nix { };
|
||||
tests.nsd = callTest tests/nsd.nix {};
|
||||
tests.openssh = callTest tests/openssh.nix {};
|
||||
tests.openldap = callTest tests/openldap.nix {};
|
||||
tests.owncloud = callTest tests/owncloud.nix {};
|
||||
tests.pam-oath-login = callTest tests/pam-oath-login.nix {};
|
||||
#tests.panamax = callTestOnTheseSystems ["x86_64-linux"] tests/panamax.nix {};
|
||||
@ -339,7 +345,6 @@ in rec {
|
||||
tests.printing = callTest tests/printing.nix {};
|
||||
tests.prometheus = callTest tests/prometheus.nix {};
|
||||
tests.proxy = callTest tests/proxy.nix {};
|
||||
tests.pumpio = callTest tests/pump.io.nix {};
|
||||
# tests.quagga = callTest tests/quagga.nix {};
|
||||
tests.quake3 = callTest tests/quake3.nix {};
|
||||
tests.rabbitmq = callTest tests/rabbitmq.nix {};
|
||||
@ -355,6 +360,7 @@ in rec {
|
||||
tests.snapper = callTest tests/snapper.nix {};
|
||||
tests.statsd = callTest tests/statsd.nix {};
|
||||
tests.sudo = callTest tests/sudo.nix {};
|
||||
tests.systemd = callTest tests/systemd.nix {};
|
||||
tests.switchTest = callTest tests/switch-test.nix {};
|
||||
tests.taskserver = callTest tests/taskserver.nix {};
|
||||
tests.tomcat = callTest tests/tomcat.nix {};
|
||||
|
@ -24,6 +24,12 @@ let
|
||||
my $machine = createMachine({ ${machineConfig}, qemuFlags => '-m 768' });
|
||||
$machine->start;
|
||||
$machine->waitForUnit("multi-user.target");
|
||||
$machine->succeed("nix verify -r --no-trust /run/current-system");
|
||||
|
||||
# Test whether the channel got installed correctly.
|
||||
$machine->succeed("nix-instantiate --dry-run '<nixpkgs>' -A hello");
|
||||
$machine->succeed("nix-env --dry-run -iA nixos.procps");
|
||||
|
||||
$machine->shutdown;
|
||||
'';
|
||||
};
|
||||
|
15
nixos/tests/hocker-fetchdocker/default.nix
Normal file
15
nixos/tests/hocker-fetchdocker/default.nix
Normal file
@ -0,0 +1,15 @@
|
||||
import ../make-test.nix ({ pkgs, ...} : {
|
||||
name = "test-hocker-fetchdocker";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ ixmatus ];
|
||||
};
|
||||
|
||||
machine = import ./machine.nix;
|
||||
|
||||
testScript = ''
|
||||
startAll;
|
||||
|
||||
$machine->waitForUnit("sockets.target");
|
||||
$machine->waitUntilSucceeds("docker run registry-1.docker.io/v2/library/hello-world:latest");
|
||||
'';
|
||||
})
|
19
nixos/tests/hocker-fetchdocker/hello-world-container.nix
Normal file
19
nixos/tests/hocker-fetchdocker/hello-world-container.nix
Normal file
@ -0,0 +1,19 @@
|
||||
{ fetchDockerConfig, fetchDockerLayer, fetchdocker }:
|
||||
fetchdocker rec {
|
||||
name = "hello-world";
|
||||
registry = "https://registry-1.docker.io/v2/";
|
||||
repository = "library";
|
||||
imageName = "hello-world";
|
||||
tag = "latest";
|
||||
imageConfig = fetchDockerConfig {
|
||||
inherit tag registry repository imageName;
|
||||
sha256 = "1ivbd23hyindkahzfw4kahgzi6ibzz2ablmgsz6340vc6qr1gagj";
|
||||
};
|
||||
imageLayers = let
|
||||
layer0 = fetchDockerLayer {
|
||||
inherit registry repository imageName;
|
||||
layerDigest = "ca4f61b1923c10e9eb81228bd46bee1dfba02b9c7dac1844527a734752688ede";
|
||||
sha256 = "1plfd194fwvsa921ib3xkhms1yqxxrmx92r2h7myj41wjaqn2kya";
|
||||
};
|
||||
in [ layer0 ];
|
||||
}
|
26
nixos/tests/hocker-fetchdocker/machine.nix
Normal file
26
nixos/tests/hocker-fetchdocker/machine.nix
Normal file
@ -0,0 +1,26 @@
|
||||
{ config, pkgs, ... }:
|
||||
{ nixpkgs.config.packageOverrides = pkgs': {
|
||||
hello-world-container = pkgs'.callPackage ./hello-world-container.nix { };
|
||||
};
|
||||
|
||||
virtualisation.docker = {
|
||||
enable = true;
|
||||
package = pkgs.docker;
|
||||
};
|
||||
|
||||
systemd.services.docker-load-fetchdocker-image = {
|
||||
description = "Docker load hello-world-container";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wants = [ "docker.service" "local-fs.target" ];
|
||||
after = [ "docker.service" "local-fs.target" ];
|
||||
|
||||
script = ''
|
||||
${pkgs.hello-world-container}/compositeImage.sh | ${pkgs.docker}/bin/docker load
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ let
|
||||
# Check that the daemon works, and that non-root users can run builds (this will build a new profile generation through the daemon)
|
||||
$machine->succeed("su alice -l -c 'nix-env -iA nixos.procps' >&2");
|
||||
|
||||
# We need to a writable nix-store on next boot.
|
||||
# We need a writable Nix store on next boot.
|
||||
$machine->copyFileFromHost(
|
||||
"${ makeConfig { inherit bootLoader grubVersion grubDevice grubIdentifier grubUseEfi extraConfig; forceGrubReinstallCount = 1; } }",
|
||||
"/etc/nixos/configuration.nix");
|
||||
@ -195,8 +195,7 @@ let
|
||||
};
|
||||
nodes = {
|
||||
|
||||
# The configuration of the machine used to run "nixos-install". It
|
||||
# also has a web server that simulates cache.nixos.org.
|
||||
# The configuration of the machine used to run "nixos-install".
|
||||
machine =
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
@ -208,7 +207,6 @@ let
|
||||
|
||||
virtualisation.diskSize = 8 * 1024;
|
||||
virtualisation.memorySize = 1024;
|
||||
virtualisation.writableStore = true;
|
||||
|
||||
# Use a small /dev/vdb as the root disk for the
|
||||
# installer. This ensures the target disk (/dev/vda) is
|
||||
@ -245,6 +243,11 @@ let
|
||||
++ optionals (bootLoader == "grub" && grubVersion == 2) [ pkgs.grub2 pkgs.grub2_efi ];
|
||||
|
||||
nix.binaryCaches = mkForce [ ];
|
||||
nix.extraOptions =
|
||||
''
|
||||
hashed-mirrors =
|
||||
connect-timeout = 1
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
@ -50,38 +50,7 @@ let
|
||||
machine.i18n.consoleKeyMap = mkOverride 900 layout;
|
||||
machine.services.xserver.layout = mkOverride 900 layout;
|
||||
machine.imports = [ ./common/x11.nix extraConfig ];
|
||||
machine.services.xserver.displayManager.slim = {
|
||||
enable = true;
|
||||
|
||||
# Use a custom theme in order to get best OCR results
|
||||
theme = pkgs.runCommand "slim-theme-ocr" {
|
||||
nativeBuildInputs = [ pkgs.imagemagick ];
|
||||
} ''
|
||||
mkdir "$out"
|
||||
convert -size 1x1 xc:white "$out/background.jpg"
|
||||
convert -size 200x100 xc:white "$out/panel.jpg"
|
||||
cat > "$out/slim.theme" <<EOF
|
||||
background_color #ffffff
|
||||
background_style tile
|
||||
|
||||
input_fgcolor #000000
|
||||
msg_color #000000
|
||||
|
||||
session_color #000000
|
||||
session_font Verdana:size=16:bold
|
||||
|
||||
username_msg Username:
|
||||
username_font Verdana:size=16:bold
|
||||
username_color #000000
|
||||
username_x 50%
|
||||
username_y 40%
|
||||
|
||||
password_msg Password:
|
||||
password_x 50%
|
||||
password_y 40%
|
||||
EOF
|
||||
'';
|
||||
};
|
||||
machine.services.xserver.displayManager.slim.enable = true;
|
||||
|
||||
testScript = ''
|
||||
sub waitCatAndDelete ($) {
|
||||
|
@ -1,11 +1,13 @@
|
||||
# Miscellaneous small tests that don't warrant their own VM run.
|
||||
|
||||
import ./make-test.nix ({ pkgs, ...} : {
|
||||
import ./make-test.nix ({ pkgs, ...} : rec {
|
||||
name = "misc";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ eelco chaoflow ];
|
||||
};
|
||||
|
||||
foo = pkgs.writeText "foo" "Hello World";
|
||||
|
||||
machine =
|
||||
{ config, lib, pkgs, ... }:
|
||||
with lib;
|
||||
@ -27,10 +29,17 @@ import ./make-test.nix ({ pkgs, ...} : {
|
||||
security.sudo = { enable = true; wheelNeedsPassword = false; };
|
||||
boot.kernel.sysctl."vm.swappiness" = 1;
|
||||
boot.kernelParams = [ "vsyscall=emulate" ];
|
||||
system.extraDependencies = [ foo ];
|
||||
};
|
||||
|
||||
testScript =
|
||||
''
|
||||
subtest "nix-db", sub {
|
||||
my $json = $machine->succeed("nix path-info --json ${foo}");
|
||||
$json =~ /"narHash":"sha256:0afw0d9j1hvwiz066z93jiddc33nxg6i6qyp26vnqyglpyfivlq5"/ or die "narHash not set";
|
||||
$json =~ /"narSize":128/ or die "narSize not set";
|
||||
};
|
||||
|
||||
subtest "nixos-version", sub {
|
||||
$machine->succeed("[ `nixos-version | wc -w` = 2 ]");
|
||||
};
|
||||
|
35
nixos/tests/openldap.nix
Normal file
35
nixos/tests/openldap.nix
Normal file
@ -0,0 +1,35 @@
|
||||
import ./make-test.nix {
|
||||
name = "dovecot";
|
||||
|
||||
machine = { pkgs, ... }: {
|
||||
services.openldap = {
|
||||
enable = true;
|
||||
extraConfig = ''
|
||||
include ${pkgs.openldap}/etc/schema/core.schema
|
||||
include ${pkgs.openldap}/etc/schema/cosine.schema
|
||||
include ${pkgs.openldap}/etc/schema/inetorgperson.schema
|
||||
include ${pkgs.openldap}/etc/schema/nis.schema
|
||||
database bdb
|
||||
suffix dc=example
|
||||
directory /var/db/openldap
|
||||
rootdn cn=root,dc=example
|
||||
rootpw notapassword
|
||||
'';
|
||||
declarativeContents = ''
|
||||
dn: dc=example
|
||||
objectClass: domain
|
||||
dc: example
|
||||
|
||||
dn: ou=users,dc=example
|
||||
objectClass: organizationalUnit
|
||||
ou: users
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
$machine->succeed('systemctl status openldap.service');
|
||||
$machine->waitForUnit('openldap.service');
|
||||
$machine->succeed('ldapsearch -LLL -D "cn=root,dc=example" -w notapassword -b "dc=example"');
|
||||
'';
|
||||
}
|
@ -1,89 +0,0 @@
|
||||
# This test runs pump.io with mongodb, listing on port 443.
|
||||
|
||||
import ./make-test.nix ({ pkgs, ...} : let
|
||||
snakeOilKey = ''
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqVemio78R41Tz
|
||||
MnR2zFD/wFT0iScOpFkuytNmuPf28FLaa9wSBWmuAGbEi7wBIfw8/bUqFBTQp2G1
|
||||
m1cmcCKxhmvvOkGs89eM131s1lW/bXU3zYso4e7724kHwU65jRlQs6cFWIlmW7V5
|
||||
3HQobP05dy+zPpujPPSlOQ0qYViR1s+RgZI8r0wS2ZDsliNtQwBLJSIvX6XVnXLo
|
||||
F/HmF4/ySJ9pL2AxQXCwZE8SfCzHpArs9COIqTaAuwB79kxWSFQJewmab74BXiM6
|
||||
9FMCtHON24Pl7OR9sRJHH8rMEzUumppmUeCNEzABjzQQ7svR18cmbzRWetp0tT9Y
|
||||
7rj6URHHAgMBAAECggEAGmbCldDnlrAzxJY3cwpsK5f2EwkHIr/aiuQpLCzTUlUh
|
||||
onVBYRGxtaSeSSyXcV2BKTrxz5nZOBYZkPqI4Y5T8kwxgpz2/QW2jUABUtNN6yPe
|
||||
HU4gma+bSTJX5PnTZ/M0z0tpQezdLx5b3I2M+48ZGMUegZvcp8qU6N8U6VK5VbFD
|
||||
DMTGL4b+Kc9HScRkCJjU3FfQcqf9Ml5w9jzHSeHImYEDrG0nX8N8EImRCBXbgxCl
|
||||
5XT1h6LFUGdr+N6n2w56+6l8OZZVmwj1NdF6NJybUQl4Y7b0niA+5czzjRt/YUjZ
|
||||
HW0fXmx3XlbYGWYdMdS+VaIW6pkUpm8kZkqjngqLwQKBgQDfhbFQmg9lsJQ8/dQZ
|
||||
WzRNsozHKWkQiZbW5sXBWygJbAB3Hc8gvQkuZe9TVyF99cznRj6ro6pGZjP0rTdY
|
||||
3ACTL+ygRArcIR6VsJCIr6nPvBLpOoNb8TQeKPmHC2gnSP9zaT/K2lldYISKNaYQ
|
||||
0seB2gvZhIgMgWtZtmb3jdgl9wKBgQDDFdknXgvFgB+y96//9wTu2WWuE5yQ5yB7
|
||||
utAcHNO9rx5X1tJqxymYh+iE8HUN25By+96SpNMQFI+0wNGVB00YWNBKtyepimWN
|
||||
EUCojTy+MIXIjrLcvviEePsI4TPWYf8XtZeiYtcczYrt/wPQUYaDb8LBRfpIfmhr
|
||||
rCGW93s+sQKBgEDOKTeeQyKPjJsWWL01RTfVsZ04s155FcOeyu0heb0plAT1Ho12
|
||||
YUgTg8zc8Tfs4QiYxCjNXdvlW+Dvq6FWv8/s0CUzNRbXf1+U/oKys4AoHi+CqH0q
|
||||
tJqd9KKjuwHQ10dl13n/znMVPbg4j7pG8lMCnfblxvAhQbeT+8yAUo/HAoGBAL3t
|
||||
/n4KXNGK3NHDvXEp0H6t3wWsiEi3DPQJO+Wy1x8caCFCv5c/kaqz3tfWt0+njSm1
|
||||
N8tzdx13tzVWaHV8Jz3l8dxcFtxEJnxB6L5wy0urOAS7kT3DG3b1xgmuH2a//7fY
|
||||
jumE60NahcER/2eIh7pdS7IZbAO6NfVmH0m4Zh/xAoGAbquh60sAfLC/1O2/4Xom
|
||||
PHS7z2+TNpwu4ou3nspxfigNQcTWzzzTVFLnaTPg+HKbLRXSWysjssmmj5u3lCyc
|
||||
S2M9xuhApa9CrN/udz4gEojRVsTla/gyLifIZ3CtTn2QEQiIJEMxM+59KAlkgUBo
|
||||
9BeZ03xTaEZfhVZ9bEN30Ak=
|
||||
-----END PRIVATE KEY-----
|
||||
'';
|
||||
|
||||
snakeOilCert = ''
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICvjCCAaagAwIBAgIJANhA6+PPhomZMA0GCSqGSIb3DQEBCwUAMBcxFTATBgNV
|
||||
BAMMDGIwOTM0YWMwYWZkNTAeFw0xNTExMzAxNzQ3MzVaFw0yNTExMjcxNzQ3MzVa
|
||||
MBcxFTATBgNVBAMMDGIwOTM0YWMwYWZkNTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||
ADCCAQoCggEBAKpV6aKjvxHjVPMydHbMUP/AVPSJJw6kWS7K02a49/bwUtpr3BIF
|
||||
aa4AZsSLvAEh/Dz9tSoUFNCnYbWbVyZwIrGGa+86Qazz14zXfWzWVb9tdTfNiyjh
|
||||
7vvbiQfBTrmNGVCzpwVYiWZbtXncdChs/Tl3L7M+m6M89KU5DSphWJHWz5GBkjyv
|
||||
TBLZkOyWI21DAEslIi9fpdWdcugX8eYXj/JIn2kvYDFBcLBkTxJ8LMekCuz0I4ip
|
||||
NoC7AHv2TFZIVAl7CZpvvgFeIzr0UwK0c43bg+Xs5H2xEkcfyswTNS6ammZR4I0T
|
||||
MAGPNBDuy9HXxyZvNFZ62nS1P1juuPpREccCAwEAAaMNMAswCQYDVR0TBAIwADAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAd2w9rxi6qF9WV8L3rHnTE7uu0ldtdgJlCASx6ouj
|
||||
TleOnjfEg+kH8r8UbmRV5vsTDn1Qp5JGDYxfytRUQwLb1zTLde0xotx37E3LY8Wr
|
||||
sD6Al4t8sHywB/hc5dy29TgG0iyG8LKZrkwytLvDZ814W3OwpN2rpEz6pdizdHNn
|
||||
jsoDEngZiDHvLjIyE0cDkFXkeYMGXOnBUeOcu4nfu4C5eKs3nXGGAcNDbDRIuLoE
|
||||
BZExUBY+YSs6JBvh5tvRqLVW0Dz0akEcjb/jhwS2LmDip8Pdoxx4Q1jPKEu38zrr
|
||||
Vd5WD2HJhLb9u0UxVp9vfWIUDgydopV5ZmWCQ5YvNepb1w==
|
||||
-----END CERTIFICATE-----
|
||||
'';
|
||||
in {
|
||||
name = "pumpio";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ rvl ];
|
||||
};
|
||||
|
||||
nodes = {
|
||||
one =
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
services = {
|
||||
pumpio = {
|
||||
port = 443;
|
||||
enable = true;
|
||||
sslCert = pkgs.writeText "snakeoil.cert" snakeOilCert;
|
||||
sslKey = pkgs.writeText "snakeoil.pem" snakeOilKey;
|
||||
secretFile = pkgs.writeText "secretFile" "test123";
|
||||
site = "test";
|
||||
};
|
||||
mongodb.enable = true;
|
||||
mongodb.extraConfig = ''
|
||||
storage.journal.enabled: false
|
||||
'';
|
||||
};
|
||||
systemd.services.mongodb.unitConfig.Before = "pump.io.service";
|
||||
systemd.services."pump.io".unitConfig.Requires = "mongodb.service";
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
startAll;
|
||||
|
||||
$one->waitForUnit("pump.io.service");
|
||||
$one->waitUntilSucceeds("curl -k https://localhost");
|
||||
'';
|
||||
})
|
66
nixos/tests/systemd.nix
Normal file
66
nixos/tests/systemd.nix
Normal file
@ -0,0 +1,66 @@
|
||||
import ./make-test.nix {
|
||||
name = "systemd";
|
||||
|
||||
machine = { lib, ... }: {
|
||||
imports = [ common/user-account.nix common/x11.nix ];
|
||||
|
||||
virtualisation.emptyDiskImages = [ 512 ];
|
||||
|
||||
fileSystems = lib.mkVMOverride {
|
||||
"/test-x-initrd-mount" = {
|
||||
device = "/dev/vdb";
|
||||
fsType = "ext2";
|
||||
autoFormat = true;
|
||||
noCheck = true;
|
||||
options = [ "x-initrd.mount" ];
|
||||
};
|
||||
};
|
||||
|
||||
systemd.extraConfig = "DefaultEnvironment=\"XXX_SYSTEM=foo\"";
|
||||
systemd.user.extraConfig = "DefaultEnvironment=\"XXX_USER=bar\"";
|
||||
services.journald.extraConfig = "Storage=volatile";
|
||||
services.xserver.displayManager.auto.user = "alice";
|
||||
|
||||
systemd.services.testservice1 = {
|
||||
description = "Test Service 1";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig.Type = "oneshot";
|
||||
script = ''
|
||||
if [ "$XXX_SYSTEM" = foo ]; then
|
||||
touch /system_conf_read
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.user.services.testservice2 = {
|
||||
description = "Test Service 2";
|
||||
wantedBy = [ "default.target" ];
|
||||
serviceConfig.Type = "oneshot";
|
||||
script = ''
|
||||
if [ "$XXX_USER" = bar ]; then
|
||||
touch "$HOME/user_conf_read"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
$machine->waitForX;
|
||||
|
||||
# Regression test for https://github.com/NixOS/nixpkgs/issues/35415
|
||||
subtest "configuration files are recognized by systemd", sub {
|
||||
$machine->succeed('test -e /system_conf_read');
|
||||
$machine->succeed('test -e /home/alice/user_conf_read');
|
||||
$machine->succeed('test -z $(ls -1 /var/log/journal)');
|
||||
};
|
||||
|
||||
# Regression test for https://github.com/NixOS/nixpkgs/issues/35268
|
||||
subtest "file system with x-initrd.mount is not unmounted", sub {
|
||||
$machine->shutdown;
|
||||
$machine->waitForUnit('multi-user.target');
|
||||
# If the file system was unmounted during the shutdown the file system
|
||||
# has a last mount time, because the file system wasn't checked.
|
||||
$machine->fail('dumpe2fs /dev/vdb | grep -q "^Last mount time: *n/a"');
|
||||
};
|
||||
'';
|
||||
}
|
@ -7,13 +7,13 @@ with stdenv.lib;
|
||||
stdenv.mkDerivation rec {
|
||||
|
||||
name = "bitcoin" + (toString (optional (!withGui) "d")) + "-abc-" + version;
|
||||
version = "0.16.0";
|
||||
version = "0.16.2";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "bitcoin-ABC";
|
||||
repo = "bitcoin-abc";
|
||||
rev = "v${version}";
|
||||
sha256 = "0wwcgvd8zgl5qh6z1sa3kdv1lr9cwwbs9j2gaad5mqr9sfwbbxdh";
|
||||
sha256 = "0d5npn4p321jqsbqjxkbv0ncvs2hp9vdp30np6n8n53f896cxl92";
|
||||
};
|
||||
|
||||
patches = [ ./fix-bitcoin-qt-build.patch ];
|
||||
|
@ -7,13 +7,13 @@ with stdenv.lib;
|
||||
stdenv.mkDerivation rec {
|
||||
|
||||
name = "bitcoin" + (toString (optional (!withGui) "d")) + "-classic-" + version;
|
||||
version = "1.3.6";
|
||||
version = "1.3.8";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "bitcoinclassic";
|
||||
repo = "bitcoinclassic";
|
||||
rev = "v${version}";
|
||||
sha256 = "129gkg035gv7zmc463jl2spvdh0fl4q8v4jdaslfnp34hbwi1p07";
|
||||
sha256 = "06ij9v7zbdnhxq9429nnxiw655cp8idldj18l7fmj94gqx07n5vh";
|
||||
};
|
||||
|
||||
patches = [ ./fix-bitcoin-qt-build.patch ];
|
||||
|
@ -6,13 +6,13 @@ with stdenv.lib;
|
||||
stdenv.mkDerivation rec{
|
||||
|
||||
name = "bitcoin" + (toString (optional (!withGui) "d")) + "-xt-" + version;
|
||||
version = "0.11G2";
|
||||
version = "0.11H";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "bitcoinxt";
|
||||
repo = "bitcoinxt";
|
||||
rev = "v${version}";
|
||||
sha256 = "071rljvsabyc9j64v248qfb7zfqpfl84hpsnvlavin235zljq8qs";
|
||||
sha256 = "1v43bynmidn2zdpky939km721x3ks91bzyh4200gji61qzsmyg62";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
|
@ -2,26 +2,26 @@
|
||||
, openssl, db48, boost, zlib, miniupnpc
|
||||
, qrencode, glib, protobuf, yasm, libevent
|
||||
, utillinux
|
||||
, enable_Upnp ? false
|
||||
, enable_Upnp ? false
|
||||
, disable_Wallet ? false
|
||||
, disable_Daemon ? false }:
|
||||
|
||||
with stdenv.lib;
|
||||
stdenv.mkDerivation rec {
|
||||
name = "dashpay-${version}";
|
||||
version = "0.12.1.3";
|
||||
version = "0.12.2.3";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "dashpay";
|
||||
repo= "dash";
|
||||
rev = "v${version}";
|
||||
sha256 = "0h0fxhh30wy5vp06l1mkswhz565qs6j9y0dm84fmn28rdfvhv2aj";
|
||||
sha256 = "0l1gcj2xf2bal9ph9y11x8yd28fd25f55f48xbm45bfw3ij7nbaa";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
buildInputs = [ glib openssl db48 yasm boost zlib libevent
|
||||
buildInputs = [ glib openssl db48 yasm boost zlib libevent
|
||||
miniupnpc protobuf qrencode utillinux ];
|
||||
|
||||
|
||||
|
||||
configureFlags = [ "--with-boost-libdir=${boost.out}/lib --with-gui=no" ]
|
||||
++ optional enable_Upnp "--enable-upnp-default"
|
||||
@ -36,7 +36,7 @@ stdenv.mkDerivation rec {
|
||||
with instant transactions. It allows you to keep your finances
|
||||
private as you make transactions without waits, similar to cash.
|
||||
'';
|
||||
homepage = http://dashpay.io;
|
||||
homepage = https://www.dash.org;
|
||||
maintainers = with maintainers; [ AndersonTorres ];
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
|
33
pkgs/applications/altcoins/dcrd.nix
Normal file
33
pkgs/applications/altcoins/dcrd.nix
Normal file
@ -0,0 +1,33 @@
|
||||
{ stdenv, lib, go, buildGoPackage, dep, fetchgit, git, cacert }:
|
||||
|
||||
buildGoPackage rec {
|
||||
name = "dcrd-${version}";
|
||||
version = "1.1.2";
|
||||
rev = "refs/tags/v${version}";
|
||||
goPackagePath = "github.com/decred/dcrd";
|
||||
|
||||
buildInputs = [ go git dep cacert ];
|
||||
|
||||
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||
NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||
|
||||
src = fetchgit {
|
||||
inherit rev;
|
||||
url = "https://${goPackagePath}";
|
||||
sha256 = "0xcynipdn9zmmralxj0hjrwyanvhkwfj2b1vvjk5zfc95s2xc1q9";
|
||||
};
|
||||
|
||||
preBuild = ''
|
||||
export CWD=$(pwd)
|
||||
cd go/src/github.com/decred/dcrd
|
||||
dep ensure
|
||||
go install . ./cmd/...
|
||||
cd $CWD
|
||||
'';
|
||||
|
||||
meta = {
|
||||
homepage = "https://decred.org";
|
||||
description = "Decred daemon in Go (golang)";
|
||||
license = with lib.licenses; [ isc ];
|
||||
};
|
||||
}
|
42
pkgs/applications/altcoins/dcrwallet.nix
Normal file
42
pkgs/applications/altcoins/dcrwallet.nix
Normal file
@ -0,0 +1,42 @@
|
||||
{ stdenv, lib, go, buildGoPackage, dep, fetchgit, git, cacert }:
|
||||
|
||||
buildGoPackage rec {
|
||||
name = "dcrwallet-${version}";
|
||||
version = "1.1.2";
|
||||
rev = "refs/tags/v${version}";
|
||||
goPackagePath = "github.com/decred/dcrwallet";
|
||||
|
||||
buildInputs = [ go git dep cacert ];
|
||||
|
||||
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||
NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||
|
||||
src = fetchgit {
|
||||
inherit rev;
|
||||
url = "https://${goPackagePath}";
|
||||
sha256 = "058im4vmcmxcl5ir14h17wik5lagp2ay0p8qc3r99qmpfwvvz39x";
|
||||
};
|
||||
|
||||
preBuild = ''
|
||||
export CWD=$(pwd)
|
||||
cd go/src/github.com/decred/dcrwallet
|
||||
dep ensure
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
go build
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -pv $bin/bin
|
||||
cp -v dcrwallet $bin/bin
|
||||
'';
|
||||
|
||||
|
||||
meta = {
|
||||
homepage = "https://decred.org";
|
||||
description = "Decred daemon in Go (golang)";
|
||||
license = with lib.licenses; [ isc ];
|
||||
};
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{ callPackage, boost155, openssl_1_1_0, haskellPackages, darwin, libsForQt5, miniupnpc_2, python3 }:
|
||||
{ callPackage, boost155, boost165, openssl_1_1_0, haskellPackages, darwin, libsForQt5, miniupnpc_2, python3 }:
|
||||
|
||||
rec {
|
||||
|
||||
@ -7,17 +7,17 @@ rec {
|
||||
bitcoin = libsForQt5.callPackage ./bitcoin.nix { miniupnpc = miniupnpc_2; withGui = true; };
|
||||
bitcoind = callPackage ./bitcoin.nix { miniupnpc = miniupnpc_2; withGui = false; };
|
||||
|
||||
bitcoin-abc = libsForQt5.callPackage ./bitcoin-abc.nix { withGui = true; };
|
||||
bitcoind-abc = callPackage ./bitcoin-abc.nix { withGui = false; };
|
||||
bitcoin-abc = libsForQt5.callPackage ./bitcoin-abc.nix { boost = boost165; withGui = true; };
|
||||
bitcoind-abc = callPackage ./bitcoin-abc.nix { boost = boost165; withGui = false; };
|
||||
|
||||
bitcoin-unlimited = callPackage ./bitcoin-unlimited.nix { withGui = true; };
|
||||
bitcoind-unlimited = callPackage ./bitcoin-unlimited.nix { withGui = false; };
|
||||
|
||||
bitcoin-classic = libsForQt5.callPackage ./bitcoin-classic.nix { withGui = true; };
|
||||
bitcoind-classic = callPackage ./bitcoin-classic.nix { withGui = false; };
|
||||
bitcoin-classic = libsForQt5.callPackage ./bitcoin-classic.nix { boost = boost165; withGui = true; };
|
||||
bitcoind-classic = callPackage ./bitcoin-classic.nix { boost = boost165; withGui = false; };
|
||||
|
||||
bitcoin-xt = callPackage ./bitcoin-xt.nix { withGui = true; };
|
||||
bitcoind-xt = callPackage ./bitcoin-xt.nix { withGui = false; };
|
||||
bitcoin-xt = callPackage ./bitcoin-xt.nix { boost = boost165; withGui = true; };
|
||||
bitcoind-xt = callPackage ./bitcoin-xt.nix { boost = boost165; withGui = false; };
|
||||
|
||||
btc1 = callPackage ./btc1.nix { withGui = true; };
|
||||
btc1d = callPackage ./btc1.nix { withGui = false; };
|
||||
@ -26,6 +26,9 @@ rec {
|
||||
|
||||
dashpay = callPackage ./dashpay.nix { };
|
||||
|
||||
dcrd = callPackage ./dcrd.nix { };
|
||||
dcrwallet = callPackage ./dcrwallet.nix { };
|
||||
|
||||
dero = callPackage ./dero.nix { };
|
||||
|
||||
dogecoin = callPackage ./dogecoin.nix { withGui = true; };
|
||||
@ -56,9 +59,6 @@ rec {
|
||||
|
||||
hevm = (haskellPackages.callPackage ./hevm.nix {});
|
||||
|
||||
primecoin = callPackage ./primecoin.nix { withGui = true; };
|
||||
primecoind = callPackage ./primecoin.nix { withGui = false; };
|
||||
|
||||
stellar-core = callPackage ./stellar-core.nix { };
|
||||
|
||||
sumokoin = callPackage ./sumokoin.nix { };
|
||||
@ -67,4 +67,7 @@ rec {
|
||||
withGui = false;
|
||||
openssl = openssl_1_1_0;
|
||||
};
|
||||
|
||||
parity = callPackage ./parity { };
|
||||
parity-beta = callPackage ./parity/beta.nix { };
|
||||
}
|
||||
|
@ -3,13 +3,13 @@
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "dero-${version}";
|
||||
version = "0.11.3";
|
||||
version = "0.11.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "deroproject";
|
||||
repo = "dero";
|
||||
rev = "v${version}";
|
||||
sha256 = "0cv4yg2lkmkdhlc3753gnbg1nzldk2kxwdyizwhvanq3ycqban4b";
|
||||
sha256 = "0jc5rh2ra4wra04dwv9sydid5ij5930s38mhzq3qkdjyza1ahmsr";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ cmake pkgconfig ];
|
||||
|
@ -8,7 +8,7 @@ stdenv.mkDerivation rec {
|
||||
owner = "freicoin";
|
||||
repo = "freicoin";
|
||||
rev = "v${version}";
|
||||
sha256 = "1m5pcnfhwhcj7q00p2sy3h73rkdm3w6grmljgiq53gshcj08cq1z";
|
||||
sha256 = "1v1qwv4x5agjba82s1vknmdgq67y26wzdwbmwwqavv7f7y3y860h";
|
||||
};
|
||||
|
||||
qmakeFlags = ["USE_UPNP=-"];
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
buildGoPackage rec {
|
||||
name = "go-ethereum-${version}";
|
||||
version = "1.8.1";
|
||||
version = "1.8.2";
|
||||
goPackagePath = "github.com/ethereum/go-ethereum";
|
||||
|
||||
# Fix for usb-related segmentation faults on darwin
|
||||
@ -27,7 +27,7 @@ buildGoPackage rec {
|
||||
owner = "ethereum";
|
||||
repo = "go-ethereum";
|
||||
rev = "v${version}";
|
||||
sha256 = "0k7ly9cw68ranksa1fdn7v2lncmlqgabw3qiiyqya2xz3s4aazlf";
|
||||
sha256 = "19ryfy9dsmgk3kimkmq2hif1di4binqg9718xrmirf063rajk02a";
|
||||
};
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
|
@ -8,13 +8,13 @@ with stdenv.lib;
|
||||
stdenv.mkDerivation rec {
|
||||
|
||||
name = "litecoin" + (toString (optional (!withGui) "d")) + "-" + version;
|
||||
version = "0.14.2";
|
||||
version = "0.15.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "litecoin-project";
|
||||
repo = "litecoin";
|
||||
rev = "v${version}";
|
||||
sha256 = "1smadd5d2mpz2v3pyk7wqm60vdp81zqr4m3z4wfvnlz62m1m800y";
|
||||
sha256 = "01q0lj0grabyfh67ar984m9lv9xs0rakadkci8jpfbp8xw166r40";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig autoreconfHook ];
|
||||
|
7
pkgs/applications/altcoins/parity/beta.nix
Normal file
7
pkgs/applications/altcoins/parity/beta.nix
Normal file
@ -0,0 +1,7 @@
|
||||
let
|
||||
version = "1.9.4";
|
||||
sha256 = "00b6wsyc2chmdkhfhi9h1i06hpcjj2abcx3qdc6k39clgha0081f";
|
||||
cargoSha256 = "0pyb1mpykdp6i7c30lm5fprrxg3zanak44g28cygzli3l9l3xiy3";
|
||||
patches = [ ./patches/vendored-sources-1.9.patch ];
|
||||
in
|
||||
import ./parity.nix { inherit version sha256 cargoSha256 patches; }
|
7
pkgs/applications/altcoins/parity/default.nix
Normal file
7
pkgs/applications/altcoins/parity/default.nix
Normal file
@ -0,0 +1,7 @@
|
||||
let
|
||||
version = "1.8.11";
|
||||
sha256 = "1vabkglmmbx9jccwsqwvwck1brdjack3sw6iwsxy01wsc2jam56k";
|
||||
cargoSha256 = "1l5hx77glclpwd9i35rr3lxfxshsf1bsxvs2chsp2vwjy06knjmi";
|
||||
patches = [ ./patches/vendored-sources-1.8.patch ];
|
||||
in
|
||||
import ./parity.nix { inherit version sha256 cargoSha256 patches; }
|
38
pkgs/applications/altcoins/parity/parity.nix
Normal file
38
pkgs/applications/altcoins/parity/parity.nix
Normal file
@ -0,0 +1,38 @@
|
||||
{ version
|
||||
, sha256
|
||||
, cargoSha256
|
||||
, patches
|
||||
}:
|
||||
|
||||
{ stdenv
|
||||
, fetchFromGitHub
|
||||
, rustPlatform
|
||||
, pkgconfig
|
||||
, openssl
|
||||
, systemd
|
||||
}:
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
name = "parity-${version}";
|
||||
inherit cargoSha256 patches;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "paritytech";
|
||||
repo = "parity";
|
||||
rev = "v${version}";
|
||||
inherit sha256;
|
||||
};
|
||||
|
||||
buildInputs = [ pkgconfig systemd.lib systemd.dev openssl openssl.dev ];
|
||||
|
||||
# Some checks failed
|
||||
doCheck = false;
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Fast, light, robust Ethereum implementation";
|
||||
homepage = http://parity.io;
|
||||
license = licenses.gpl3;
|
||||
maintainers = [ maintainers.akru ];
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
@ -0,0 +1,100 @@
|
||||
diff --git a/.cargo/config b/.cargo/config
|
||||
new file mode 100644
|
||||
index 000000000..8dddda426
|
||||
--- /dev/null
|
||||
+++ b/.cargo/config
|
||||
@@ -0,0 +1,94 @@
|
||||
+[source."https://github.com/alexcrichton/mio-named-pipes"]
|
||||
+git = "https://github.com/alexcrichton/mio-named-pipes"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/nikvolf/parity-tokio-ipc"]
|
||||
+git = "https://github.com/nikvolf/parity-tokio-ipc"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/nikvolf/tokio-named-pipes"]
|
||||
+git = "https://github.com/nikvolf/tokio-named-pipes"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/bn"]
|
||||
+git = "https://github.com/paritytech/bn"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/hidapi-rs"]
|
||||
+git = "https://github.com/paritytech/hidapi-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/hyper"]
|
||||
+git = "https://github.com/paritytech/hyper"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/js-precompiled.git"]
|
||||
+git = "https://github.com/paritytech/js-precompiled.git"
|
||||
+branch = "stable"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/jsonrpc.git"]
|
||||
+git = "https://github.com/paritytech/jsonrpc.git"
|
||||
+branch = "parity-1.8"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/libusb-rs"]
|
||||
+git = "https://github.com/paritytech/libusb-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/libusb-sys"]
|
||||
+git = "https://github.com/paritytech/libusb-sys"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/nanomsg.rs.git"]
|
||||
+git = "https://github.com/paritytech/nanomsg.rs.git"
|
||||
+branch = "parity-1.7"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-ctrlc.git"]
|
||||
+git = "https://github.com/paritytech/rust-ctrlc.git"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-rocksdb"]
|
||||
+git = "https://github.com/paritytech/rust-rocksdb"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-secp256k1"]
|
||||
+git = "https://github.com/paritytech/rust-secp256k1"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-snappy"]
|
||||
+git = "https://github.com/paritytech/rust-snappy"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/trezor-sys"]
|
||||
+git = "https://github.com/paritytech/trezor-sys"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/wasm-utils"]
|
||||
+git = "https://github.com/paritytech/wasm-utils"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/tailhook/rotor"]
|
||||
+git = "https://github.com/tailhook/rotor"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/tomusdrw/ws-rs"]
|
||||
+git = "https://github.com/tomusdrw/ws-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
@ -0,0 +1,107 @@
|
||||
diff --git a/.cargo/config b/.cargo/config
|
||||
new file mode 100644
|
||||
index 000000000..0efb69724
|
||||
--- /dev/null
|
||||
+++ b/.cargo/config
|
||||
@@ -0,0 +1,100 @@
|
||||
+
|
||||
+[source."https://github.com/alexcrichton/mio-named-pipes"]
|
||||
+git = "https://github.com/alexcrichton/mio-named-pipes"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/js-dist-paritytech/parity-beta-1-9-shell.git"]
|
||||
+git = "https://github.com/js-dist-paritytech/parity-beta-1-9-shell.git"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/js-dist-paritytech/parity-beta-1-9-v1.git"]
|
||||
+git = "https://github.com/js-dist-paritytech/parity-beta-1-9-v1.git"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/nikvolf/parity-tokio-ipc"]
|
||||
+git = "https://github.com/nikvolf/parity-tokio-ipc"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/nikvolf/tokio-named-pipes"]
|
||||
+git = "https://github.com/nikvolf/tokio-named-pipes"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/bn"]
|
||||
+git = "https://github.com/paritytech/bn"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/hidapi-rs"]
|
||||
+git = "https://github.com/paritytech/hidapi-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/hyper"]
|
||||
+git = "https://github.com/paritytech/hyper"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/jsonrpc.git"]
|
||||
+git = "https://github.com/paritytech/jsonrpc.git"
|
||||
+branch = "parity-1.9"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/libusb-rs"]
|
||||
+git = "https://github.com/paritytech/libusb-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/libusb-sys"]
|
||||
+git = "https://github.com/paritytech/libusb-sys"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-ctrlc.git"]
|
||||
+git = "https://github.com/paritytech/rust-ctrlc.git"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-rocksdb"]
|
||||
+git = "https://github.com/paritytech/rust-rocksdb"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-secp256k1"]
|
||||
+git = "https://github.com/paritytech/rust-secp256k1"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/rust-snappy"]
|
||||
+git = "https://github.com/paritytech/rust-snappy"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/trezor-sys"]
|
||||
+git = "https://github.com/paritytech/trezor-sys"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/paritytech/wasm-utils"]
|
||||
+git = "https://github.com/paritytech/wasm-utils"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/pepyakin/wasmi"]
|
||||
+git = "https://github.com/pepyakin/wasmi"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/tailhook/rotor"]
|
||||
+git = "https://github.com/tailhook/rotor"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
||||
+[source."https://github.com/tomusdrw/ws-rs"]
|
||||
+git = "https://github.com/tomusdrw/ws-rs"
|
||||
+branch = "master"
|
||||
+replace-with = "vendored-sources"
|
||||
+
|
@ -1,58 +0,0 @@
|
||||
{ stdenv, fetchurl, pkgconfig, openssl, db48, boost
|
||||
, zlib, qt4, qmake4Hook, utillinux, protobuf, qrencode
|
||||
, withGui }:
|
||||
|
||||
with stdenv.lib;
|
||||
stdenv.mkDerivation rec{
|
||||
|
||||
name = "primecoin" + (toString (optional (!withGui) "d")) + "-" + version;
|
||||
version = "0.8.6";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/primecoin/primecoin/archive/v${version}.tar.gz";
|
||||
sha256 = "0cixnkici74204s9d5iqj5sccib5a8dig2p2fp1axdjifpg787i3";
|
||||
};
|
||||
|
||||
qmakeFlags = ["USE_UPNP=-"];
|
||||
makeFlags = ["USE_UPNP=-"];
|
||||
|
||||
nativeBuildInputs = [ pkgconfig ];
|
||||
buildInputs = [ openssl db48 boost zlib utillinux protobuf ]
|
||||
++ optionals withGui [ qt4 qmake4Hook qrencode ];
|
||||
|
||||
configureFlags = [ "--with-boost-libdir=${boost.out}/lib" ]
|
||||
++ optionals withGui [ "--with-gui=qt4" ];
|
||||
|
||||
preBuild = "unset AR;"
|
||||
+ (toString (optional (!withGui) "cd src; cp makefile.unix Makefile"));
|
||||
|
||||
installPhase =
|
||||
if withGui
|
||||
then "install -D bitcoin-qt $out/bin/primecoin-qt"
|
||||
else "install -D bitcoind $out/bin/primecoind";
|
||||
|
||||
# `make build/version.o`:
|
||||
# make: *** No rule to make target 'build/build.h', needed by 'build/version.o'. Stop.
|
||||
enableParallelBuilding = false;
|
||||
|
||||
meta = {
|
||||
description = "A new type cryptocurrency which is proof-of-work based on searching for prime numbers";
|
||||
longDescription= ''
|
||||
Primecoin is an innovative cryptocurrency, a form of digital
|
||||
currency secured by cryptography and issued through a
|
||||
decentralized mining market. Derived from Satoshi Nakamoto's
|
||||
Bitcoin, Primecoin introduces an unique form of proof-of-work
|
||||
based on prime numbers.
|
||||
|
||||
The innovative prime proof-of-work in Primecoin not only
|
||||
provides security and minting to the network, but also generates
|
||||
a special form of prime number chains of interest to mathematical
|
||||
research. Thus primecoin network is energy-multiuse, compared to
|
||||
bitcoin.
|
||||
'';
|
||||
homepage = http://primecoin.io/;
|
||||
maintainers = with maintainers; [ AndersonTorres ];
|
||||
license = licenses.mit;
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, fetchurl, libcdio, cddiscid, wget, bash, which, vorbis-tools, id3v2, eyeD3
|
||||
{ stdenv, fetchurl, libcdio-paranoia, cddiscid, wget, bash, which, vorbis-tools, id3v2, eyeD3
|
||||
, lame, flac, eject, mkcue, glyr
|
||||
, perl, DigestSHA, MusicBrainz, MusicBrainzDiscID
|
||||
, makeWrapper }:
|
||||
@ -42,7 +42,7 @@ in
|
||||
postFixup = ''
|
||||
for cmd in abcde cddb-tool abcde-musicbrainz-tool; do
|
||||
wrapProgram "$out/bin/$cmd" --prefix PATH ":" \
|
||||
${stdenv.lib.makeBinPath [ "$out" which libcdio cddiscid wget vorbis-tools id3v2 eyeD3 lame flac glyr ]}
|
||||
${stdenv.lib.makeBinPath [ "$out" which libcdio-paranoia cddiscid wget vorbis-tools id3v2 eyeD3 lame flac glyr ]}
|
||||
done
|
||||
'';
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, fetchurl, boost, cmake, chromaprint, gettext, gst_all_1, liblastfm
|
||||
{ stdenv, fetchurl, fetchpatch, boost, cmake, chromaprint, gettext, gst_all_1, liblastfm
|
||||
, qt4, taglib, fftw, glew, qjson, sqlite, libgpod, libplist, usbmuxd, libmtp
|
||||
, libpulseaudio, gvfs, libcdio, libechonest, libspotify, pcre, projectm, protobuf
|
||||
, qca2, pkgconfig, sparsehash, config, makeWrapper, runCommand, gst_plugins }:
|
||||
@ -24,6 +24,11 @@ let
|
||||
# Required so as to avoid adding libspotify as a build dependency (as it is
|
||||
# unfree and thus would prevent us from having a free package).
|
||||
./clementine-spotify-blob-remove-from-build.patch
|
||||
(fetchpatch {
|
||||
# Fix w/gcc7
|
||||
url = "https://github.com/clementine-player/Clementine/pull/5630.patch";
|
||||
sha256 = "0px7xp1m4nvrncx8sga1qlxppk562wrk2qqk19iiry84nxg20mk4";
|
||||
})
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ cmake pkgconfig ];
|
||||
|
@ -17,7 +17,7 @@
|
||||
#, waveoutSupport
|
||||
|
||||
, cddbSupport ? true, libcddb ? null
|
||||
, cdioSupport ? true, libcdio ? null
|
||||
, cdioSupport ? true, libcdio ? null, libcdio-paranoia ? null
|
||||
, cueSupport ? true, libcue ? null
|
||||
, discidSupport ? (!stdenv.isDarwin), libdiscid ? null
|
||||
, ffmpegSupport ? true, ffmpeg ? null
|
||||
@ -69,7 +69,7 @@ let
|
||||
|
||||
# Input file formats
|
||||
(mkFlag cddbSupport "CONFIG_CDDB=y" libcddb)
|
||||
(mkFlag cdioSupport "CONFIG_CDIO=y" libcdio)
|
||||
(mkFlag cdioSupport "CONFIG_CDIO=y" [ libcdio libcdio-paranoia ])
|
||||
(mkFlag cueSupport "CONFIG_CUE=y" libcue)
|
||||
(mkFlag discidSupport "CONFIG_DISCID=y" libdiscid)
|
||||
(mkFlag ffmpegSupport "CONFIG_FFMPEG=y" ffmpeg)
|
||||
|
@ -93,7 +93,7 @@ stdenv.mkDerivation rec {
|
||||
description = "Ultimate Music Player for GNU/Linux";
|
||||
homepage = http://deadbeef.sourceforge.net/;
|
||||
license = licenses.gpl2;
|
||||
platforms = platforms.linux;
|
||||
platforms = [ "x86_64-linux" "i686-linux" ];
|
||||
maintainers = [ maintainers.abbradar ];
|
||||
repositories.git = "https://github.com/Alexey-Yakovenko/deadbeef";
|
||||
};
|
||||
|
@ -1,35 +1,37 @@
|
||||
{ stdenv, fetchurl, pkgconfig, intltool, gtk3, glib, libid3tag, id3lib, taglib
|
||||
, libvorbis, libogg, flac, itstool, libxml2, gsettings-desktop-schemas
|
||||
, makeWrapper, gnome3
|
||||
, gnome3, wrapGAppsHook
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "easytag-${version}";
|
||||
majorVersion = "2.4";
|
||||
version = "${majorVersion}.3";
|
||||
let
|
||||
pname = "easytag";
|
||||
version = "2.4.3";
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "${pname}-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "mirror://gnome/sources/easytag/${majorVersion}/${name}.tar.xz";
|
||||
url = "mirror://gnome/sources/${pname}/${gnome3.versionBranch version}/${name}.tar.xz";
|
||||
sha256 = "1mbxnqrw1fwcgraa1bgik25vdzvf97vma5pzknbwbqq5ly9fwlgw";
|
||||
};
|
||||
|
||||
preFixup = ''
|
||||
wrapProgram $out/bin/easytag \
|
||||
--prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH:$out/share" \
|
||||
--prefix GIO_EXTRA_MODULES : "${stdenv.lib.getLib gnome3.dconf}/lib/gio/modules"
|
||||
'';
|
||||
|
||||
NIX_LDFLAGS = "-lid3tag -lz";
|
||||
|
||||
nativeBuildInputs = [ makeWrapper pkgconfig intltool ];
|
||||
nativeBuildInputs = [ pkgconfig intltool itstool libxml2 wrapGAppsHook ];
|
||||
buildInputs = [
|
||||
gtk3 glib libid3tag id3lib taglib libvorbis libogg flac
|
||||
itstool libxml2 gsettings-desktop-schemas gnome3.defaultIconTheme (stdenv.lib.getLib gnome3.dconf)
|
||||
gsettings-desktop-schemas gnome3.defaultIconTheme
|
||||
];
|
||||
|
||||
passthru = {
|
||||
updateScript = gnome3.updateScript {
|
||||
packageName = pname;
|
||||
versionPolicy = "none";
|
||||
};
|
||||
};
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "View and edit tags for various audio files";
|
||||
homepage = http://projects.gnome.org/easytag/;
|
||||
homepage = https://wiki.gnome.org/Apps/EasyTAG;
|
||||
license = licenses.gpl2Plus;
|
||||
maintainers = with maintainers; [ fuuzetsu ];
|
||||
platforms = platforms.linux;
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, fetchFromGitHub, fftw, freeglut, mesa_glu, qtbase, qtmultimedia, qmake
|
||||
{ stdenv, fetchFromGitHub, fftw, freeglut, libGLU, qtbase, qtmultimedia, qmake
|
||||
, alsaSupport ? true, alsaLib ? null
|
||||
, jackSupport ? false, libjack2 ? null
|
||||
, portaudioSupport ? false, portaudio ? null }:
|
||||
|
@ -1,5 +1,5 @@
|
||||
{ stdenv, fetchFromGitHub , xorg, freetype, alsaLib, curl, libjack2
|
||||
, lv2, pkgconfig, mesa }:
|
||||
, lv2, pkgconfig, libGLU_combined }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
version = "0.9.0";
|
||||
@ -15,7 +15,7 @@
|
||||
buildInputs = [
|
||||
xorg.libX11 xorg.libXcomposite xorg.libXcursor xorg.libXext
|
||||
xorg.libXinerama xorg.libXrender xorg.libXrandr
|
||||
freetype alsaLib curl libjack2 pkgconfig mesa lv2
|
||||
freetype alsaLib curl libjack2 pkgconfig libGLU_combined lv2
|
||||
];
|
||||
|
||||
CXXFLAGS = "-DHAVE_LROUND";
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ stdenv, fetchurl, SDL, libjack2, mesa, pkgconfig }:
|
||||
{ stdenv, fetchurl, SDL, libjack2, libGLU_combined, pkgconfig }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "jack_oscrolloscope-${version}";
|
||||
@ -10,7 +10,7 @@ stdenv.mkDerivation rec {
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgconfig ];
|
||||
buildInputs = [ SDL libjack2 mesa ];
|
||||
buildInputs = [ SDL libjack2 libGLU_combined ];
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user