diff --git a/modules/system/upstart/upstart.nix b/modules/system/upstart/upstart.nix index 0f7eb65bf2f..de60f693e83 100644 --- a/modules/system/upstart/upstart.nix +++ b/modules/system/upstart/upstart.nix @@ -53,18 +53,17 @@ let ''; in { - text = + inherit (job) description path environment; + + after = + if job.startOn == "stopped udevtrigger" then [ "systemd-udev-settle.service" ] else + if job.startOn == "started udev" then [ "systemd-udev.service" ] else + []; + + wantedBy = if job.startOn == "" then [ ] else [ "multi-user.target" ]; + + serviceConfig = '' - [Unit] - Description=${job.description} - ${if job.startOn == "stopped udevtrigger" then "After=systemd-udev-settle.service" else - if job.startOn == "started udev" then "After=systemd-udev.service" - else ""} - - [Service] - Environment=PATH=${job.path} - ${concatMapStrings (n: "Environment=${n}=\"${getAttr n env}\"\n") (attrNames env)} - ${optionalString (job.preStart != "" && (job.script != "" || job.exec != "")) '' ExecStartPre=${preStartScript} ''} @@ -96,153 +95,8 @@ let ${optionalString (!job.task && job.respawn) "Restart=always"} ''; - - wantedBy = if job.startOn == "" then [ ] else [ "multi-user.target" ]; - }; - /* - text = - '' - ${optionalString (job.description != "") '' - description "${job.description}" - ''} - - ${if isList job.startOn then - "start on ${concatStringsSep " or " job.startOn}" - else if job.startOn != "" then - "start on ${job.startOn}" - else "" - } - - ${optionalString (job.stopOn != "") "stop on ${job.stopOn}"} - - env PATH=${job.path} - - ${concatMapStrings (n: "env ${n}=\"${getAttr n env}\"\n") (attrNames env)} - - ${optionalString (job.console != "") "console ${job.console}"} - - pre-start script - ln -sfn "$(readlink -f "/etc/init/${job.name}.conf")" /var/run/upstart-jobs/${job.name} - ${optionalString (job.preStart != "") '' - source ${jobHelpers} - ${job.preStart} - ''} - end script - - ${if job.script != "" && job.exec != "" then - abort "Job ${job.name} has both a `script' and `exec' attribute." - else if job.script != "" then - '' - script - source ${jobHelpers} - ${job.script} - end script - '' - else if job.exec != "" && job.console == "" then - '' - script - exec ${job.exec} - end script - '' - else if job.exec != "" then - '' - exec ${job.exec} - '' - else "" - } - - ${optionalString (job.postStart != "") '' - post-start script - source ${jobHelpers} - ${job.postStart} - end script - ''} - - ${optionalString job.task "task"} - ${optionalString (!job.task && job.respawn) "respawn"} - - ${ # preStop is run only if there is exec or script. - # (upstart 0.6.5, job.c:562) - optionalString (job.preStop != "") (assert hasMain; '' - pre-stop script - source ${jobHelpers} - ${job.preStop} - end script - '')} - - ${optionalString (job.postStop != "") '' - post-stop script - source ${jobHelpers} - ${job.postStop} - end script - ''} - - ${if job.daemonType == "fork" then "expect fork" else - if job.daemonType == "daemon" then "expect daemon" else - if job.daemonType == "stop" then "expect stop" else - if job.daemonType == "none" then "" else - throw "invalid daemon type `${job.daemonType}'"} - - ${optionalString (job.setuid != "") '' - setuid ${job.setuid} - ''} - - ${optionalString (job.setgid != "") '' - setuid ${job.setgid} - ''} - - ${job.extraConfig} - ''; - */ - - - # Shell functions for use in Upstart jobs. - jobHelpers = pkgs.writeText "job-helpers.sh" - '' - # Ensure that an Upstart service is running. - ensure() { - local job="$1" - local status="$(status "$job")" - - # If it's already running, we're happy. - [[ "$status" =~ start/running ]] && return 0 - - # If its current goal is to stop, start it. - [[ "$status" =~ stop/ ]] && { status="$(start "$job")" || true; } - - # The "start" command is synchronous *if* the job is - # not already starting. So if somebody else started - # the job in parallel, the "start" above may return - # while the job is still starting. So wait until it - # is up or has failed. - while true; do - [[ "$status" =~ stop/ ]] && { echo "job $job failed to start"; return 1; } - [[ "$status" =~ start/running ]] && return 0 - echo "waiting for job $job to start..." - sleep 1 - status="$(status "$job")" - done - } - - # Check whether the current job has been stopped. Used in - # post-start jobs to determine if they should continue. - stop_check() { - local status="$(status)" - if [[ "$status" =~ stop/ ]]; then - echo "job asked to stop!" - return 1 - fi - if [[ "$status" =~ respawn/ ]]; then - echo "job respawning unexpectedly!" - stop - return 1 - fi - return 0 - } - ''; - jobOptions = { @@ -418,8 +272,7 @@ let }; path = mkOption { - default = [ ]; - apply = ps: "${makeSearchPath "bin" ps}:${makeSearchPath "sbin" ps}"; + default = []; description = '' Packages added to the job's PATH environment variable. Both the bin and sbin @@ -507,7 +360,7 @@ in system.build.upstart = upstart; - boot.systemd.units = + boot.systemd.services = flip mapAttrs' config.jobs (name: job: nameValuePair "${job.name}.service" job.unit);