diff --git a/modules/system/upstart/upstart.nix b/modules/system/upstart/upstart.nix index d7c9ecc489a..7dd6896c25a 100644 --- a/modules/system/upstart/upstart.nix +++ b/modules/system/upstart/upstart.nix @@ -24,11 +24,21 @@ let end script '' else ""} - ${if job.exec != "" then '' - exec ${job.exec} - '' else ""} + ${if true then + # Simulate jobs without a main process (which Upstart 0.3 + # doesn't support) using a semi-infinite sleep. + '' + exec ${if job.exec != "" then job.exec else "sleep 1e100"} + '' + else ""} ${if job.respawn then "respawn" else ""} + + ${if job.postStop != "" then '' + stop script + ${job.postStop} + end script + '' else ""} ''; in @@ -145,7 +155,16 @@ in default = ""; description = '' Shell commands executed before the job is started - (i.e. before the exec command is run). + (i.e. before the job's main process is started). + ''; + }; + + postStop = mkOption { + type = types.string; + default = ""; + description = '' + Shell commands executed after the job has stopped + (i.e. after the job's main process has terminated). ''; }; @@ -153,7 +172,10 @@ in type = types.string; default = ""; description = '' - Command to start the job. + Command to start the job's main process. If empty, the + job has no main process, but can still have pre/post-start + and pre/post-stop scripts, and is considered "running" + until it is stopped. ''; }; diff --git a/modules/tasks/tty-backgrounds.nix b/modules/tasks/tty-backgrounds.nix index 073ac90df2e..b83935827f7 100644 --- a/modules/tasks/tty-backgrounds.nix +++ b/modules/tasks/tty-backgrounds.nix @@ -1,75 +1,14 @@ {pkgs, config, ...}: -###### interface -let - inherit (pkgs.lib) mkOption mkIf; - - options = { - services = { - ttyBackgrounds = { - - enable = mkOption { - default = true; - description = " - Whether to enable graphical backgrounds for the virtual consoles. - "; - }; - - defaultTheme = mkOption { - default = pkgs.fetchurl { - #url = http://www.bootsplash.de/files/themes/Theme-BabyTux.tar.bz2; - url = mirror://gentoo/distfiles/Theme-BabyTux.tar.bz2; - md5 = "a6d89d1c1cff3b6a08e2f526f2eab4e0"; - }; - description = " - The default theme for the virtual consoles. Themes can be found - at . - "; - }; - - defaultSpecificThemes = mkOption { - default = [ - /* - { tty = 6; - theme = pkgs.fetchurl { # Yeah! - url = mirror://gentoo/distfiles/Theme-Pativo.tar.bz2; - md5 = "9e13beaaadf88d43a5293e7ab757d569"; - }; - } - */ - { tty = 10; - theme = pkgs.themes "theme-gnu"; - } - ]; - description = " - This option sets specific themes for virtual consoles. If you - just want to set themes for additional consoles, use - . - "; - }; - - specificThemes = mkOption { - default = [ - ]; - description = " - This option allows you to set specific themes for virtual - consoles. - "; - }; - }; - }; - }; -in - -###### implementation - let + inherit (pkgs.lib) mkOption mkIf singleton; inherit (pkgs) stdenv; + kernelPackages = config.boot.kernelPackages; splashutils = kernelPackages.splashutils; requiredTTYs = config.requiredTTYs; - backgrounds = + backgrounds = let specificThemes = @@ -91,7 +30,6 @@ let }) defaultTTYs) ++ specificThemes; - themesUnpacked = stdenv.mkDerivation { name = "splash-themes"; builder = ./tty-backgrounds-combine.sh; @@ -101,70 +39,125 @@ let }; unpackTheme = theme: import ../../lib/unpack-theme.nix { - inherit stdenv theme; - }; - - + inherit stdenv theme; + }; in -mkIf (config.services.ttyBackgrounds.enable) { +{ - assertions = [ { assertion = kernelPackages.splashutils != null; message = "kernelPackages.splashutils may not be false"; } ]; + ###### interface + + options = { + + services.ttyBackgrounds = { - require = [ - options - ]; + enable = mkOption { + default = true; + description = '' + Whether to enable graphical backgrounds for the virtual consoles. + ''; + }; + + defaultTheme = mkOption { + default = pkgs.fetchurl { + #url = http://www.bootsplash.de/files/themes/Theme-BabyTux.tar.bz2; + url = mirror://gentoo/distfiles/Theme-BabyTux.tar.bz2; + md5 = "a6d89d1c1cff3b6a08e2f526f2eab4e0"; + }; + description = '' + The default theme for the virtual consoles. Themes can be found + at . + ''; + }; + + defaultSpecificThemes = mkOption { + default = [ + /* + { tty = 6; + theme = pkgs.fetchurl { # Yeah! + url = mirror://gentoo/distfiles/Theme-Pativo.tar.bz2; + md5 = "9e13beaaadf88d43a5293e7ab757d569"; + }; + } + */ + { tty = 10; + theme = pkgs.themes "theme-gnu"; + } + ]; + description = '' + This option sets specific themes for virtual consoles. If you + just want to set themes for additional consoles, use + . + ''; + }; + + specificThemes = mkOption { + default = [ + ]; + description = '' + This option allows you to set specific themes for virtual + consoles. + ''; + }; + + }; + + }; - environment = { - etc = [ + ###### implementation + + config = mkIf config.services.ttyBackgrounds.enable { + + assertions = singleton + { assertion = kernelPackages.splashutils != null; + message = "kernelPackages.splashutils may not be false"; + }; + + environment.etc = singleton { source = themesUnpacked; target = "splash"; - } - ]; - }; + }; - - services = { - extraJobs = [ rec { + jobs = singleton { name = "tty-backgrounds"; - job = '' - start on udev + startOn = "udev"; - start script + preStart = + '' + # Critical: tell the kernel where to find splash_helper. It calls + # this program every time we switch between consoles. + helperProcFile=${splashutils.helperProcFile} + if test -e /proc/sys/fbcondecor; then helperProcFile=/proc/sys/fbcondecor; fi + echo ${splashutils}/${splashutils.helperName} > $helperProcFile - # Critical: tell the kernel where to find splash_helper. It calls - # this program every time we switch between consoles. - helperProcFile=${splashutils.helperProcFile} - if test -e /proc/sys/fbcondecor; then helperProcFile=/proc/sys/fbcondecor; fi - echo ${splashutils}/${splashutils.helperName} > $helperProcFile + # For each console... + for tty in ${toString (map (x: x.tty) backgrounds)}; do + # Make sure that the console exists. + echo -n "" > /dev/tty$tty - # For each console... - for tty in ${toString (map (x: x.tty) backgrounds)}; do - # Make sure that the console exists. - echo -n "" > /dev/tty$tty + # Set the theme as determined by tty-backgrounds-combine.sh + # above. + theme=$(readlink ${themesUnpacked}/$tty) + ${splashutils}/${splashutils.controlName} --tty $tty -c setcfg -t $theme || true + ${splashutils}/${splashutils.controlName} --tty $tty -c setpic -t $theme || true + ${splashutils}/${splashutils.controlName} --tty $tty -c on || true + done + ''; - # Set the theme as determined by tty-backgrounds-combine.sh - # above. - theme=$(readlink ${themesUnpacked}/$tty) - ${splashutils}/${splashutils.controlName} --tty $tty -c setcfg -t $theme || true - ${splashutils}/${splashutils.controlName} --tty $tty -c setpic -t $theme || true - ${splashutils}/${splashutils.controlName} --tty $tty -c on || true - done - - end script - - respawn sleep 10000 # !!! Hack - - stop script - # Disable the theme on each console. - for tty in ${toString (map (x: x.tty) backgrounds)}; do - ${splashutils}/${splashutils.controlName} --tty $tty -c off || true - done - end script - ''; - }]; + postStop = + '' + /var/run/current-system/sw/bin/ps -axuw > /tmp/ps + + # Disable the theme on each console. + for tty in ${toString (map (x: x.tty) backgrounds)}; do + ${splashutils}/${splashutils.controlName} --tty $tty -c off || true + done + ''; + }; + }; + }