UNPKG

smc-hub

Version:

CoCalc: Backend webserver component

13 lines 18.4 kB
{ "version": 3, "file": "", "sourceRoot": "", "sources": [ "/home/user/cocalc/src/smc-util-node/execute-code.coffee" ], "names": [], "mappings": "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", "sourcesContent": [ "#########################################################################\n# This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.\n# License: AGPLv3 s.t. \"Commons Clause\" – see LICENSE.md for details\n#########################################################################\n\n# Execute code in a subprocess, etc.\n\nwinston = require('winston')\nwinston.remove(winston.transports.Console)\nwinston.add(winston.transports.Console, {level: 'debug', timestamp:true, colorize:true})\n\ntemp = require('temp')\nasync = require('async')\nfs = require('fs')\nchild_process = require('child_process')\nshell_escape = require('shell-escape')\n\nmisc = require('smc-util/misc')\n\n{walltime, defaults, required} = misc\n\n{aggregate} = require('smc-util/aggregate')\n\nexports.execute_code = execute_code = aggregate (opts) ->\n opts = defaults opts,\n command : required\n args : []\n path : undefined # defaults to home directory; where code is executed from\n timeout : 10 # timeout in *seconds*\n ulimit_timeout : true # If set, use ulimit to ensure a cpu timeout -- don't use when launching a daemon!\n # This has no effect if bash not true.\n err_on_exit: true # if true, then a nonzero exit code will result in cb(error_message)\n max_output : undefined # bound on size of stdout and stderr; further output ignored\n bash : false # if true, ignore args and evaluate command as a bash command\n home : undefined\n uid : undefined\n gid : undefined\n env : undefined # if given, added to exec environment\n aggregate : undefined # if given, aggregates multiple calls with same sequence number into one -- see smc-util/aggregate; typically make this a timestamp for compiling code.\n verbose : true\n cb : undefined\n\n start_time = walltime()\n if opts.verbose\n winston.debug(\"execute_code: \\\"#{opts.command} #{opts.args.join(' ')}\\\"\")\n\n s = opts.command.split(/\\s+/g) # split on whitespace\n if opts.args.length == 0 and s.length > 1\n opts.bash = true\n else if opts.bash and opts.args.length > 0\n # Selected bash, but still passed in args.\n opts.command = shell_escape([opts.command].concat(opts.args))\n opts.args = []\n\n if not opts.home?\n opts.home = process.env.HOME\n\n if not opts.path?\n opts.path = opts.home\n else if opts.path[0] != '/'\n opts.path = opts.home + '/' + opts.path\n\n stdout = ''\n stderr = ''\n exit_code = undefined\n\n env = misc.copy(process.env)\n\n if opts.env?\n for k, v of opts.env\n env[k] = v\n\n if opts.uid?\n env.HOME = opts.home\n\n ran_code = false\n info = undefined\n\n async.series([\n (c) ->\n if not opts.bash\n c()\n return\n if opts.timeout and opts.ulimit_timeout\n # This ensures that everything involved with this\n # command really does die no matter what; it's\n # better than killing from outside, since it gets\n # all subprocesses since they inherit the limits.\n cmd = \"ulimit -t #{opts.timeout}\\n#{opts.command}\"\n else\n cmd = opts.command\n\n if opts.verbose\n winston.debug(\"execute_code: writing temporary file that contains bash program.\")\n temp.open '', (err, _info) ->\n if err\n c(err)\n else\n info = _info\n opts.command = 'bash'\n opts.args = [info.path]\n fs.writeFile(info.fd, cmd, c)\n (c) ->\n if info?\n fs.close(info.fd, c)\n else\n c()\n (c) ->\n if info?\n fs.chmod(info.path, 0o700, c)\n else\n c()\n\n (c) ->\n if opts.verbose\n winston.debug(\"Spawning the command #{opts.command} with given args #{opts.args} and timeout of #{opts.timeout}s...\")\n o = {cwd:opts.path}\n if env?\n o.env = env\n if opts.uid\n o.uid = opts.uid\n if opts.gid\n o.gid = opts.gid\n\n try\n r = child_process.spawn(opts.command, opts.args, o)\n if not r.stdout? or not r.stderr?\n # The docs/examples at https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options\n # suggest that r.stdout and r.stderr are always defined. However, this is\n # definitely NOT the case in edge cases, as we have observed.\n c(\"error creating child process -- couldn't spawn child process\")\n return\n catch e\n # Yes, spawn can cause this error if there is no memory, and there's no event! -- Error: spawn ENOMEM\n ran_code = false\n c(\"error #{misc.to_json(e)}\")\n return\n\n ran_code = true\n\n if opts.verbose\n winston.debug(\"Listen for stdout, stderr and exit events.\")\n stdout = ''\n r.stdout.on 'data', (data) ->\n data = data.toString()\n if opts.max_output?\n if stdout.length < opts.max_output\n stdout += data.slice(0,opts.max_output - stdout.length)\n else\n stdout += data\n\n r.stderr.on 'data', (data) ->\n data = data.toString()\n if opts.max_output?\n if stderr.length < opts.max_output\n stderr += data.slice(0,opts.max_output - stderr.length)\n else\n stderr += data\n\n stderr_is_done = stdout_is_done = false\n\n r.stderr.on 'end', ->\n stderr_is_done = true\n finish()\n\n r.stdout.on 'end', ->\n stdout_is_done = true\n finish()\n\n r.on 'exit', (code) ->\n exit_code = code\n finish()\n\n # This can happen, e.g., \"Error: spawn ENOMEM\" if there is no memory. Without this handler,\n # an unhandled exception gets raised, which is nasty.\n # From docs: \"Note that the exit-event may or may not fire after an error has occured. \"\n r.on 'error', (err) ->\n if not exit_code?\n exit_code = 1\n stderr += misc.to_json(err)\n # a fundamental issue, we were not running some code\n ran_code = false\n finish()\n\n callback_done = false\n finish = ->\n if stdout_is_done and stderr_is_done and exit_code?\n if opts.err_on_exit and exit_code != 0\n if not callback_done\n callback_done = true\n c(\"command '#{opts.command}' (args=#{opts.args.join(' ')}) exited with nonzero code #{exit_code} -- stderr='#{stderr}'\")\n else if not ran_code # regardless of opts.err_on_exit !\n if not callback_done\n callback_done = true\n c(\"command '#{opts.command}' (args=#{opts.args.join(' ')}) was not able to run -- stderr='#{stderr}'\")\n else\n if opts.max_output?\n if stdout.length >= opts.max_output\n stdout += \" (truncated at #{opts.max_output} characters)\"\n if stderr.length >= opts.max_output\n stderr += \" (truncated at #{opts.max_output} characters)\"\n if not callback_done\n callback_done = true\n c()\n\n if opts.timeout\n f = ->\n if r.exitCode == null\n if opts.verbose\n winston.debug(\"execute_code: subprocess did not exit after #{opts.timeout} seconds, so killing with SIGKILL\")\n try\n r.kill(\"SIGKILL\") # this does not kill the process group :-(\n catch e\n # Exceptions can happen, which left uncaught messes up calling code bigtime.\n if opts.verbose\n winston.debug(\"execute_code: r.kill raised an exception.\")\n if not callback_done\n callback_done = true\n c(\"killed command '#{opts.command} #{opts.args.join(' ')}'\")\n setTimeout(f, opts.timeout*1000)\n (c) ->\n if info?.path?\n # Do not litter:\n fs.unlink(info.path, c)\n else\n c()\n ], (err) ->\n if not exit_code?\n exit_code = 1 # don't have one due to SIGKILL\n\n # This log message is very dangerous, e.g., it could print out a secret_token to a log file.\n # So it commented out. Only include for low level debugging.\n # winston.debug(\"(time: #{walltime() - start_time}): Done running '#{opts.command} #{opts.args.join(' ')}'; resulted in stdout='#{misc.trunc(stdout,512)}', stderr='#{misc.trunc(stderr,512)}', exit_code=#{exit_code}, err=#{err}\")\n\n if opts.verbose\n winston.debug(\"finished exec of #{opts.command} (took #{walltime(start_time)}s)\")\n winston.debug(\"stdout='#{misc.trunc(stdout,512)}', stderr='#{misc.trunc(stderr,512)}', exit_code=#{exit_code}\")\n if (not opts.err_on_exit) and ran_code\n # as long as we made it to running some code, we consider this a success (that is what err_on_exit means).\n opts.cb?(false, {stdout:stdout, stderr:stderr, exit_code:exit_code})\n else\n opts.cb?(err, {stdout:stdout, stderr:stderr, exit_code:exit_code})\n )\n\n\n" ] }