2016-01-04 03:58:51 +00:00
|
|
|
###
|
2017-06-14 21:20:15 +00:00
|
|
|
Copyright 2016-2017 Resin.io
|
2016-01-04 03:58:51 +00:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
###
|
|
|
|
|
2015-09-29 17:03:14 +00:00
|
|
|
Promise = require('bluebird')
|
2015-08-20 19:54:42 +00:00
|
|
|
|
2015-10-19 17:38:09 +00:00
|
|
|
exports.getGroupDefaults = (group) ->
|
2017-03-24 09:48:14 +00:00
|
|
|
_ = require('lodash')
|
|
|
|
|
2015-10-19 17:38:09 +00:00
|
|
|
return _.chain(group)
|
|
|
|
.get('options')
|
|
|
|
.map (question) ->
|
|
|
|
return [ question.name, question.default ]
|
2017-08-23 12:31:18 +00:00
|
|
|
.fromPairs()
|
2015-10-19 17:38:09 +00:00
|
|
|
.value()
|
|
|
|
|
2015-08-20 19:54:42 +00:00
|
|
|
exports.stateToString = (state) ->
|
2017-03-24 09:48:14 +00:00
|
|
|
_str = require('underscore.string')
|
|
|
|
chalk = require('chalk')
|
|
|
|
|
|
|
|
percentage = _str.lpad(state.percentage, 3, '0') + '%'
|
2015-08-20 19:54:42 +00:00
|
|
|
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}")
|
2015-09-29 17:03:14 +00:00
|
|
|
|
2017-03-24 09:48:14 +00:00
|
|
|
exports.sudo = (command) ->
|
|
|
|
_ = require('lodash')
|
|
|
|
os = require('os')
|
2015-10-01 17:07:53 +00:00
|
|
|
|
2015-11-12 17:30:48 +00:00
|
|
|
if os.platform() isnt 'win32'
|
2017-03-24 09:48:14 +00:00
|
|
|
console.log('If asked please type your computer password to continue')
|
2015-11-12 17:30:48 +00:00
|
|
|
|
2017-03-24 09:48:14 +00:00
|
|
|
command = _.union(_.take(process.argv, 2), command)
|
2017-03-27 09:14:55 +00:00
|
|
|
presidentExecuteAsync = Promise.promisify(require('president').execute)
|
|
|
|
return presidentExecuteAsync(command)
|
2016-09-14 17:51:50 +00:00
|
|
|
|
|
|
|
exports.getManifest = (image, deviceType) ->
|
2017-03-24 09:48:14 +00:00
|
|
|
rindle = require('rindle')
|
|
|
|
imagefs = require('resin-image-fs')
|
|
|
|
resin = require('resin-sdk-preconfigured')
|
2016-09-14 17:51:50 +00:00
|
|
|
|
|
|
|
# Attempt to read manifest from the first
|
|
|
|
# partition, but fallback to the API if
|
|
|
|
# we encounter any errors along the way.
|
|
|
|
imagefs.read
|
|
|
|
image: image
|
|
|
|
partition:
|
|
|
|
primary: 1
|
|
|
|
path: '/device-type.json'
|
|
|
|
.then(rindle.extractAsync)
|
|
|
|
.then(JSON.parse)
|
|
|
|
.catch ->
|
|
|
|
resin.models.device.getManifestBySlug(deviceType)
|
2017-03-24 09:48:14 +00:00
|
|
|
|
|
|
|
exports.osProgressHandler = (step) ->
|
|
|
|
rindle = require('rindle')
|
|
|
|
visuals = require('resin-cli-visuals')
|
|
|
|
|
|
|
|
step.on('stdout', process.stdout.write.bind(process.stdout))
|
|
|
|
step.on('stderr', process.stderr.write.bind(process.stderr))
|
|
|
|
|
|
|
|
step.on 'state', (state) ->
|
|
|
|
return if state.operation.command is 'burn'
|
|
|
|
console.log(exports.stateToString(state))
|
|
|
|
|
2017-03-28 09:09:58 +00:00
|
|
|
progressBars =
|
|
|
|
write: new visuals.Progress('Writing Device OS')
|
|
|
|
check: new visuals.Progress('Validating Device OS')
|
2017-03-24 09:48:14 +00:00
|
|
|
|
2017-03-28 09:09:58 +00:00
|
|
|
step.on 'burn', (state) ->
|
|
|
|
progressBars[state.type].update(state)
|
2017-03-24 09:48:14 +00:00
|
|
|
|
|
|
|
return rindle.wait(step)
|
2017-03-29 11:03:40 +00:00
|
|
|
|
|
|
|
exports.getAppInfo = (application) ->
|
|
|
|
resin = require('resin-sdk-preconfigured')
|
|
|
|
_ = require('lodash')
|
|
|
|
Promise.join(
|
2017-08-11 10:02:58 +00:00
|
|
|
getApplication(application),
|
2017-03-29 11:03:40 +00:00
|
|
|
resin.models.config.getDeviceTypes(),
|
|
|
|
(app, config) ->
|
|
|
|
config = _.find(config, 'slug': app.device_type)
|
|
|
|
if !config?
|
|
|
|
throw new Error('Could not read application information!')
|
|
|
|
app.arch = config.arch
|
|
|
|
return app
|
|
|
|
)
|
2017-05-11 11:34:22 +00:00
|
|
|
|
2017-08-11 10:02:58 +00:00
|
|
|
getApplication = (application) ->
|
|
|
|
resin = require('resin-sdk-preconfigured')
|
|
|
|
|
|
|
|
# Check for an app of the form `user/application`, and send
|
|
|
|
# this off to a special handler (before importing any modules)
|
|
|
|
if (match = /(\w+)\/(\w+)/.exec(application))
|
|
|
|
return resin.models.application.getAppWithOwner(match[2], match[1])
|
|
|
|
|
|
|
|
return resin.models.application.get(application)
|
|
|
|
|
2017-05-11 11:34:22 +00:00
|
|
|
# A function to reliably execute a command
|
|
|
|
# in all supported operating systems, including
|
|
|
|
# different Windows environments like `cmd.exe`
|
|
|
|
# and `Cygwin`.
|
|
|
|
exports.getSubShellCommand = (command) ->
|
|
|
|
os = require('os')
|
|
|
|
|
|
|
|
if os.platform() is 'win32'
|
|
|
|
return {
|
|
|
|
program: 'cmd.exe'
|
|
|
|
args: [ '/s', '/c', command ]
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return {
|
|
|
|
program: '/bin/sh'
|
|
|
|
args: [ '-c', command ]
|
|
|
|
}
|