balena-cli/build/actions/device.js

342 lines
14 KiB
JavaScript

// Generated by CoffeeScript 1.12.7
/*
Copyright 2016-2017 Resin.io
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.
*/
var _, commandOptions;
commandOptions = require('./command-options');
_ = require('lodash');
exports.list = {
signature: 'devices',
description: 'list all devices',
help: 'Use this command to list all devices that belong to you.\n\nYou can filter the devices by application by using the `--application` option.\n\nExamples:\n\n $ resin devices\n $ resin devices --application MyApp\n $ resin devices --app MyApp\n $ resin devices -a MyApp',
options: [commandOptions.optionalApplication],
permission: 'user',
primary: true,
action: function(params, options, done) {
var Promise, resin, visuals;
Promise = require('bluebird');
resin = require('resin-sdk-preconfigured');
visuals = require('resin-cli-visuals');
return Promise["try"](function() {
if (options.application != null) {
return resin.models.device.getAllByApplication(options.application);
}
return resin.models.device.getAll();
}).tap(function(devices) {
devices = _.map(devices, function(device) {
device.uuid = device.uuid.slice(0, 7);
return device;
});
return console.log(visuals.table.horizontal(devices, ['id', 'uuid', 'name', 'device_type', 'application_name', 'status', 'is_online', 'supervisor_version', 'os_version', 'dashboard_url']));
}).nodeify(done);
}
};
exports.info = {
signature: 'device <uuid>',
description: 'list a single device',
help: 'Use this command to show information about a single device.\n\nExamples:\n\n $ resin device 7cf02a6',
permission: 'user',
primary: true,
action: function(params, options, done) {
var resin, visuals;
resin = require('resin-sdk-preconfigured');
visuals = require('resin-cli-visuals');
return resin.models.device.get(params.uuid).then(function(device) {
return resin.models.device.getStatus(device).then(function(status) {
device.status = status;
return console.log(visuals.table.vertical(device, ["$" + device.name + "$", 'id', 'device_type', 'status', 'is_online', 'ip_address', 'application_name', 'last_seen', 'uuid', 'commit', 'supervisor_version', 'is_web_accessible', 'note', 'os_version', 'dashboard_url']));
});
}).nodeify(done);
}
};
exports.supported = {
signature: 'devices supported',
description: 'list all supported devices',
help: 'Use this command to get the list of all supported devices\n\nExamples:\n\n $ resin devices supported',
action: function(params, options, done) {
var resin, visuals;
resin = require('resin-sdk-preconfigured');
visuals = require('resin-cli-visuals');
return resin.models.config.getDeviceTypes().then(function(deviceTypes) {
return console.log(visuals.table.horizontal(deviceTypes, ['slug', 'name']));
}).nodeify(done);
}
};
exports.register = {
signature: 'device register <application>',
description: 'register a device',
help: 'Use this command to register a device to an application.\n\nNote that device api keys are only supported on ResinOS 2.0.3+\n\nExamples:\n\n $ resin device register MyApp\n $ resin device register MyApp --uuid <uuid>\n $ resin device register MyApp --uuid <uuid> --device-api-key <existingDeviceKey>',
permission: 'user',
options: [
{
signature: 'uuid',
description: 'custom uuid',
parameter: 'uuid',
alias: 'u'
}, {
signature: 'deviceApiKey',
description: 'custom device key',
parameter: 'device-api-key',
alias: 'k'
}
],
action: function(params, options, done) {
var Promise, ref, ref1, resin;
Promise = require('bluebird');
resin = require('resin-sdk-preconfigured');
return Promise.join(resin.models.application.get(params.application), (ref = options.uuid) != null ? ref : resin.models.device.generateUniqueKey(), (ref1 = options.deviceApiKey) != null ? ref1 : resin.models.device.generateUniqueKey(), function(application, uuid, deviceApiKey) {
console.info("Registering to " + application.app_name + ": " + uuid);
if (options.deviceApiKey == null) {
console.info("Using generated device api key: " + deviceApiKey);
} else {
console.info('Using provided device api key');
}
return resin.models.device.register(application.app_name, uuid, deviceApiKey);
}).get('uuid').nodeify(done);
}
};
exports.remove = {
signature: 'device rm <uuid>',
description: 'remove a device',
help: 'Use this command to remove a device from resin.io.\n\nNotice this command asks for confirmation interactively.\nYou can avoid this by passing the `--yes` boolean option.\n\nExamples:\n\n $ resin device rm 7cf02a6\n $ resin device rm 7cf02a6 --yes',
options: [commandOptions.yes],
permission: 'user',
action: function(params, options, done) {
var patterns, resin;
resin = require('resin-sdk-preconfigured');
patterns = require('../utils/patterns');
return patterns.confirm(options.yes, 'Are you sure you want to delete the device?').then(function() {
return resin.models.device.remove(params.uuid);
}).nodeify(done);
}
};
exports.identify = {
signature: 'device identify <uuid>',
description: 'identify a device with a UUID',
help: 'Use this command to identify a device.\n\nIn the Raspberry Pi, the ACT led is blinked several times.\n\nExamples:\n\n $ resin device identify 23c73a1',
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.identify(params.uuid).nodeify(done);
}
};
exports.reboot = {
signature: 'device reboot <uuid>',
description: 'restart a device',
help: 'Use this command to remotely reboot a device\n\nExamples:\n\n $ resin device reboot 23c73a1',
options: [commandOptions.forceUpdateLock],
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.reboot(params.uuid, options).nodeify(done);
}
};
exports.shutdown = {
signature: 'device shutdown <uuid>',
description: 'shutdown a device',
help: 'Use this command to remotely shutdown a device\n\nExamples:\n\n $ resin device shutdown 23c73a1',
options: [commandOptions.forceUpdateLock],
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.shutdown(params.uuid, options).nodeify(done);
}
};
exports.enableDeviceUrl = {
signature: 'device public-url enable <uuid>',
description: 'enable public URL for a device',
help: 'Use this command to enable public URL for a device\n\nExamples:\n\n $ resin device public-url enable 23c73a1',
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.enableDeviceUrl(params.uuid).nodeify(done);
}
};
exports.disableDeviceUrl = {
signature: 'device public-url disable <uuid>',
description: 'disable public URL for a device',
help: 'Use this command to disable public URL for a device\n\nExamples:\n\n $ resin device public-url disable 23c73a1',
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.disableDeviceUrl(params.uuid).nodeify(done);
}
};
exports.getDeviceUrl = {
signature: 'device public-url <uuid>',
description: 'gets the public URL of a device',
help: 'Use this command to get the public URL of a device\n\nExamples:\n\n $ resin device public-url 23c73a1',
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.getDeviceUrl(params.uuid).then(function(url) {
return console.log(url);
}).nodeify(done);
}
};
exports.hasDeviceUrl = {
signature: 'device public-url status <uuid>',
description: 'Returns true if public URL is enabled for a device',
help: 'Use this command to determine if public URL is enabled for a device\n\nExamples:\n\n $ resin device public-url status 23c73a1',
permission: 'user',
action: function(params, options, done) {
var resin;
resin = require('resin-sdk-preconfigured');
return resin.models.device.hasDeviceUrl(params.uuid).then(function(hasDeviceUrl) {
return console.log(hasDeviceUrl);
}).nodeify(done);
}
};
exports.rename = {
signature: 'device rename <uuid> [newName]',
description: 'rename a resin device',
help: 'Use this command to rename a device.\n\nIf you omit the name, you\'ll get asked for it interactively.\n\nExamples:\n\n $ resin device rename 7cf02a6\n $ resin device rename 7cf02a6 MyPi',
permission: 'user',
action: function(params, options, done) {
var Promise, form, resin;
Promise = require('bluebird');
resin = require('resin-sdk-preconfigured');
form = require('resin-cli-form');
return Promise["try"](function() {
if (!_.isEmpty(params.newName)) {
return params.newName;
}
return form.ask({
message: 'How do you want to name this device?',
type: 'input'
});
}).then(_.partial(resin.models.device.rename, params.uuid)).nodeify(done);
}
};
exports.move = {
signature: 'device move <uuid>',
description: 'move a device to another application',
help: 'Use this command to move a device to another application you own.\n\nIf you omit the application, you\'ll get asked for it interactively.\n\nExamples:\n\n $ resin device move 7cf02a6\n $ resin device move 7cf02a6 --application MyNewApp',
permission: 'user',
options: [commandOptions.optionalApplication],
action: function(params, options, done) {
var patterns, resin;
resin = require('resin-sdk-preconfigured');
patterns = require('../utils/patterns');
return resin.models.device.get(params.uuid).then(function(device) {
return options.application || patterns.selectApplication(function(application) {
return _.every([application.device_type === device.device_type, device.application_name !== application.app_name]);
});
}).tap(function(application) {
return resin.models.device.move(params.uuid, application);
}).then(function(application) {
return console.info(params.uuid + " was moved to " + application);
}).nodeify(done);
}
};
exports.init = {
signature: 'device init',
description: 'initialise a device with resinOS',
help: 'Use this command to download the OS image of a certain application and write it to an SD Card.\n\nNotice this command may ask for confirmation interactively.\nYou can avoid this by passing the `--yes` boolean option.\n\nExamples:\n\n $ resin device init\n $ resin device init --application MyApp',
options: [
commandOptions.optionalApplication, commandOptions.yes, commandOptions.advancedConfig, _.assign({}, commandOptions.osVersion, {
signature: 'os-version',
parameter: 'os-version'
}), commandOptions.drive, {
signature: 'config',
description: 'path to the config JSON file, see `resin os build-config`',
parameter: 'config'
}
],
permission: 'user',
action: function(params, options, done) {
var Promise, capitanoRunAsync, helpers, patterns, resin, rimraf, tmp, tmpNameAsync;
Promise = require('bluebird');
capitanoRunAsync = Promise.promisify(require('capitano').run);
rimraf = Promise.promisify(require('rimraf'));
tmp = require('tmp');
tmpNameAsync = Promise.promisify(tmp.tmpName);
tmp.setGracefulCleanup();
resin = require('resin-sdk-preconfigured');
helpers = require('../utils/helpers');
patterns = require('../utils/patterns');
return Promise["try"](function() {
if (options.application != null) {
return options.application;
}
return patterns.selectApplication();
}).then(resin.models.application.get).then(function(application) {
var download;
download = function() {
return tmpNameAsync().then(function(tempPath) {
var osVersion;
osVersion = options['os-version'] || 'default';
return capitanoRunAsync("os download " + application.device_type + " --output '" + tempPath + "' --version " + osVersion);
}).disposer(function(tempPath) {
return rimraf(tempPath);
});
};
return Promise.using(download(), function(tempPath) {
return capitanoRunAsync("device register " + application.app_name).then(resin.models.device.get).tap(function(device) {
var configureCommand;
configureCommand = "os configure '" + tempPath + "' " + device.uuid;
if (options.config) {
configureCommand += " --config '" + options.config + "'";
} else if (options.advanced) {
configureCommand += ' --advanced';
}
return capitanoRunAsync(configureCommand).then(function() {
var osInitCommand;
osInitCommand = "os initialize '" + tempPath + "' --type " + application.device_type;
if (options.yes) {
osInitCommand += ' --yes';
}
if (options.drive) {
osInitCommand += " --drive " + options.drive;
}
return capitanoRunAsync(osInitCommand);
})["catch"](function(error) {
return resin.models.device.remove(device.uuid)["finally"](function() {
throw error;
});
});
});
}).then(function(device) {
console.log('Done');
return device.uuid;
});
}).nodeify(done);
}
};