diff --git a/modules/services/databases/postgresql.nix b/modules/services/databases/postgresql.nix index 1633b9d0fdd..139a716ae75 100644 --- a/modules/services/databases/postgresql.nix +++ b/modules/services/databases/postgresql.nix @@ -36,7 +36,7 @@ let ''; pre84 = versionOlder (builtins.parseDrvName postgresql.name).version "8.4"; - + in { @@ -139,7 +139,7 @@ in host all all 127.0.0.1/32 md5 host all all ::1/128 md5 ''; - + users.extraUsers = singleton { name = "postgres"; description = "PostgreSQL server user"; @@ -181,20 +181,19 @@ in postStart = '' while ! psql postgres -c ""; do - stop_check sleep 1 done ''; - extraConfig = + serviceConfig = '' - # Shut down Postgres using SIGINT ("Fast Shutdown mode"). See + # Shut down Postgres using SIGINT ("Fast Shutdown mode"). See # http://www.postgresql.org/docs/current/static/server-shutdown.html - kill signal INT + KillSignal=SIGINT # Give Postgres a decent amount of time to clean up after - # receiving Upstart's SIGINT. - kill timeout 60 + # receiving systemd's SIGINT. + TimeoutSec=60 ''; }; diff --git a/modules/system/boot/systemd-unit-options.nix b/modules/system/boot/systemd-unit-options.nix new file mode 100644 index 00000000000..34b37f4d0ba --- /dev/null +++ b/modules/system/boot/systemd-unit-options.nix @@ -0,0 +1,101 @@ +{ config, pkgs }: + +with pkgs.lib; + +{ + + serviceOptions = { + + description = mkOption { + default = ""; + types = types.uniq types.string; + description = "Description of this unit used in systemd messages and progress indicators."; + }; + + requires = mkOption { + default = []; + types = types.listOf types.string; + description = '' + Start the specified units when this unit is started, and stop + this unit when the specified units are stopped or fail. + ''; + }; + + wants = mkOption { + default = []; + types = types.listOf types.string; + description = '' + Start the specified units when this unit is started. + ''; + }; + + after = mkOption { + default = []; + types = types.listOf types.string; + description = '' + If the specified units are started at the same time as + this unit, delay this unit until they have started. + ''; + }; + + before = mkOption { + default = []; + types = types.listOf types.string; + description = '' + If the specified units are started at the same time as + this unit, delay them until this unit has started. + ''; + }; + + wantedBy = mkOption { + default = []; + types = types.listOf types.string; + description = "Units that want (i.e. depend on) this unit."; + }; + + environment = mkOption { + default = {}; + type = types.attrs; + example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; }; + description = "Environment variables passed to the services's processes."; + }; + + path = mkOption { + default = []; + apply = ps: "${makeSearchPath "bin" ps}:${makeSearchPath "sbin" ps}"; + description = '' + Packages added to the service's PATH + environment variable. Both the bin + and sbin subdirectories of each + package are added. + ''; + }; + + serviceConfig = mkOption { + default = ""; + type = types.string; + description = '' + Contents of the [Service] section of the unit. + See systemd.unit + 5 for details. + ''; + }; + + script = mkOption { + type = types.uniq types.string; + default = ""; + description = "Shell commands executed as the service's main process."; + }; + + preStart = mkOption { + type = types.string; + default = ""; + description = '' + Shell commands executed before the service's main process + is started. + ''; + }; + + }; + +} \ No newline at end of file diff --git a/modules/system/boot/systemd.nix b/modules/system/boot/systemd.nix index 848831a94a2..10c98116710 100644 --- a/modules/system/boot/systemd.nix +++ b/modules/system/boot/systemd.nix @@ -1,122 +1,10 @@ { config, pkgs, ... }: with pkgs.lib; +with import ./systemd-unit-options.nix { inherit config pkgs; }; let - servicesOptions = { - - description = mkOption { - default = ""; - types = types.uniq types.string; - description = "Description of this unit used in systemd messages and progress indicators."; - }; - - requires = mkOption { - default = []; - types = types.listOf types.string; - description = '' - Start the specified units when this unit is started, and stop - this unit when the specified units are stopped or fail. - ''; - }; - - wants = mkOption { - default = []; - types = types.listOf types.string; - description = '' - Start the specified units when this unit is started. - ''; - }; - - after = mkOption { - default = []; - types = types.listOf types.string; - description = '' - If the specified units are started at the same time as - this unit, delay this unit until they have started. - ''; - }; - - before = mkOption { - default = []; - types = types.listOf types.string; - description = '' - If the specified units are started at the same time as - this unit, delay them until this unit has started. - ''; - }; - - wantedBy = mkOption { - default = []; - types = types.listOf types.string; - description = "Start this unit when the specified units are started."; - }; - - environment = mkOption { - default = {}; - type = types.attrs; - example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; }; - description = "Environment variables passed to the services's processes."; - }; - - path = mkOption { - default = []; - apply = ps: "${makeSearchPath "bin" ps}:${makeSearchPath "sbin" ps}"; - description = '' - Packages added to the service's PATH - environment variable. Both the bin - and sbin subdirectories of each - package are added. - ''; - }; - - serviceConfig = mkOption { - default = ""; - type = types.string; - description = '' - Contents of the [Service] section of the unit. - See systemd.unit - 5 for details. - ''; - }; - - script = mkOption { - type = types.uniq types.string; - default = ""; - description = "Shell commands executed as the service's main process."; - }; - - preStart = mkOption { - type = types.string; - default = ""; - description = '' - Shell commands executed before the service's main process - is started. - ''; - }; - - }; - - - servicesConfig = { name, config, ... }: { - - config = { - - # Default path for systemd services. Should be quite minimal. - path = - [ pkgs.coreutils - pkgs.findutils - pkgs.gnugrep - pkgs.gnused - systemd - ]; - - }; - - }; - - cfg = config.boot.systemd; systemd = pkgs.systemd; @@ -178,7 +66,7 @@ let # Utmp maintenance. "systemd-update-utmp-runlevel.service" "systemd-update-utmp-shutdown.service" - + # Filesystems. "systemd-fsck@.service" "systemd-fsck-root.service" @@ -260,6 +148,19 @@ let makeJobScript = name: content: "${pkgs.writeScriptBin name content}/bin/${name}"; + serviceConfig = { name, config, ... }: { + config = { + # Default path for systemd services. Should be quite minimal. + path = + [ pkgs.coreutils + pkgs.findutils + pkgs.gnugrep + pkgs.gnused + systemd + ]; + }; + }; + serviceToUnit = name: def: { inherit (def) wantedBy; @@ -277,7 +178,7 @@ let [Service] Environment=PATH=${def.path} ${concatMapStrings (n: "Environment=${n}=${getAttr n def.environment}\n") (attrNames def.environment)} - + ${optionalString (def.preStart != "") '' ExecStartPre=${makeJobScript "${name}-prestart.sh" '' #! ${pkgs.stdenv.shell} -e @@ -297,7 +198,7 @@ let }; nixosUnits = mapAttrsToList makeUnit cfg.units; - + units = pkgs.runCommand "units" { preferLocalBuild = true; } '' mkdir -p $out @@ -310,7 +211,7 @@ let ln -s $fn $out/ fi done - + for i in ${toString upstreamWants}; do fn=${systemd}/example/systemd/system/$i [ -e $fn ] @@ -322,7 +223,7 @@ let if ! [ -e $y ]; then rm -v $y; fi done done - + for i in ${toString nixosUnits}; do ln -s $i/* $out/ done @@ -337,7 +238,7 @@ let ln -s ../getty@tty1.service $out/multi-user.target.wants/ ''; # */ - + in { @@ -350,29 +251,24 @@ in description = "Definition of systemd units."; default = {}; type = types.attrsOf types.optionSet; - options = { - text = mkOption { types = types.uniq types.string; description = "Text of this systemd unit."; }; - wantedBy = mkOption { default = []; types = types.listOf types.string; description = "Units that want (i.e. depend on) this unit."; }; - }; - }; boot.systemd.services = mkOption { description = "Definition of systemd services."; default = {}; type = types.attrsOf types.optionSet; - options = [ servicesOptions servicesConfig ]; + options = [ serviceOptions serviceConfig ]; }; boot.systemd.defaultUnit = mkOption { @@ -386,16 +282,16 @@ in type = types.bool; description = "Whether to log kernel messages."; }; - + services.journald.console = mkOption { default = ""; type = types.uniq types.string; description = "If non-empty, write log messages to the specified TTY device. Defaults to /dev/console."; }; - + }; - + ###### implementation config = { @@ -405,7 +301,7 @@ in system.build.units = units; environment.systemPackages = [ systemd ]; - + environment.etc = [ { source = units; target = "systemd/system"; diff --git a/modules/system/upstart/upstart.nix b/modules/system/upstart/upstart.nix index 6f76f5d7b1d..6375289293f 100644 --- a/modules/system/upstart/upstart.nix +++ b/modules/system/upstart/upstart.nix @@ -1,11 +1,10 @@ { config, pkgs, ... }: with pkgs.lib; +with import ../boot/systemd-unit-options.nix { inherit config pkgs; }; let - upstart = pkgs.upstart; - userExists = u: (u == "") || any (uu: uu.name == u) (attrValues config.users.extraUsers); @@ -66,6 +65,8 @@ let serviceConfig = '' + ${job.serviceConfig} + ${optionalString (job.preStart != "" && (job.script != "" || job.exec != "")) '' ExecStartPre=${preStartScript} ''} @@ -77,7 +78,7 @@ let ${optionalString (job.script != "" || job.exec != "") '' ExecStart=${startScript} ''} - + ${optionalString (job.postStart != "") '' ExecStartPost=${postStartScript} ''} @@ -85,7 +86,7 @@ let ${optionalString (job.preStop != "") '' ExecStop=${preStopScript} ''} - + ${optionalString (job.postStop != "") '' ExecStopPost=${postStopScript} ''} @@ -100,7 +101,7 @@ let }; - jobOptions = { + jobOptions = serviceOptions // { name = mkOption { # !!! The type should ensure that this could be a filename. @@ -111,14 +112,6 @@ let ''; }; - description = mkOption { - type = types.string; - default = ""; - description = '' - A short description of this job. - ''; - }; - startOn = mkOption { # !!! Re-enable this once we're on Upstart >= 0.6. #type = types.string; @@ -137,15 +130,6 @@ let ''; }; - preStart = mkOption { - type = types.string; - default = ""; - description = '' - Shell commands executed before the job is started - (i.e. before the job's main process is started). - ''; - }; - postStart = mkOption { type = types.string; default = ""; @@ -186,15 +170,6 @@ let ''; }; - script = mkOption { - type = types.string; - default = ""; - description = '' - Shell commands executed as the job's main process. Can be - specified instead of the exec attribute. - ''; - }; - respawn = mkOption { type = types.bool; default = true; @@ -223,15 +198,6 @@ let ''; }; - environment = mkOption { - type = types.attrs; - default = {}; - example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; }; - description = '' - Environment variables passed to the job's processes. - ''; - }; - daemonType = mkOption { type = types.string; default = "none"; @@ -264,15 +230,6 @@ let ''; }; - extraConfig = mkOption { - type = types.string; - default = ""; - example = "limit nofile 4096 4096"; - description = '' - Additional Upstart stanzas not otherwise supported. - ''; - }; - path = mkOption { default = []; description = '' @@ -282,46 +239,25 @@ let ''; }; - console = mkOption { - default = ""; - example = "console"; - description = '' - If set to output, job output is written to - the console. If it's owner, additionally - the job becomes owner of the console. It it's empty (the - default), output is written to - /var/log/upstart/jobname - ''; - }; - }; - upstartJob = {name, config, ...}: { + upstartJob = { name, config, ... }: { options = { - + unit = mkOption { default = makeUnit config; description = "Generated definition of the systemd unit corresponding to this job."; }; - + }; config = { - + # The default name is the name extracted from the attribute path. name = mkDefaultValue name; - - # Default path for Upstart jobs. Should be quite minimal. - path = - [ pkgs.coreutils - pkgs.findutils - pkgs.gnugrep - pkgs.gnused - upstart - ]; - + }; }; @@ -365,7 +301,7 @@ in boot.systemd.services = flip mapAttrs' config.jobs (name: job: nameValuePair "${job.name}.service" job.unit); - + }; }