balena-cli/lib/utils/helpers.coffee
Juan Cruz Viotti 445e37ccaf Call os initialize as an elevated process
Currently, the fact that `os initialize` requires elevated permissions
forced us to require calling commands that reuse it, such as `device
init` and `quickstart` with administrator permissions as well.

This ended up causing issues like saving images in the cache that belong
to root, or initializing git repositories that requires `sudo` to
commit.

The solution is to call `os initialize` as a child process preppending
`sudo` within `device init`.

Fixes: https://github.com/resin-io/resin-cli/issues/109
2015-10-01 13:07:53 -04:00

47 lines
1.4 KiB
CoffeeScript

Promise = require('bluebird')
capitano = Promise.promisifyAll(require('capitano'))
_ = require('lodash')
_.str = require('underscore.string')
child_process = require('child_process')
os = require('os')
chalk = require('chalk')
exports.getOperatingSystem = ->
platform = os.platform()
platform = 'osx' if platform is 'darwin'
return platform
exports.stateToString = (state) ->
percentage = _.str.lpad(state.percentage, 3, '0') + '%'
result = "#{chalk.blue(percentage)} #{chalk.cyan(state.operation.command)}"
switch state.operation.command
when 'copy'
return "#{result} #{state.operation.from.path} -> #{state.operation.to.path}"
when 'replace'
return "#{result} #{state.operation.file.path}, #{state.operation.copy} -> #{state.operation.replace}"
when 'run-script'
return "#{result} #{state.operation.script}"
else
throw new Error("Unsupported operation: #{state.operation.type}")
exports.waitStream = (stream) ->
return new Promise (resolve, reject) ->
stream.on('close', resolve)
stream.on('end', resolve)
stream.on('error', reject)
exports.sudo = (command) ->
# Bypass privilege elevation for Windows for now.
# We should use `windosu` in this case.
if os.platform() is 'win32'
return capitano.runAsync(command.join(' '))
command = _.union(_.take(process.argv, 2), command)
spawn = child_process.spawn 'sudo', command,
stdio: 'inherit'
return exports.waitStream(spawn)