balena-cli 19.1.1 → 19.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/build/app.js +1 -1
- package/build/app.js.map +1 -1
- package/build/commands/api-key/generate.d.ts +1 -1
- package/build/commands/api-key/generate.js +1 -2
- package/build/commands/api-key/generate.js.map +1 -1
- package/build/commands/api-key/revoke.d.ts +1 -1
- package/build/commands/api-key/revoke.js +1 -2
- package/build/commands/api-key/revoke.js.map +1 -1
- package/build/commands/api-keys/index.d.ts +1 -1
- package/build/commands/api-keys/index.js +1 -2
- package/build/commands/api-keys/index.js.map +1 -1
- package/build/commands/app/create.d.ts +1 -1
- package/build/commands/app/create.js +1 -2
- package/build/commands/app/create.js.map +1 -1
- package/build/commands/block/create.d.ts +1 -1
- package/build/commands/block/create.js +1 -2
- package/build/commands/block/create.js.map +1 -1
- package/build/commands/build/index.d.ts +1 -1
- package/build/commands/build/index.js +5 -4
- package/build/commands/build/index.js.map +1 -1
- package/build/commands/config/generate.d.ts +1 -1
- package/build/commands/config/generate.js +1 -2
- package/build/commands/config/generate.js.map +1 -1
- package/build/commands/config/inject.d.ts +1 -1
- package/build/commands/config/inject.js +1 -2
- package/build/commands/config/inject.js.map +1 -1
- package/build/commands/config/read.d.ts +1 -1
- package/build/commands/config/read.js +2 -2
- package/build/commands/config/read.js.map +1 -1
- package/build/commands/config/reconfigure.d.ts +1 -1
- package/build/commands/config/reconfigure.js +1 -2
- package/build/commands/config/reconfigure.js.map +1 -1
- package/build/commands/config/write.d.ts +1 -1
- package/build/commands/config/write.js +1 -2
- package/build/commands/config/write.js.map +1 -1
- package/build/commands/deploy/index.d.ts +1 -1
- package/build/commands/deploy/index.js +3 -3
- package/build/commands/deploy/index.js.map +1 -1
- package/build/commands/device/deactivate.d.ts +1 -1
- package/build/commands/device/deactivate.js +1 -2
- package/build/commands/device/deactivate.js.map +1 -1
- package/build/commands/device/identify.d.ts +1 -1
- package/build/commands/device/identify.js +1 -2
- package/build/commands/device/identify.js.map +1 -1
- package/build/commands/device/index.d.ts +1 -1
- package/build/commands/device/index.js +1 -2
- package/build/commands/device/index.js.map +1 -1
- package/build/commands/device/init.d.ts +1 -1
- package/build/commands/device/init.js +3 -3
- package/build/commands/device/init.js.map +1 -1
- package/build/commands/device/list.d.ts +1 -1
- package/build/commands/device/list.js +2 -2
- package/build/commands/device/list.js.map +1 -1
- package/build/commands/device/local-mode.d.ts +1 -1
- package/build/commands/device/local-mode.js +1 -2
- package/build/commands/device/local-mode.js.map +1 -1
- package/build/commands/device/move.d.ts +1 -1
- package/build/commands/device/move.js +1 -2
- package/build/commands/device/move.js.map +1 -1
- package/build/commands/device/os-update.d.ts +1 -1
- package/build/commands/device/os-update.js +1 -2
- package/build/commands/device/os-update.js.map +1 -1
- package/build/commands/device/pin.d.ts +1 -1
- package/build/commands/device/pin.js +1 -2
- package/build/commands/device/pin.js.map +1 -1
- package/build/commands/device/public-url.d.ts +1 -1
- package/build/commands/device/public-url.js +1 -2
- package/build/commands/device/public-url.js.map +1 -1
- package/build/commands/device/purge.d.ts +1 -1
- package/build/commands/device/purge.js +1 -2
- package/build/commands/device/purge.js.map +1 -1
- package/build/commands/device/reboot.d.ts +1 -1
- package/build/commands/device/reboot.js +1 -2
- package/build/commands/device/reboot.js.map +1 -1
- package/build/commands/device/register.d.ts +1 -1
- package/build/commands/device/register.js +1 -2
- package/build/commands/device/register.js.map +1 -1
- package/build/commands/device/rename.d.ts +1 -1
- package/build/commands/device/rename.js +1 -2
- package/build/commands/device/rename.js.map +1 -1
- package/build/commands/device/restart.d.ts +1 -1
- package/build/commands/device/restart.js +1 -2
- package/build/commands/device/restart.js.map +1 -1
- package/build/commands/device/rm.d.ts +1 -1
- package/build/commands/device/rm.js +1 -2
- package/build/commands/device/rm.js.map +1 -1
- package/build/commands/device/shutdown.d.ts +1 -1
- package/build/commands/device/shutdown.js +1 -2
- package/build/commands/device/shutdown.js.map +1 -1
- package/build/commands/device/start-service.d.ts +1 -1
- package/build/commands/device/start-service.js +1 -2
- package/build/commands/device/start-service.js.map +1 -1
- package/build/commands/device/stop-service.d.ts +1 -1
- package/build/commands/device/stop-service.js +1 -2
- package/build/commands/device/stop-service.js.map +1 -1
- package/build/commands/device/track-fleet.d.ts +1 -1
- package/build/commands/device/track-fleet.js +1 -2
- package/build/commands/device/track-fleet.js.map +1 -1
- package/build/commands/devices/supported.d.ts +1 -1
- package/build/commands/devices/supported.js +1 -2
- package/build/commands/devices/supported.js.map +1 -1
- package/build/commands/env/add.d.ts +1 -1
- package/build/commands/env/add.js +3 -3
- package/build/commands/env/add.js.map +1 -1
- package/build/commands/env/rename.d.ts +1 -1
- package/build/commands/env/rename.js +3 -3
- package/build/commands/env/rename.js.map +1 -1
- package/build/commands/env/rm.d.ts +1 -1
- package/build/commands/env/rm.js +3 -3
- package/build/commands/env/rm.js.map +1 -1
- package/build/commands/envs/index.d.ts +1 -1
- package/build/commands/envs/index.js +3 -3
- package/build/commands/envs/index.js.map +1 -1
- package/build/commands/fleet/create.d.ts +1 -1
- package/build/commands/fleet/create.js +1 -2
- package/build/commands/fleet/create.js.map +1 -1
- package/build/commands/fleet/index.d.ts +1 -1
- package/build/commands/fleet/index.js +1 -2
- package/build/commands/fleet/index.js.map +1 -1
- package/build/commands/fleet/pin.d.ts +1 -1
- package/build/commands/fleet/pin.js +1 -2
- package/build/commands/fleet/pin.js.map +1 -1
- package/build/commands/fleet/purge.d.ts +1 -1
- package/build/commands/fleet/purge.js +2 -2
- package/build/commands/fleet/purge.js.map +1 -1
- package/build/commands/fleet/rename.d.ts +1 -1
- package/build/commands/fleet/rename.js +1 -2
- package/build/commands/fleet/rename.js.map +1 -1
- package/build/commands/fleet/restart.d.ts +1 -1
- package/build/commands/fleet/restart.js +2 -2
- package/build/commands/fleet/restart.js.map +1 -1
- package/build/commands/fleet/rm.d.ts +1 -1
- package/build/commands/fleet/rm.js +2 -2
- package/build/commands/fleet/rm.js.map +1 -1
- package/build/commands/fleet/track-latest.d.ts +1 -1
- package/build/commands/fleet/track-latest.js +1 -2
- package/build/commands/fleet/track-latest.js.map +1 -1
- package/build/commands/fleets/index.d.ts +1 -1
- package/build/commands/fleets/index.js +2 -2
- package/build/commands/fleets/index.js.map +1 -1
- package/build/commands/internal/osinit.d.ts +1 -1
- package/build/commands/internal/osinit.js +1 -2
- package/build/commands/internal/osinit.js.map +1 -1
- package/build/commands/join/index.d.ts +1 -1
- package/build/commands/join/index.js +3 -3
- package/build/commands/join/index.js.map +1 -1
- package/build/commands/key/add.d.ts +1 -2
- package/build/commands/key/add.js +1 -6
- package/build/commands/key/add.js.map +1 -1
- package/build/commands/key/index.d.ts +1 -1
- package/build/commands/key/index.js +1 -2
- package/build/commands/key/index.js.map +1 -1
- package/build/commands/key/rm.d.ts +1 -1
- package/build/commands/key/rm.js +1 -2
- package/build/commands/key/rm.js.map +1 -1
- package/build/commands/keys/index.d.ts +1 -1
- package/build/commands/keys/index.js +2 -2
- package/build/commands/keys/index.js.map +1 -1
- package/build/commands/leave/index.d.ts +1 -1
- package/build/commands/leave/index.js +3 -3
- package/build/commands/leave/index.js.map +1 -1
- package/build/commands/local/configure.d.ts +1 -1
- package/build/commands/local/configure.js +1 -2
- package/build/commands/local/configure.js.map +1 -1
- package/build/commands/local/flash.d.ts +1 -1
- package/build/commands/local/flash.js +1 -2
- package/build/commands/local/flash.js.map +1 -1
- package/build/commands/login/index.d.ts +1 -1
- package/build/commands/login/index.js +1 -2
- package/build/commands/login/index.js.map +1 -1
- package/build/commands/logout/index.d.ts +1 -1
- package/build/commands/logout/index.js +2 -2
- package/build/commands/logout/index.js.map +1 -1
- package/build/commands/logs/index.d.ts +1 -1
- package/build/commands/logs/index.js +3 -3
- package/build/commands/logs/index.js.map +1 -1
- package/build/commands/notes/index.d.ts +1 -2
- package/build/commands/notes/index.js +4 -6
- package/build/commands/notes/index.js.map +1 -1
- package/build/commands/orgs/index.d.ts +1 -1
- package/build/commands/orgs/index.js +2 -2
- package/build/commands/orgs/index.js.map +1 -1
- package/build/commands/os/build-config.d.ts +1 -1
- package/build/commands/os/build-config.js +1 -2
- package/build/commands/os/build-config.js.map +1 -1
- package/build/commands/os/configure.d.ts +1 -1
- package/build/commands/os/configure.js +3 -3
- package/build/commands/os/configure.js.map +1 -1
- package/build/commands/os/download.d.ts +1 -1
- package/build/commands/os/download.js +3 -3
- package/build/commands/os/download.js.map +1 -1
- package/build/commands/os/initialize.d.ts +1 -1
- package/build/commands/os/initialize.js +1 -2
- package/build/commands/os/initialize.js.map +1 -1
- package/build/commands/os/versions.d.ts +1 -1
- package/build/commands/os/versions.js +1 -2
- package/build/commands/os/versions.js.map +1 -1
- package/build/commands/preload/index.d.ts +1 -1
- package/build/commands/preload/index.js +1 -2
- package/build/commands/preload/index.js.map +1 -1
- package/build/commands/push/index.d.ts +1 -1
- package/build/commands/push/index.js +5 -4
- package/build/commands/push/index.js.map +1 -1
- package/build/commands/release/finalize.d.ts +1 -1
- package/build/commands/release/finalize.js +2 -2
- package/build/commands/release/finalize.js.map +1 -1
- package/build/commands/release/index.d.ts +1 -2
- package/build/commands/release/index.js +1 -2
- package/build/commands/release/index.js.map +1 -1
- package/build/commands/release/invalidate.d.ts +1 -1
- package/build/commands/release/invalidate.js +2 -2
- package/build/commands/release/invalidate.js.map +1 -1
- package/build/commands/release/validate.d.ts +1 -1
- package/build/commands/release/validate.js +2 -2
- package/build/commands/release/validate.js.map +1 -1
- package/build/commands/releases/index.d.ts +1 -1
- package/build/commands/releases/index.js +1 -2
- package/build/commands/releases/index.js.map +1 -1
- package/build/commands/scan/index.d.ts +1 -1
- package/build/commands/scan/index.js +1 -2
- package/build/commands/scan/index.js.map +1 -1
- package/build/commands/settings/index.d.ts +1 -1
- package/build/commands/settings/index.js +2 -2
- package/build/commands/settings/index.js.map +1 -1
- package/build/commands/ssh/index.d.ts +1 -1
- package/build/commands/ssh/index.js +4 -5
- package/build/commands/ssh/index.js.map +1 -1
- package/build/commands/support/index.d.ts +1 -1
- package/build/commands/support/index.js +1 -2
- package/build/commands/support/index.js.map +1 -1
- package/build/commands/tag/rm.d.ts +1 -1
- package/build/commands/tag/rm.js +1 -2
- package/build/commands/tag/rm.js.map +1 -1
- package/build/commands/tag/set.d.ts +1 -1
- package/build/commands/tag/set.js +1 -2
- package/build/commands/tag/set.js.map +1 -1
- package/build/commands/tags/index.d.ts +1 -1
- package/build/commands/tags/index.js +2 -2
- package/build/commands/tags/index.js.map +1 -1
- package/build/commands/tunnel/index.d.ts +1 -1
- package/build/commands/tunnel/index.js +3 -3
- package/build/commands/tunnel/index.js.map +1 -1
- package/build/commands/util/available-drives.d.ts +1 -1
- package/build/commands/util/available-drives.js +2 -2
- package/build/commands/util/available-drives.js.map +1 -1
- package/build/commands/version/index.d.ts +1 -1
- package/build/commands/version/index.js +1 -2
- package/build/commands/version/index.js.map +1 -1
- package/build/commands/whoami/index.d.ts +1 -1
- package/build/commands/whoami/index.js +2 -2
- package/build/commands/whoami/index.js.map +1 -1
- package/build/hooks/{prerun/track.d.ts → prerun.d.ts} +1 -1
- package/build/hooks/prerun.js +42 -0
- package/build/hooks/prerun.js.map +1 -0
- package/build/utils/patterns.d.ts +2 -0
- package/build/utils/patterns.js +16 -0
- package/build/utils/patterns.js.map +1 -1
- package/npm-shrinkwrap.json +2 -14
- package/oclif.manifest.json +9 -332
- package/package.json +3 -4
- package/src/app.ts +1 -1
- package/src/commands/api-key/generate.ts +1 -2
- package/src/commands/api-key/revoke.ts +1 -2
- package/src/commands/api-keys/index.ts +1 -2
- package/src/commands/app/create.ts +1 -3
- package/src/commands/block/create.ts +1 -3
- package/src/commands/build/index.ts +6 -4
- package/src/commands/config/generate.ts +1 -2
- package/src/commands/config/inject.ts +1 -2
- package/src/commands/config/read.ts +1 -1
- package/src/commands/config/reconfigure.ts +1 -2
- package/src/commands/config/write.ts +1 -2
- package/src/commands/deploy/index.ts +4 -4
- package/src/commands/device/deactivate.ts +1 -2
- package/src/commands/device/identify.ts +1 -2
- package/src/commands/device/index.ts +1 -2
- package/src/commands/device/init.ts +3 -3
- package/src/commands/device/list.ts +1 -1
- package/src/commands/device/local-mode.ts +1 -2
- package/src/commands/device/move.ts +1 -2
- package/src/commands/device/os-update.ts +1 -2
- package/src/commands/device/pin.ts +1 -2
- package/src/commands/device/public-url.ts +1 -2
- package/src/commands/device/purge.ts +1 -2
- package/src/commands/device/reboot.ts +1 -2
- package/src/commands/device/register.ts +1 -2
- package/src/commands/device/rename.ts +1 -2
- package/src/commands/device/restart.ts +1 -2
- package/src/commands/device/rm.ts +1 -2
- package/src/commands/device/shutdown.ts +1 -2
- package/src/commands/device/start-service.ts +1 -2
- package/src/commands/device/stop-service.ts +1 -2
- package/src/commands/device/track-fleet.ts +1 -2
- package/src/commands/devices/supported.ts +1 -3
- package/src/commands/env/add.ts +4 -3
- package/src/commands/env/rename.ts +4 -4
- package/src/commands/env/rm.ts +4 -4
- package/src/commands/envs/index.ts +4 -3
- package/src/commands/fleet/create.ts +1 -3
- package/src/commands/fleet/index.ts +1 -3
- package/src/commands/fleet/pin.ts +1 -2
- package/src/commands/fleet/purge.ts +1 -1
- package/src/commands/fleet/rename.ts +1 -3
- package/src/commands/fleet/restart.ts +1 -1
- package/src/commands/fleet/rm.ts +1 -1
- package/src/commands/fleet/track-latest.ts +1 -2
- package/src/commands/fleets/index.ts +1 -2
- package/src/commands/internal/osinit.ts +1 -2
- package/src/commands/join/index.ts +3 -3
- package/src/commands/key/add.ts +1 -6
- package/src/commands/key/index.ts +1 -2
- package/src/commands/key/rm.ts +1 -2
- package/src/commands/keys/index.ts +1 -1
- package/src/commands/leave/index.ts +3 -3
- package/src/commands/local/configure.ts +1 -2
- package/src/commands/local/flash.ts +1 -2
- package/src/commands/login/index.ts +1 -2
- package/src/commands/logout/index.ts +1 -1
- package/src/commands/logs/index.ts +3 -3
- package/src/commands/notes/index.ts +3 -8
- package/src/commands/orgs/index.ts +1 -1
- package/src/commands/os/build-config.ts +1 -2
- package/src/commands/os/configure.ts +4 -3
- package/src/commands/os/download.ts +3 -3
- package/src/commands/os/initialize.ts +1 -2
- package/src/commands/os/versions.ts +1 -2
- package/src/commands/preload/index.ts +1 -3
- package/src/commands/push/index.ts +7 -4
- package/src/commands/release/finalize.ts +1 -1
- package/src/commands/release/index.ts +1 -2
- package/src/commands/release/invalidate.ts +1 -1
- package/src/commands/release/validate.ts +1 -1
- package/src/commands/releases/index.ts +1 -2
- package/src/commands/scan/index.ts +1 -2
- package/src/commands/settings/index.ts +1 -1
- package/src/commands/ssh/index.ts +8 -5
- package/src/commands/support/index.ts +1 -2
- package/src/commands/tag/rm.ts +1 -2
- package/src/commands/tag/set.ts +1 -2
- package/src/commands/tags/index.ts +1 -1
- package/src/commands/tunnel/index.ts +4 -3
- package/src/commands/util/available-drives.ts +1 -1
- package/src/commands/version/index.ts +1 -2
- package/src/commands/whoami/index.ts +1 -1
- package/src/hooks/prerun.ts +119 -0
- package/src/utils/patterns.ts +41 -1
- package/build/command.d.ts +0 -16
- package/build/command.js +0 -57
- package/build/command.js.map +0 -1
- package/build/hooks/prerun/track.js +0 -14
- package/build/hooks/prerun/track.js.map +0 -1
- package/src/command.ts +0 -170
- package/src/hooks/prerun/track.ts +0 -44
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2020 Balena Ltd.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
type Hook,
|
|
20
|
+
type Command,
|
|
21
|
+
// ux
|
|
22
|
+
} from '@oclif/core';
|
|
23
|
+
import { InsufficientPrivilegesError } from '../errors';
|
|
24
|
+
import { checkLoggedIn, checkNotUsingOfflineMode } from '../utils/patterns';
|
|
25
|
+
|
|
26
|
+
let trackResolve: (result: Promise<any>) => void;
|
|
27
|
+
|
|
28
|
+
// note: trackPromise is subject to a Bluebird.timeout, defined in events.ts
|
|
29
|
+
export const trackPromise = new Promise((resolve) => {
|
|
30
|
+
trackResolve = resolve;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Throw InsufficientPrivilegesError if not root on Mac/Linux
|
|
35
|
+
* or non-Administrator on Windows.
|
|
36
|
+
*
|
|
37
|
+
* Called automatically if `root=true`.
|
|
38
|
+
* Can be called explicitly by command implementation, if e.g.:
|
|
39
|
+
* - check should only be done conditionally
|
|
40
|
+
* - other code needs to execute before check
|
|
41
|
+
*/
|
|
42
|
+
const checkElevatedPrivileges = async () => {
|
|
43
|
+
const isElevated = await (await import('is-elevated'))();
|
|
44
|
+
if (!isElevated) {
|
|
45
|
+
throw new InsufficientPrivilegesError(
|
|
46
|
+
'You need root/admin privileges to run this command',
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Require elevated privileges to run.
|
|
53
|
+
* When set to true, command will exit with an error
|
|
54
|
+
* if executed without root on Mac/Linux
|
|
55
|
+
* or if executed by non-Administrator on Windows.
|
|
56
|
+
*/
|
|
57
|
+
const DEFAULT_ROOT = false;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Require authentication to run.
|
|
61
|
+
* When set to true, command will exit with an error
|
|
62
|
+
* if user is not already logged in.
|
|
63
|
+
*/
|
|
64
|
+
const DEFAULT_AUTHENTICATED = false;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Require an internet connection to run.
|
|
68
|
+
* When set to true, command will exit with an error
|
|
69
|
+
* if user is running in offline mode (BALENARC_OFFLINE_MODE).
|
|
70
|
+
*/
|
|
71
|
+
const DEFAULT_OFFLINE_COMPATIBLE = false;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* This is an oclif 'prerun' hook. This hook runs after the command line is
|
|
75
|
+
* parsed by oclif, but before the command's run() function is called.
|
|
76
|
+
* See: https://oclif.io/docs/hooks
|
|
77
|
+
*
|
|
78
|
+
* This hook is used to track CLI command signatures (usage analytics).
|
|
79
|
+
* A command signature is something like "env add NAME [VALUE]". That's
|
|
80
|
+
* literally so: 'NAME' and 'VALUE' are NOT replaced with actual values.
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
const hook: Hook<'prerun'> = async function (options) {
|
|
84
|
+
try {
|
|
85
|
+
if (
|
|
86
|
+
(options.Command as Command.Class & { root: boolean }).root ??
|
|
87
|
+
DEFAULT_ROOT
|
|
88
|
+
) {
|
|
89
|
+
await checkElevatedPrivileges();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (
|
|
93
|
+
(options.Command as Command.Class & { authenticated: boolean })
|
|
94
|
+
.authenticated ??
|
|
95
|
+
DEFAULT_AUTHENTICATED
|
|
96
|
+
) {
|
|
97
|
+
await checkLoggedIn();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (
|
|
101
|
+
!(
|
|
102
|
+
(options.Command as Command.Class & { offlineCompatible: boolean })
|
|
103
|
+
.offlineCompatible ?? DEFAULT_OFFLINE_COMPATIBLE
|
|
104
|
+
)
|
|
105
|
+
) {
|
|
106
|
+
await checkNotUsingOfflineMode();
|
|
107
|
+
}
|
|
108
|
+
} catch (error) {
|
|
109
|
+
this.error(error);
|
|
110
|
+
}
|
|
111
|
+
const events = await import('../events');
|
|
112
|
+
const cmd = options.Command.id;
|
|
113
|
+
|
|
114
|
+
// Intentionally do not await for the track promise here, in order to
|
|
115
|
+
// run the command tracking and the command itself in parallel.
|
|
116
|
+
trackResolve(events.trackCommand(cmd));
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export default hook;
|
package/src/utils/patterns.ts
CHANGED
|
@@ -24,7 +24,12 @@ import type {
|
|
|
24
24
|
PineTypedResult,
|
|
25
25
|
} from 'balena-sdk';
|
|
26
26
|
|
|
27
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
instanceOf,
|
|
29
|
+
NotLoggedInError,
|
|
30
|
+
ExpectedError,
|
|
31
|
+
NotAvailableInOfflineModeError,
|
|
32
|
+
} from '../errors';
|
|
28
33
|
import { getBalenaSdk, getVisuals, stripIndent, getCliForm } from './lazy';
|
|
29
34
|
import validation = require('./validation');
|
|
30
35
|
import { delay } from './helpers';
|
|
@@ -89,6 +94,41 @@ export async function checkLoggedIn(): Promise<void> {
|
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Throw NotLoggedInError if not logged in when condition true.
|
|
99
|
+
*
|
|
100
|
+
* @param {boolean} doCheck - will check if true.
|
|
101
|
+
* @throws {NotLoggedInError}
|
|
102
|
+
*/
|
|
103
|
+
export const checkLoggedInIf = async (doCheck: boolean) => {
|
|
104
|
+
if (doCheck) {
|
|
105
|
+
await checkLoggedIn();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Throw NotAvailableInOfflineModeError if in offline mode.
|
|
111
|
+
*
|
|
112
|
+
* Called automatically if `onlineOnly=true`.
|
|
113
|
+
* Can be called explicitly by command implementation, if e.g.:
|
|
114
|
+
* - check should only be done conditionally
|
|
115
|
+
* - other code needs to execute before check
|
|
116
|
+
*
|
|
117
|
+
* Note, currently public to allow use outside of derived commands
|
|
118
|
+
* (as some command implementations require this. Can be made protected
|
|
119
|
+
* if this changes).
|
|
120
|
+
*
|
|
121
|
+
* @throws {NotAvailableInOfflineModeError}
|
|
122
|
+
*/
|
|
123
|
+
export const checkNotUsingOfflineMode = async () => {
|
|
124
|
+
if (process.env.BALENARC_OFFLINE_MODE) {
|
|
125
|
+
throw new NotAvailableInOfflineModeError(stripIndent`
|
|
126
|
+
This command requires an internet connection, and cannot be used in offline mode.
|
|
127
|
+
To leave offline mode, unset the BALENARC_OFFLINE_MODE environment variable.
|
|
128
|
+
`);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
92
132
|
export function askLoginType() {
|
|
93
133
|
return getCliForm().ask<'web' | 'credentials' | 'token' | 'register'>({
|
|
94
134
|
message: 'How would you like to login?',
|
package/build/command.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Command } from '@oclif/core';
|
|
2
|
-
export default abstract class BalenaCommand extends Command {
|
|
3
|
-
static primary: boolean;
|
|
4
|
-
static root: boolean;
|
|
5
|
-
static authenticated: boolean;
|
|
6
|
-
static offlineCompatible: boolean;
|
|
7
|
-
static readStdin: boolean;
|
|
8
|
-
stdin: string;
|
|
9
|
-
protected static checkElevatedPrivileges(): Promise<void>;
|
|
10
|
-
static checkLoggedIn(): Promise<void>;
|
|
11
|
-
static checkLoggedInIf(doCheck: boolean): Promise<void>;
|
|
12
|
-
static checkNotUsingOfflineMode(): void;
|
|
13
|
-
protected getStdin(): Promise<void>;
|
|
14
|
-
protected static getLogger(): Promise<import("./utils/logger")>;
|
|
15
|
-
protected init(): Promise<void>;
|
|
16
|
-
}
|
package/build/command.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const core_1 = require("@oclif/core");
|
|
4
|
-
const errors_1 = require("./errors");
|
|
5
|
-
const lazy_1 = require("./utils/lazy");
|
|
6
|
-
class BalenaCommand extends core_1.Command {
|
|
7
|
-
static async checkElevatedPrivileges() {
|
|
8
|
-
const isElevated = await (await Promise.resolve().then(() => require('is-elevated')))();
|
|
9
|
-
if (!isElevated) {
|
|
10
|
-
throw new errors_1.InsufficientPrivilegesError('You need root/admin privileges to run this command');
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
static async checkLoggedIn() {
|
|
14
|
-
await (await Promise.resolve().then(() => require('./utils/patterns'))).checkLoggedIn();
|
|
15
|
-
}
|
|
16
|
-
static async checkLoggedInIf(doCheck) {
|
|
17
|
-
if (doCheck) {
|
|
18
|
-
await this.checkLoggedIn();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
static checkNotUsingOfflineMode() {
|
|
22
|
-
if (process.env.BALENARC_OFFLINE_MODE) {
|
|
23
|
-
throw new errors_1.NotAvailableInOfflineModeError((0, lazy_1.stripIndent) `
|
|
24
|
-
This command requires an internet connection, and cannot be used in offline mode.
|
|
25
|
-
To leave offline mode, unset the BALENARC_OFFLINE_MODE environment variable.
|
|
26
|
-
`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async getStdin() {
|
|
30
|
-
this.stdin = await (await Promise.resolve().then(() => require('get-stdin')))();
|
|
31
|
-
}
|
|
32
|
-
static async getLogger() {
|
|
33
|
-
return (await Promise.resolve().then(() => require('./utils/logger'))).getLogger();
|
|
34
|
-
}
|
|
35
|
-
async init() {
|
|
36
|
-
const ctr = this.constructor;
|
|
37
|
-
if (ctr.root) {
|
|
38
|
-
await BalenaCommand.checkElevatedPrivileges();
|
|
39
|
-
}
|
|
40
|
-
if (ctr.authenticated) {
|
|
41
|
-
await BalenaCommand.checkLoggedIn();
|
|
42
|
-
}
|
|
43
|
-
if (!ctr.offlineCompatible) {
|
|
44
|
-
BalenaCommand.checkNotUsingOfflineMode();
|
|
45
|
-
}
|
|
46
|
-
if (ctr.readStdin) {
|
|
47
|
-
await this.getStdin();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
BalenaCommand.primary = false;
|
|
52
|
-
BalenaCommand.root = false;
|
|
53
|
-
BalenaCommand.authenticated = false;
|
|
54
|
-
BalenaCommand.offlineCompatible = false;
|
|
55
|
-
BalenaCommand.readStdin = false;
|
|
56
|
-
exports.default = BalenaCommand;
|
|
57
|
-
//# sourceMappingURL=command.js.map
|
package/build/command.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;AAiBA,sCAAsC;AACtC,qCAGkB;AAClB,uCAA2C;AAE3C,MAA8B,aAAc,SAAQ,cAAO;IA+ChD,MAAM,CAAC,KAAK,CAAC,uBAAuB;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,2CAAa,aAAa,EAAC,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,oCAA2B,CACpC,oDAAoD,CACpD,CAAC;QACH,CAAC;IACF,CAAC;IAgBM,MAAM,CAAC,KAAK,CAAC,aAAa;QAChC,MAAM,CAAC,2CAAa,kBAAkB,EAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1D,CAAC;IAQM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAgB;QACnD,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IAgBM,MAAM,CAAC,wBAAwB;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACvC,MAAM,IAAI,uCAA8B,CAAC,IAAA,kBAAW,EAAA;;;GAGpD,CAAC,CAAC;QACH,CAAC;IACF,CAAC;IAQS,KAAK,CAAC,QAAQ;QACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,2CAAa,WAAW,EAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAKS,MAAM,CAAC,KAAK,CAAC,SAAS;QAC/B,OAAO,CAAC,2CAAa,gBAAgB,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACrD,CAAC;IAES,KAAK,CAAC,IAAI;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAmC,CAAC;QAErD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,aAAa,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC5B,aAAa,CAAC,wBAAwB,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC;IACF,CAAC;;AA3Ia,qBAAO,GAAG,KAAK,CAAC;AAQhB,kBAAI,GAAG,KAAK,CAAC;AAOb,2BAAa,GAAG,KAAK,CAAC;AAOtB,+BAAiB,GAAG,KAAK,CAAC;AAO1B,uBAAS,GAAG,KAAK,CAAC;kBAlCH,aAAa"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.trackPromise = void 0;
|
|
4
|
-
let trackResolve;
|
|
5
|
-
exports.trackPromise = new Promise((resolve) => {
|
|
6
|
-
trackResolve = resolve;
|
|
7
|
-
});
|
|
8
|
-
const hook = async function (options) {
|
|
9
|
-
const events = await Promise.resolve().then(() => require('../../events'));
|
|
10
|
-
const cmd = options.Command.id;
|
|
11
|
-
trackResolve(events.trackCommand(cmd));
|
|
12
|
-
};
|
|
13
|
-
exports.default = hook;
|
|
14
|
-
//# sourceMappingURL=track.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../../src/hooks/prerun/track.ts"],"names":[],"mappings":";;;AAkBA,IAAI,YAA4C,CAAC;AAGpC,QAAA,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACnD,YAAY,GAAG,OAAO,CAAC;AACxB,CAAC,CAAC,CAAC;AAWH,MAAM,IAAI,GAAmB,KAAK,WAAW,OAAO;IACnD,MAAM,MAAM,GAAG,2CAAa,cAAc,EAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAI/B,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,kBAAe,IAAI,CAAC"}
|
package/src/command.ts
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2020 Balena Ltd.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { Command } from '@oclif/core';
|
|
19
|
-
import {
|
|
20
|
-
InsufficientPrivilegesError,
|
|
21
|
-
NotAvailableInOfflineModeError,
|
|
22
|
-
} from './errors';
|
|
23
|
-
import { stripIndent } from './utils/lazy';
|
|
24
|
-
|
|
25
|
-
export default abstract class BalenaCommand extends Command {
|
|
26
|
-
/**
|
|
27
|
-
* When set to true, command will be listed in `help`,
|
|
28
|
-
* otherwise listed in `help --verbose` with secondary commands.
|
|
29
|
-
*/
|
|
30
|
-
public static primary = false;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Require elevated privileges to run.
|
|
34
|
-
* When set to true, command will exit with an error
|
|
35
|
-
* if executed without root on Mac/Linux
|
|
36
|
-
* or if executed by non-Administrator on Windows.
|
|
37
|
-
*/
|
|
38
|
-
public static root = false;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Require authentication to run.
|
|
42
|
-
* When set to true, command will exit with an error
|
|
43
|
-
* if user is not already logged in.
|
|
44
|
-
*/
|
|
45
|
-
public static authenticated = false;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Require an internet connection to run.
|
|
49
|
-
* When set to true, command will exit with an error
|
|
50
|
-
* if user is running in offline mode (BALENARC_OFFLINE_MODE).
|
|
51
|
-
*/
|
|
52
|
-
public static offlineCompatible = false;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Accept piped input.
|
|
56
|
-
* When set to true, command will read from stdin during init
|
|
57
|
-
* and make contents available on member `stdin`.
|
|
58
|
-
*/
|
|
59
|
-
public static readStdin = false;
|
|
60
|
-
|
|
61
|
-
public stdin: string;
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Throw InsufficientPrivilegesError if not root on Mac/Linux
|
|
65
|
-
* or non-Administrator on Windows.
|
|
66
|
-
*
|
|
67
|
-
* Called automatically if `root=true`.
|
|
68
|
-
* Can be called explicitly by command implementation, if e.g.:
|
|
69
|
-
* - check should only be done conditionally
|
|
70
|
-
* - other code needs to execute before check
|
|
71
|
-
*/
|
|
72
|
-
protected static async checkElevatedPrivileges() {
|
|
73
|
-
const isElevated = await (await import('is-elevated'))();
|
|
74
|
-
if (!isElevated) {
|
|
75
|
-
throw new InsufficientPrivilegesError(
|
|
76
|
-
'You need root/admin privileges to run this command',
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Throw NotLoggedInError if not logged in.
|
|
83
|
-
*
|
|
84
|
-
* Called automatically if `authenticated=true`.
|
|
85
|
-
* Can be called explicitly by command implementation, if e.g.:
|
|
86
|
-
* - check should only be done conditionally
|
|
87
|
-
* - other code needs to execute before check
|
|
88
|
-
*
|
|
89
|
-
* Note, currently public to allow use outside of derived commands
|
|
90
|
-
* (as some command implementations require this. Can be made protected
|
|
91
|
-
* if this changes).
|
|
92
|
-
*
|
|
93
|
-
* @throws {NotLoggedInError}
|
|
94
|
-
*/
|
|
95
|
-
public static async checkLoggedIn() {
|
|
96
|
-
await (await import('./utils/patterns')).checkLoggedIn();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Throw NotLoggedInError if not logged in when condition true.
|
|
101
|
-
*
|
|
102
|
-
* @param {boolean} doCheck - will check if true.
|
|
103
|
-
* @throws {NotLoggedInError}
|
|
104
|
-
*/
|
|
105
|
-
public static async checkLoggedInIf(doCheck: boolean) {
|
|
106
|
-
if (doCheck) {
|
|
107
|
-
await this.checkLoggedIn();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Throw NotAvailableInOfflineModeError if in offline mode.
|
|
113
|
-
*
|
|
114
|
-
* Called automatically if `onlineOnly=true`.
|
|
115
|
-
* Can be called explicitly by command implementation, if e.g.:
|
|
116
|
-
* - check should only be done conditionally
|
|
117
|
-
* - other code needs to execute before check
|
|
118
|
-
*
|
|
119
|
-
* Note, currently public to allow use outside of derived commands
|
|
120
|
-
* (as some command implementations require this. Can be made protected
|
|
121
|
-
* if this changes).
|
|
122
|
-
*
|
|
123
|
-
* @throws {NotAvailableInOfflineModeError}
|
|
124
|
-
*/
|
|
125
|
-
public static checkNotUsingOfflineMode() {
|
|
126
|
-
if (process.env.BALENARC_OFFLINE_MODE) {
|
|
127
|
-
throw new NotAvailableInOfflineModeError(stripIndent`
|
|
128
|
-
This command requires an internet connection, and cannot be used in offline mode.
|
|
129
|
-
To leave offline mode, unset the BALENARC_OFFLINE_MODE environment variable.
|
|
130
|
-
`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Read stdin contents and make available to command.
|
|
136
|
-
*
|
|
137
|
-
* This approach could be improved in the future to automatically set argument
|
|
138
|
-
* values from stdin based in configuration, minimising command implementation.
|
|
139
|
-
*/
|
|
140
|
-
protected async getStdin() {
|
|
141
|
-
this.stdin = await (await import('get-stdin'))();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Get a logger instance.
|
|
146
|
-
*/
|
|
147
|
-
protected static async getLogger() {
|
|
148
|
-
return (await import('./utils/logger')).getLogger();
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
protected async init() {
|
|
152
|
-
const ctr = this.constructor as typeof BalenaCommand;
|
|
153
|
-
|
|
154
|
-
if (ctr.root) {
|
|
155
|
-
await BalenaCommand.checkElevatedPrivileges();
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (ctr.authenticated) {
|
|
159
|
-
await BalenaCommand.checkLoggedIn();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (!ctr.offlineCompatible) {
|
|
163
|
-
BalenaCommand.checkNotUsingOfflineMode();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
if (ctr.readStdin) {
|
|
167
|
-
await this.getStdin();
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2019-2020 Balena Ltd.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import type { Hook } from '@oclif/core';
|
|
18
|
-
|
|
19
|
-
let trackResolve: (result: Promise<any>) => void;
|
|
20
|
-
|
|
21
|
-
// note: trackPromise is subject to a Bluebird.timeout, defined in events.ts
|
|
22
|
-
export const trackPromise = new Promise((resolve) => {
|
|
23
|
-
trackResolve = resolve;
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* This is an oclif 'prerun' hook. This hook runs after the command line is
|
|
28
|
-
* parsed by oclif, but before the command's run() function is called.
|
|
29
|
-
* See: https://oclif.io/docs/hooks
|
|
30
|
-
*
|
|
31
|
-
* This hook is used to track CLI command signatures (usage analytics).
|
|
32
|
-
* A command signature is something like "env add NAME [VALUE]". That's
|
|
33
|
-
* literally so: 'NAME' and 'VALUE' are NOT replaced with actual values.
|
|
34
|
-
*/
|
|
35
|
-
const hook: Hook<'prerun'> = async function (options) {
|
|
36
|
-
const events = await import('../../events');
|
|
37
|
-
const cmd = options.Command.id;
|
|
38
|
-
|
|
39
|
-
// Intentionally do not await for the track promise here, in order to
|
|
40
|
-
// run the command tracking and the command itself in parallel.
|
|
41
|
-
trackResolve(events.trackCommand(cmd));
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export default hook;
|