balena-cli/lib/actions/os.coffee

95 lines
2.4 KiB
CoffeeScript
Raw Normal View History

2014-12-02 15:08:22 +00:00
_ = require('lodash')
async = require('async')
path = require('path')
mkdirp = require('mkdirp')
2015-01-08 12:04:37 +00:00
resin = require('resin-sdk')
2015-01-20 19:10:18 +00:00
ui = require('../ui')
2014-12-02 15:08:22 +00:00
exports.download =
signature: 'os download <id>'
description: 'download device OS'
help: '''
Use this command to download the device OS configured to a specific network.
Ethernet:
You can setup the device OS to use ethernet by setting the `--network` option to "ethernet".
Wifi:
You can setup the device OS to use wifi by setting the `--network` option to "wifi".
If you set "network" to "wifi", you will need to specify the `--ssid` and `--key` option as well.
2014-12-02 15:08:22 +00:00
By default, this command saved the downloaded image into a resin specific directory.
You can save it to a custom location by specifying the `--output` option.
2014-12-02 15:08:22 +00:00
Examples:
$ resin os download 91 --network ethernet
$ resin os download 91 --network wifi --ssid MyNetwork --key secreykey123
$ resin os download 91 --network ethernet --output ~/MyResinOS.zip
'''
options: [
{
signature: 'network'
parameter: 'network'
description: 'network type'
alias: 'n'
}
{
signature: 'ssid'
parameter: 'ssid'
description: 'wifi ssid, if network is wifi'
alias: 's'
}
{
signature: 'key'
parameter: 'key'
description: 'wifi key, if network is wifi'
alias: 'k'
}
{
signature: 'output'
parameter: 'output'
description: 'output file'
alias: 'o'
}
]
permission: 'user'
action: (params, options, done) ->
osParams =
network: options.network
wifiSsid: options.ssid
wifiKey: options.key
appId: params.id
2014-12-02 15:08:22 +00:00
fileName = resin.models.os.generateCacheName(osParams)
2014-12-02 15:08:22 +00:00
outputFile = options.output or path.join(resin.settings.get('directories.os'), fileName)
2014-12-02 15:08:22 +00:00
async.waterfall [
2014-12-02 15:08:22 +00:00
(callback) ->
# We need to ensure this directory exists
mkdirp path.dirname(outputFile), (error) ->
return callback(error)
(callback) ->
console.info("Destination file: #{outputFile}")
2014-12-02 15:08:22 +00:00
bar = null
received = 0
2014-12-02 15:08:22 +00:00
resin.models.os.download osParams, outputFile, callback, (state) ->
2014-12-02 15:08:22 +00:00
# TODO: Allow quieting this progress bar
2015-01-20 19:10:18 +00:00
bar ?= new ui.widgets.Progress('Downloading device OS', state.total)
return if bar.complete or not state?
bar.tick(state.received - received)
received = state.received
], (error) ->
return done(error) if error?
console.info("\nFinished downloading #{outputFile}")
return done()