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
+ '';
+ };
+
};
+
}