mirror of
https://github.com/balena-io/balena-cli.git
synced 2024-12-20 14:13:07 +00:00
339 lines
13 KiB
JavaScript
339 lines
13 KiB
JavaScript
// Generated by CoffeeScript 1.12.6
|
|
|
|
/*
|
|
Copyright 2016 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;
|
|
resin = require('resin-sdk-preconfigured');
|
|
return resin.models.config.getDeviceTypes().each(function(deviceType) {
|
|
return console.log(deviceType.slug);
|
|
}).nodeify(done);
|
|
}
|
|
};
|
|
|
|
exports.register = {
|
|
signature: 'device register <application>',
|
|
description: 'register a device',
|
|
help: 'Use this command to register a device to an application.\n\nExamples:\n\n $ resin device register MyApp',
|
|
permission: 'user',
|
|
options: [
|
|
{
|
|
signature: 'uuid',
|
|
description: 'custom uuid',
|
|
parameter: 'uuid',
|
|
alias: 'u'
|
|
}
|
|
],
|
|
action: function(params, options, done) {
|
|
var Promise, resin;
|
|
Promise = require('bluebird');
|
|
resin = require('resin-sdk-preconfigured');
|
|
return resin.models.application.get(params.application).then(function(application) {
|
|
return Promise["try"](function() {
|
|
return options.uuid || resin.models.device.generateUniqueKey();
|
|
}).then(function(uuid) {
|
|
console.info("Registering to " + application.app_name + ": " + uuid);
|
|
return resin.models.device.register(application.app_name, uuid);
|
|
});
|
|
}).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 _.all([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, {
|
|
signature: 'advanced',
|
|
description: 'enable advanced configuration',
|
|
boolean: true,
|
|
alias: 'v'
|
|
}, _.assign({}, commandOptions.osVersion, {
|
|
signature: 'os-version',
|
|
parameter: 'os-version'
|
|
}), {
|
|
signature: 'drive',
|
|
description: 'the drive to write the image to, like /dev/sdb. Careful with this as you can erase your hard drive.',
|
|
parameter: 'drive',
|
|
alias: 'd'
|
|
}
|
|
],
|
|
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.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);
|
|
}
|
|
};
|