{pkgs}: {tarball, name, mainBinaryPath, serviceOptions ? {}, serviceConfig ? {}, hasErrorReporting ? false}: with pkgs.stdenv.lib; let /*serviceName = "node-${name}";*/ serviceName = "node-foo"; cfg = config.services."${serviceName}"; source = builtins.fetchTarball tarball; application = (import (pkgs.stdenv.mkDerivation { src = source; buildInputs = [ pkgs.node2nix ]; buildCommand = '' node2nix -6 --pkg-name nodejs_6_x ''; })).package; errorReporter = (import ./node-error-reporter) { inherit pkgs; }; in { imports = [ /*mkIf hasErrorReporting (errorReporter { application = application; applicationName = name; })*/ ]; options.services."${serviceName}" = { enable = mkEnableOption "${name}"; } // serviceOptions; config = mkIf cfg.enable { # FIXME: What if a username conflict occurs? users.extraUsers."${name}" = { description = "${name} Service User"; }; services."${serviceName}" = { description = "${name} Service"; wantedBy = ["multi-user.target"]; after = ["network.target"]; serviceConfig = { ExecStart = "${application}/${mainBinaryPath}"; User = name; }; } // serviceConfig; }; }