Compare commits

...

141 Commits

Author SHA1 Message Date
d35787705f Update package used to find image manifest
Change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2024-12-18 12:35:26 -05:00
e5076434c6 v20.1.2 2024-12-17 11:35:00 +00:00
5d687f5a55 Merge pull request #2896 from balena-io/unnecessary-promise-resolve-reject
Remove unnecessary `Promise.resolve` and `Promise.reject`
2024-12-17 11:34:05 +00:00
e192767156 Remove unnecessary Promise.resolve and Promise.reject
Change-type: patch
2024-12-16 21:12:02 +00:00
5a8d2fad5f v20.1.1 2024-12-16 17:36:44 +00:00
45f482fad1 Merge pull request #2895 from balena-io/bump-balena-lint-v9
Update @balena/lint to v9.1.3
2024-12-16 17:35:45 +00:00
c0e7ae9c91 Update @balena/lint to v9.1.3
Update @balena/lint from 8.0.0 to 9.1.3

Change-type: patch
2024-12-16 14:09:47 -03:00
36077cacda v20.1.0 2024-12-12 14:17:22 +00:00
82b9983450 Merge pull request #2890 from balena-io/takeover
`device os-update`: Add support for updates that require takeover
2024-12-12 09:16:14 -05:00
703dbd01c9 device os-update: Add handling for updates that require takeover
Change-type: minor
2024-12-11 12:04:53 -05:00
602e63c8a9 Fix typings in release and release list commands 2024-12-11 12:00:08 -05:00
2ab635f49a Update expected warnings 2024-12-11 12:00:08 -05:00
322736a145 Deduplicate dependencies 2024-12-11 12:00:08 -05:00
c347b67b25 Update balena-sdk
Change-type: patch
2024-12-11 12:00:08 -05:00
4022beeb56 Update @balena/compose
Change-type: patch
2024-12-11 12:00:08 -05:00
ccf97cfc9f v20.0.9 2024-12-05 12:08:28 +00:00
9c5fe14f2e Merge pull request #2889 from oskarwilliams/express-version-4.21.1
Update shrinkwrapped express to v4.21.1
2024-12-05 12:07:23 +00:00
38e29251e7 Update shrinkwrapped express to v4.21.1
Change-type: patch
2024-12-05 09:59:57 +00:00
bfc7a14646 v20.0.8 2024-12-04 19:37:38 +00:00
610db81fcb Merge pull request #2893 from balena-io/bump-macos-13
Run test and publish with macos-13
2024-12-04 16:36:42 -03:00
d1f7d6d07f Run test and publish with macos-13
Change-type: patch
2024-12-04 16:16:52 -03:00
694eb78aaa v20.0.7 2024-11-23 17:38:10 +00:00
1caccafbcd Merge pull request #2891 from balena-io/bump-typescript-to-5.7.2
Bump typescript to 5.7.2
2024-11-23 17:37:10 +00:00
61d4d1f1e7 Update TypeScript to 5.7.2
Change-type: patch
2024-11-23 00:40:43 +02:00
a01c85bc15 Deduplicate dependencies 2024-11-23 00:40:28 +02:00
5d7b7cfc6f v20.0.6 2024-11-08 08:10:12 +00:00
92fd9e0883 Merge pull request #2887 from balena-io/refactor-build
Refactor balena build for clarity
2024-11-08 08:09:19 +00:00
24273b5ac0 Deduplicate dependencies 2024-11-07 17:33:14 +02:00
6155509f4c Refactor balena build for clarity
Change-type: patch
2024-11-07 16:24:10 +02:00
735af9f6a9 v20.0.5 2024-11-05 10:12:26 +00:00
d7c60e6dea Merge pull request #2884 from balena-io/renovate/actions-upload-artifact-digest
Update actions/upload-artifact digest to b4b15b8
2024-11-05 10:11:38 +00:00
bcb42c8a21 Update actions/upload-artifact digest to b4b15b8
Update actions/upload-artifact

Change-type: patch
2024-11-05 09:50:56 +00:00
04f5e0fa2b v20.0.4 2024-11-05 09:13:22 +00:00
8cb5804848 Merge pull request #2883 from balena-io/renovate/actions-setup-node-digest
Update actions/setup-node digest to 39370e3
2024-11-05 09:12:31 +00:00
91c3fced49 Update actions/setup-node digest to 39370e3
Update actions/setup-node

Change-type: patch
2024-11-05 08:52:19 +00:00
99a94eafbb v20.0.3 2024-11-05 08:12:01 +00:00
b4cff78588 Merge pull request #2885 from balena-io/non-sudo-api-keys
api-key generate: Display a descriptive error when the generation fails due to a stale JWT
2024-11-05 08:11:04 +00:00
8577bb6281 Deduplicate dependencies 2024-11-04 20:51:28 +02:00
e0f081623b api-key generate: Display a descriptive error when the generation fails due to a stale JWT
Change-type: patch
2024-11-04 20:51:27 +02:00
2887ab8200 v20.0.2 2024-10-29 12:57:11 +00:00
aaf4625abb Merge pull request #2881 from balena-io/fix-ssh-key-add-piping
Restore ability to cat key into `ssh-key add`
2024-10-29 12:56:13 +00:00
6f30dc0550 Restore ability to cat key into ssh-key add
Change-type: patch
2024-10-29 07:48:42 -04:00
6565ef4392 v20.0.1 2024-10-29 11:37:14 +00:00
60b46192a2 Merge pull request #2879 from balena-io/bump-oclif-core
Fix sending input to some aliases not working
2024-10-29 11:36:24 +00:00
bb101de96e Update @oclif/core patch 2024-10-29 07:16:51 -04:00
ca6344bf4c Deduplicate dependencies 2024-10-29 07:09:06 -04:00
48596fa318 Fix sending input to some aliases not working
Change-type: patch
2024-10-29 07:05:37 -04:00
7fb28ddb21 v20.0.0 2024-10-25 17:33:42 +00:00
6dd6f43d64 Merge pull request #2833 from balena-io/api-v7
Api v7
2024-10-25 17:32:44 +00:00
07a7bd76fe Deduplicate dependencies 2024-10-25 12:57:41 -04:00
4b3fdcf99c device update: Use detached HUP for os updates
This will not track HUP progress when we call
OS update in the CLI but will allow for more
reliable OS updates by default.

Change-type: major
2024-10-25 12:57:15 -04:00
d023d0af91 Drop -h flag for help and stop manually adding help per command in favor of oclif automatically adding it
Change-type: major
2024-10-25 12:57:12 -04:00
de1821d7ac Stop checking for very old, long-removed commands
Change-type: major
2024-10-25 12:57:12 -04:00
12923c9b84 Deprecate devices supported command in favor of device-type list
Change-type: patch
2024-10-25 12:57:12 -04:00
8be069dbdb Deprecate notes command in favor of device note
Change-type: patch
2024-10-25 12:57:12 -04:00
9d3f9128a8 Deprecate tunnel command in favor of device tunnel
Change-type: patch
2024-10-25 12:57:12 -04:00
61ebf9e4fd Deprecate env add in favor of env set
Change-type: patch
2024-10-25 12:57:12 -04:00
84985022e5 Deprecate ssh command in favor of device ssh
Change-type: patch
2024-10-25 12:57:12 -04:00
c5d8f73263 Deprecate logs command in favor of device logs
Change-type: patch
2024-10-25 12:57:12 -04:00
5db0c71bb3 Deprecate scan command in favor of device detect
Change-type: patch
2024-10-25 12:57:12 -04:00
c7a06f7259 Deprecate orgs command in favor of organization list
Change-type: patch
2024-10-25 12:57:12 -04:00
bc66febc50 Deprecate tags command in favor of tag list
Change-type: patch
2024-10-25 12:57:12 -04:00
bb80311700 Deprecate envs command in favor of env list
Change-type: patch
2024-10-25 12:57:12 -04:00
3dee7bd6f6 Deprecate key commands in favor of ssh-key
Change-type: patch
2024-10-25 12:57:12 -04:00
3251f04287 Deprecate keys command in favor of key list
Change-type: patch
2024-10-25 12:57:12 -04:00
35dce4579a Deprecate releases command in favor of release list
Change-type: patch
2024-10-25 12:57:12 -04:00
71ef00534d Deprecate fleets command in favor of fleet list
Change-type: patch
2024-10-25 12:57:12 -04:00
b6f8be27ec Deprecate api-keys command in favor of api-key list
Change-type: patch
2024-10-25 12:57:12 -04:00
13110cca45 Deprecate devices command in favor of device list
Change-type: patch
2024-10-25 12:57:12 -04:00
d4b554da1b Docs: Show whether an alias is deprecated
Change-type: patch
2024-10-25 12:57:12 -04:00
1275c11573 Update balena-preload to 16.0.0
Change-type: patch
2024-10-25 12:57:10 -04:00
593233a99f Tests: Drop unused my_application resource mock
Change-type: patch
2024-10-25 12:56:48 -04:00
ec92f21b70 Drop the no longer needed __metadata property handling 2024-10-25 12:56:48 -04:00
5adc43bcbd Update image_size type from number to string 2024-10-25 12:56:48 -04:00
1ee9a68288 Update device.overall_status comments with their respective replacements
Changelog-entry: Rename `device.overall_status` values: `IDLE` to `OPERATIONAL`, `OFFLINE` to `DISCONNECTED`; add `REDUCED_FUNCTIONALITY`
Change-type: major
2024-10-25 12:56:48 -04:00
56e5dafb20 Drop the device.is_managed_by__device property from test-data 2024-10-25 12:56:48 -04:00
f0e0c0d728 Update all API queries to use the v7 model 2024-10-25 12:56:48 -04:00
afd14794f5 git mv v6 test-data api-responses to v7 2024-10-25 12:56:48 -04:00
37e08e4667 Update actor to use PineDeferred type 2024-10-25 12:56:48 -04:00
61af57acc9 Update release.contract type from string to JsonType 2024-10-25 12:56:48 -04:00
19be0fec1a Replace device should_be_running__release with is_pinned_on__release 2024-10-25 12:56:48 -04:00
2b656c23b3 Update @balena/compose to 5.0.0
Change-type: patch
2024-10-25 12:56:48 -04:00
2bf7b81645 Bump balena-sdk to 20.3.0
Change-type: patch
2024-10-25 12:56:43 -04:00
746b6fa439 v19.16.0 2024-10-23 13:18:23 +00:00
f52e218290 Merge pull request #2877 from balena-io/devices-support-to-device-type-list
Add alias `device-type list` for command `devices supported`
2024-10-23 09:17:22 -04:00
8655b89313 Deduplicate dependencies 2024-10-23 07:33:16 -04:00
09d52c504d device-type list: Add --all flag for including no longer supported device types in the list
Change-type: minor
2024-10-23 07:23:40 -04:00
e5cee648f2 Add alias device-type list for command devices supported
Change-type: minor
2024-10-23 07:23:40 -04:00
98a6b431d9 git mv devices/supported to device/list 2024-10-23 07:17:59 -04:00
f305d5d9a0 v19.15.0 2024-10-23 11:01:55 +00:00
5cb5ac80a6 Merge pull request #2876 from balena-io/notes-to-device-note
Add alias `device note` for command `note`
2024-10-23 07:00:58 -04:00
3eb3b3b584 Add alias device note for command notes
Change-type: minor
2024-10-21 21:07:38 -04:00
8ee5ede34d git mv notes/index to device/note 2024-10-21 21:02:18 -04:00
d6d08cc7c9 v19.14.0 2024-10-22 00:51:16 +00:00
76c63d4b20 Merge pull request #2875 from balena-io/tunnel-to-device-tunnel
Add alias `device tunnel` for command `tunnel`
2024-10-22 00:50:25 +00:00
bff5897047 Add alias device tunnel for command tunnel
Change-type: minor
2024-10-21 20:29:20 -04:00
22c9fd399e git mv tunnel/index to device/tunnel 2024-10-21 20:29:20 -04:00
65222b5fc9 v19.13.1 2024-10-21 19:13:36 +00:00
d554658eee Merge pull request #2865 from balena-io/renovate/major-4-chalk
Update dependency chalk to v4
2024-10-21 20:12:31 +01:00
8ded517dd9 Update dependency chalk to v4
Update chalk from 3.0.0 to 4.1.2

Change-type: patch
2024-10-21 18:50:41 +00:00
b0d8b021d5 v19.13.0 2024-10-21 18:14:05 +00:00
2eb5d7f6b3 Merge pull request #2874 from balena-io/envs-add-to-envs-set
Add alias `env set` for command `env add`
2024-10-21 14:13:14 -04:00
f1924bba6b Add alias env set for command env add
Change-type: minor
2024-10-21 12:06:17 -04:00
44082e22e4 git mv env/add to env/set 2024-10-21 12:06:17 -04:00
2d15530f61 v19.12.1 2024-10-21 16:04:19 +00:00
a7c612f7de Merge pull request #2873 from balena-io/bump-oclif-core
Update `@oclif/core`
2024-10-21 16:03:04 +00:00
147ce8067a Update @oclif/core
Change-type: patch
2024-10-21 11:42:30 -04:00
5e7ac09dd0 v19.12.0 2024-10-21 15:07:55 +00:00
4c9fc89a6b Merge pull request #2871 from balena-io/ssh-to-device-ssh
Add alias `device ssh` for `ssh` command
2024-10-21 15:06:26 +00:00
9b1eb57973 Update help.spec per recent help output change 2024-10-21 10:46:08 -04:00
76c08b6c13 Add alias device ssh for ssh command
Change-type: minor
2024-10-21 10:46:08 -04:00
3f82f42652 git mv ssh/index to device/ssh 2024-10-21 10:46:08 -04:00
69d820878a v19.11.1 2024-10-21 13:05:19 +00:00
aaaee47e0c Merge pull request #2869 from balena-io/renovate/major-19-sinon
Update dependency sinon to v19
2024-10-21 14:04:22 +01:00
e7761a616b Update dependency sinon to v19
Update sinon from 18.0.0 to 19.0.2

Change-type: patch
2024-10-21 12:43:26 +00:00
9559d5cba3 v19.11.0 2024-10-21 12:08:59 +00:00
c1649dd828 Merge pull request #2864 from balena-io/logs-to-device-logs
Add alias `device logs` for `logs` command
2024-10-21 12:07:57 +00:00
8e9b992a59 Deduplicate dependencies 2024-10-21 07:45:11 -04:00
b77f266bd7 Add alias device logs for logs
Change-type: minor
2024-10-21 07:35:58 -04:00
3c9ac76982 git mv logs/index to device/logs
Change-type: patch
2024-10-21 07:31:24 -04:00
e483d06d2b v19.10.0 2024-10-21 11:13:10 +00:00
24d2d19d33 Merge pull request #2862 from balena-io/scan-to-device-detect
`scan` to `device detect`
2024-10-21 07:12:05 -04:00
ba5bb7b12c Add alias device detect for scan
Change-type: minor
2024-10-18 10:45:06 -04:00
9082e7b3f7 git mv scan/index to device/detect 2024-10-18 10:39:24 -04:00
0716544042 v19.9.0 2024-10-18 14:25:43 +00:00
e1858aa69d Merge pull request #2861 from balena-io/orgs-to-organization-list
Orgs to organization list
2024-10-18 10:24:49 -04:00
082cce332a Add alias organization list for orgs command
Change-type: minor
2024-10-18 09:33:27 -04:00
218e0a1b6b git mv orgs/ to organization/ 2024-10-18 09:29:01 -04:00
4065c5775c v19.8.0 2024-10-18 13:25:54 +00:00
fd966df1f0 Merge pull request #2860 from balena-io/tags-to-tag-list
`tags` to `tag list`
2024-10-18 13:24:59 +00:00
5eba175bf1 Add alias tag list for tags command
Change-type: minor
2024-10-18 08:49:53 -04:00
bd1b71bf2f git mv tags/index to tag/list 2024-10-18 08:40:05 -04:00
bd7ea3d21a v19.7.0 2024-10-18 12:35:38 +00:00
31662d9175 Merge pull request #2859 from balena-io/envs-to-env-list
`envs` to `env list`
2024-10-18 12:34:15 +00:00
417c75484b Add alias env list for command envs
Change-type: minor
2024-10-18 07:47:46 -04:00
fcd77e97d9 git mv envs/index to env/list 2024-10-18 07:12:39 -04:00
1dd819ae61 v19.6.0 2024-10-18 11:04:31 +00:00
388e02ce85 Merge pull request #2857 from balena-io/key-to-ssh-key
Add `ssh-key` as aliases for all `key` commands
2024-10-18 07:03:26 -04:00
30446605e1 Deduplicate dependencies 2024-10-17 11:46:52 -04:00
e853b15f12 Add ssh-key as aliases for all key commands
Change-type: minor
2024-10-17 11:46:52 -04:00
96cf380f66 git mv key to ssh-key 2024-10-17 11:05:52 -04:00
188 changed files with 6329 additions and 5483 deletions

View File

@ -39,7 +39,7 @@ runs:
run: tar -xf ${{ runner.temp }}/custom.tgz
- name: Setup Node.js
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
node-version: ${{ inputs.NODE_VERSION }}
cache: npm
@ -135,7 +135,7 @@ runs:
XCODE_APP_LOADER_TEAM_ID: ${{ inputs.XCODE_APP_LOADER_TEAM_ID }}
- name: Upload artifacts
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
with:
name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ strategy.job-index }}
path: dist

View File

@ -26,7 +26,7 @@ runs:
steps:
# https://github.com/actions/setup-node#caching-global-packages-data
- name: Setup Node.js
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
node-version: ${{ inputs.NODE_VERSION }}
cache: npm
@ -58,7 +58,7 @@ runs:
run: tar --exclude-vcs -acf ${{ runner.temp }}/custom.tgz .
- name: Upload custom artifact
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
with:
name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}
path: ${{ runner.temp }}/custom.tgz

View File

@ -26,7 +26,7 @@ jobs:
"os": [
["self-hosted", "X64"],
["self-hosted", "ARM64"],
["macos-12"],
["macos-13"],
["windows-2019"],
["macos-latest-xlarge"]
]
@ -36,7 +36,7 @@ jobs:
"os": [
["self-hosted", "X64"],
["self-hosted", "ARM64"],
["macos-12"],
["macos-13"],
["windows-2019"],
["macos-latest-xlarge"]
]

View File

@ -1,3 +1,569 @@
- commits:
- subject: Remove unnecessary `Promise.resolve` and `Promise.reject`
hash: e192767156ef7123be76fb838b8cf1a4d80aeb54
body: ""
footer:
Change-type: patch
change-type: patch
author: Pagan Gazzard
nested: []
version: 20.1.2
title: ""
date: 2024-12-17T11:34:55.264Z
- commits:
- subject: Update @balena/lint to v9.1.3
hash: c0e7ae9c915d147faab215226d2fd04c35c72176
body: |
Update @balena/lint from 8.0.0 to 9.1.3
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 20.1.1
title: ""
date: 2024-12-16T17:36:39.581Z
- commits:
- subject: "`device os-update`: Add handling for updates that require takeover"
hash: 703dbd01c952474f28cbe3105a5ebaa41b4a0566
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
- subject: Update `balena-sdk`
hash: c347b67b250b6e2017f4dcadd5cabeda3b0fb50b
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Update `@balena/compose`
hash: 4022beeb56d4f9ac04084a8a4797458fb0d32d64
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 20.1.0
title: ""
date: 2024-12-12T14:17:15.690Z
- commits:
- subject: Update shrinkwrapped express to v4.21.1
hash: 38e29251e7600f2b1cffdff6d414073d910259b5
body: ""
footer:
Change-type: patch
change-type: patch
author: Oskar Williams
nested: []
version: 20.0.9
title: ""
date: 2024-12-05T12:08:24.259Z
- commits:
- subject: Run test and publish with macos-13
hash: d1f7d6d07f6f8b16facdfd52dfa0a8a2b0b764bd
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 20.0.8
title: ""
date: 2024-12-04T19:37:32.669Z
- commits:
- subject: Update TypeScript to 5.7.2
hash: 61d4d1f1e797f7978da64942648e8a0dcfc9d4b3
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 20.0.7
title: ""
date: 2024-11-23T17:38:05.230Z
- commits:
- subject: Refactor balena build for clarity
hash: 6155509f4cce06d6bd4ba2f3f3cf2b5e28d2e685
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 20.0.6
title: ""
date: 2024-11-08T08:10:08.612Z
- commits:
- subject: Update actions/upload-artifact digest to b4b15b8
hash: bcb42c8a21556619151c8c733b1462011add1d4d
body: |
Update actions/upload-artifact
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: 20.0.5
title: ""
date: 2024-11-05T10:12:23.039Z
- commits:
- subject: Update actions/setup-node digest to 39370e3
hash: 91c3fced497a5d4dbc293c85c9acc898c8c05b5a
body: |
Update actions/setup-node
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: 20.0.4
title: ""
date: 2024-11-05T09:13:17.264Z
- commits:
- subject: "api-key generate: Display a descriptive error when the generation
fails due to a stale JWT"
hash: e0f081623b3a28672a2d67f80e77fe035c9aa9bf
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 20.0.3
title: ""
date: 2024-11-05T08:11:56.432Z
- commits:
- subject: Restore ability to cat key into `ssh-key add`
hash: 6f30dc055027c0c2c3bd1040e7b6c87758535df5
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 20.0.2
title: ""
date: 2024-10-29T12:57:07.306Z
- commits:
- subject: Fix sending input to some aliases not working
hash: 48596fa318ae7450c4a5a00d1cb09ccd2d7fcc26
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 20.0.1
title: ""
date: 2024-10-29T11:37:10.421Z
- commits:
- subject: "`device update`: Use detached HUP for os updates"
hash: 4b3fdcf99c1dfa2dfe699d5ee1bdf9ee34338ca9
body: |
This will not track HUP progress when we call
OS update in the CLI but will allow for more
reliable OS updates by default.
footer:
Change-type: major
change-type: major
author: jaomaloy
nested: []
- subject: Drop `-h` flag for help and stop manually adding `help` per command in
favor of oclif automatically adding it
hash: d023d0af91ffc4f02fba5fceeb8ccd9751a5e07b
body: ""
footer:
Change-type: major
change-type: major
author: myarmolinsky
nested: []
- subject: Stop checking for very old, long-removed commands
hash: de1821d7ac71e8b111683c6619f75a890faf0606
body: ""
footer:
Change-type: major
change-type: major
author: myarmolinsky
nested: []
- subject: Deprecate `devices supported` command in favor of `device-type list`
hash: 12923c9b8461f41f813912e3bd5b0838e0958ba3
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `notes` command in favor of `device note`
hash: 8be069dbdbc62a9f10f96fb657ac7561ee6cd3fe
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `tunnel` command in favor of `device tunnel`
hash: 9d3f9128a8f57995badaed68f5c01cf51e482d6f
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `env add` in favor of `env set`
hash: 61ebf9e4fd69e03894c0e6bdaabbab5847be380c
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `ssh` command in favor of `device ssh`
hash: 84985022e5dce3eea9ccb5c3c5bd4982c6670822
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `logs` command in favor of `device logs`
hash: c5d8f7326351d88c61ee419546026aee5ee6cff8
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `scan` command in favor of `device detect`
hash: 5db0c71bb356a1fddd9aa32832bf76f1d0a71c93
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `orgs` command in favor of `organization list`
hash: c7a06f7259d8aaaac7f0629dba2756790c87d0f7
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `tags` command in favor of `tag list`
hash: bc66febc502d46bd37916d0bf5c413736f1522da
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `envs` command in favor of `env list`
hash: bb8031170050adc931358d8b0f269f785c41af36
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `key` commands in favor of `ssh-key`
hash: 3dee7bd6f67a56343e275cf2d3ba9470fe09ea07
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `keys` command in favor of `key list`
hash: 3251f0428743f4681132e995d25840340777580e
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `releases` command in favor of `release list`
hash: 35dce4579a18b529272046190dc11b25feadaa41
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `fleets` command in favor of `fleet list`
hash: 71ef00534d4c5f3a45d65a775f6d150e8a981f85
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `api-keys` command in favor of `api-key list`
hash: b6f8be27ecd524238bded3c2f9ae03af1251663c
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Deprecate `devices` command in favor of `device list`
hash: 13110cca455721aaff457a1aa50d74c90b542846
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: "Docs: Show whether an alias is deprecated"
hash: d4b554da1b45e6680e4b6ea6bdf6875c2f60d109
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Update `balena-preload` to 16.0.0
hash: 1275c11573d7da22c23ae3f3b76025424a92c339
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: "Tests: Drop unused `my_application` resource mock"
hash: 593233a99fec514ab3c92ab395e85beb3a95950a
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: "Rename `device.overall_status` values: `IDLE` to `OPERATIONAL`,
`OFFLINE` to `DISCONNECTED`; add `REDUCED_FUNCTIONALITY`"
hash: 1ee9a6828895856c446dd82481b15bf0a544c7a4
body: ""
footer:
Changelog-entry: "Rename `device.overall_status` values: `IDLE` to
`OPERATIONAL`, `OFFLINE` to `DISCONNECTED`; add
`REDUCED_FUNCTIONALITY`"
changelog-entry: "Rename `device.overall_status` values: `IDLE` to
`OPERATIONAL`, `OFFLINE` to `DISCONNECTED`; add
`REDUCED_FUNCTIONALITY`"
Change-type: major
change-type: major
author: myarmolinsky
nested: []
- subject: Update `@balena/compose` to 5.0.0
hash: 2b656c23b3b0653c193210c255f0bcb1da8ce1de
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Bump balena-sdk to 20.3.0
hash: 2bf7b8164514dc5a90a028f1326cb55504cde9fb
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 20.0.0
title: ""
date: 2024-10-25T17:33:36.964Z
- commits:
- subject: "device-type list: Add `--all` flag for including no longer supported
device types in the list"
hash: 09d52c504d901109eb7753f26f4ff05eda67d71b
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
- subject: Add alias `device-type list` for command `devices supported`
hash: e5cee648f25329bceaea6661a8065c5e2e6eccf4
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.16.0
title: ""
date: 2024-10-23T13:18:18.698Z
- commits:
- subject: Add alias `device note` for command `notes`
hash: 3eb3b3b584ce16c4811245b52817d3e6cf0270c5
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.15.0
title: ""
date: 2024-10-23T11:01:50.290Z
- commits:
- subject: Add alias `device tunnel` for command `tunnel`
hash: bff589704762f726abcbf3f7371ddfed7204a47a
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.14.0
title: ""
date: 2024-10-22T00:51:11.619Z
- commits:
- subject: Update dependency chalk to v4
hash: 8ded517dd96fe6237cb356ebc5c3a6263ba8edee
body: |
Update chalk from 3.0.0 to 4.1.2
footer:
Change-type: patch
change-type: patch
author: Self-hosted Renovate Bot
nested: []
version: 19.13.1
title: ""
date: 2024-10-21T19:13:31.221Z
- commits:
- subject: Add alias `env set` for command `env add`
hash: f1924bba6b1c4fe4ba57f3a63ddc98f4fa5290ba
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.13.0
title: ""
date: 2024-10-21T18:14:01.461Z
- commits:
- subject: Update `@oclif/core`
hash: 147ce8067a679d320fc8ef741266b8a5d6008a7e
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 19.12.1
title: ""
date: 2024-10-21T16:04:14.283Z
- commits:
- subject: Add alias `device ssh` for `ssh` command
hash: 76c08b6c13bd07f657ff5774863425e629d11f0a
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.12.0
title: ""
date: 2024-10-21T15:07:43.707Z
- commits:
- subject: Update dependency sinon to v19
hash: e7761a616bfdfb193f8617b3ba023fb3fce4ed05
body: |
Update sinon from 18.0.0 to 19.0.2
footer:
Change-type: patch
change-type: patch
author: Self-hosted Renovate Bot
nested: []
version: 19.11.1
title: ""
date: 2024-10-21T13:05:14.018Z
- commits:
- subject: Add alias `device logs` for `logs`
hash: b77f266bd757d62f110d4fc61128b5aa592f7a4e
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
- subject: git mv `logs/index` to `device/logs`
hash: 3c9ac769827da50d7c3617cba13aeaa01bccbba7
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 19.11.0
title: ""
date: 2024-10-21T12:08:55.576Z
- commits:
- subject: Add alias `device detect` for `scan`
hash: ba5bb7b12c797e024b82232a323afecf1659de19
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.10.0
title: ""
date: 2024-10-21T11:13:04.550Z
- commits:
- subject: Add alias `organization list` for `orgs` command
hash: 082cce332a497c15b34467f9ed22514ebaafaec9
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.9.0
title: ""
date: 2024-10-18T14:25:39.691Z
- commits:
- subject: Add alias `tag list` for `tags` command
hash: 5eba175bf1a0e016b98757848e0c345489f686c1
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.8.0
title: ""
date: 2024-10-18T13:25:50.462Z
- commits:
- subject: Add alias `env list` for command `envs`
hash: 417c75484b1ac6c216323248b50ba00fc3fe5a7f
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.7.0
title: ""
date: 2024-10-18T12:35:31.416Z
- commits:
- subject: Add `ssh-key` as aliases for all `key` commands
hash: e853b15f12af429265b1e9e20ce60db19438df4b
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: 19.6.0
title: ""
date: 2024-10-18T11:04:26.745Z
- commits:
- subject: Add `key list` alias for `keys` command
hash: 6b5c6e072b426a1e9517376ee756afa31ed96cfa
@ -615,19 +1181,8 @@
- commits:
- subject: Improve discover balena os across different networks
hash: 03f0f11f8b4c9fa4b5b4a9612fa9550b08d4bdd7
body: >
This is an improvement over the scan, join and leave commands removing
flakiness when searching over different networks. In short, instead of
leaving bonjour to search across all interfaces, we forcebly conduct a
search on each interface, this requires mDNS binding any ipv4 interface
(0.0.0.0), otherwise it would bind over the interface itself, which is
not desired as it causes services to only be able to receive information
over that interface, see
[mafintosh/multicast-dns#53](https://github.com/mafintosh/multicast-dns/issues/53).
This targeted approach enhances the reliability and accuracy of network
searches, reducing instances of missed connections or network errors
typically caused by flakiness when relying on bonjour's default
behavior.
body: |
This is an improvement over the scan, join and leave commands removing flakiness when searching over different networks. In short, instead of leaving bonjour to search across all interfaces, we forcebly conduct a search on each interface, this requires mDNS binding any ipv4 interface (0.0.0.0), otherwise it would bind over the interface itself, which is not desired as it causes services to only be able to receive information over that interface, see [mafintosh/multicast-dns#53](https://github.com/mafintosh/multicast-dns/issues/53). This targeted approach enhances the reliability and accuracy of network searches, reducing instances of missed connections or network errors typically caused by flakiness when relying on bonjour's default behavior.
footer:
Change-type: patch
change-type: patch
@ -2926,21 +3481,13 @@
- commits:
- subject: "patch: bump lint-staged from 13.3.0 to 14.0.0"
hash: 59d0bcd099a4fba24ad2c8c9b51c0603241440ee
body: >
Bumps [lint-staged](https://github.com/okonet/lint-staged) from
13.3.0 to 14.0.0.
- [Release
notes](https://github.com/okonet/lint-staged/releases)
-
[Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
body: |
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.3.0 to 14.0.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
---
updated-dependencies:
- dependency-name: lint-staged
dependency-type: direct:development
update-type: version-update:semver-major
@ -3269,22 +3816,13 @@
- commits:
- subject: "patch: bump lint-staged from 13.3.0 to 14.0.0"
hash: 59d0bcd099a4fba24ad2c8c9b51c0603241440ee
body: >
Bumps
[lint-staged](https://github.com/okonet/lint-staged)
from 13.3.0 to 14.0.0.
- [Release
notes](https://github.com/okonet/lint-staged/releases)
-
[Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
body: |
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.3.0 to 14.0.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
---
updated-dependencies:
- dependency-name: lint-staged
dependency-type: direct:development
update-type: version-update:semver-major
@ -3648,22 +4186,13 @@
- commits:
- subject: "patch: bump lint-staged from 13.3.0 to 14.0.0"
hash: 59d0bcd099a4fba24ad2c8c9b51c0603241440ee
body: >
Bumps
[lint-staged](https://github.com/okonet/lint-staged)
from 13.3.0 to 14.0.0.
- [Release
notes](https://github.com/okonet/lint-staged/releases)
-
[Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
body: |
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.3.0 to 14.0.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v13.3.0...v14.0.0)
---
updated-dependencies:
- dependency-name: lint-staged
dependency-type: direct:development
update-type: version-update:semver-major
@ -9321,23 +9850,16 @@
- commits:
- subject: Use valid release uuid for local releases
hash: cd19845b6b6ddecbf723b0598b9fbb628dd2419f
body: >
body: |
On local push, the CLI uses `localrelease` as the `commit` property for
the development application. This is not a valid uuid and will not be
read properly by the supervisor, as seen in
https://github.com/balena-os/balena-supervisor/blob/master/src/compose/service.ts#L652
While this is not a problem right now, the commit is becoming the main
way to identify a service release (replacing `releaseId` and `imageId`),
and the invalid release uuid could cause update issues when pushing a
local release on when using some API endpoints.
footer:
Change-type: patch
@ -9789,25 +10311,14 @@
- commits:
- subject: "patch: bump catch-uncommitted from 1.6.2 to 2.0.0"
hash: eef2f8ef1abec6fe825a55c37a771070a3efb94a
body: >
Bumps
[catch-uncommitted](https://github.com/resin-io-modules/catch-uncommitted)
from 1.6.2 to 2.0.0.
- [Release
notes](https://github.com/resin-io-modules/catch-uncommitted/releases)
-
[Changelog](https://github.com/balena-io-modules/catch-uncommitted/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/resin-io-modules/catch-uncommitted/compare/v1.6.2...v2.0.0)
body: |
Bumps [catch-uncommitted](https://github.com/resin-io-modules/catch-uncommitted) from 1.6.2 to 2.0.0.
- [Release notes](https://github.com/resin-io-modules/catch-uncommitted/releases)
- [Changelog](https://github.com/balena-io-modules/catch-uncommitted/blob/master/CHANGELOG.md)
- [Commits](https://github.com/resin-io-modules/catch-uncommitted/compare/v1.6.2...v2.0.0)
---
updated-dependencies:
- dependency-name: catch-uncommitted
dependency-type: direct:development
update-type: version-update:semver-major
@ -10668,21 +11179,13 @@
- commits:
- subject: Bump parse-link-header from 1.0.1 to 2.0.0
hash: 3c2c925eed81ed61e1326437038cda1059b1a0ba
body: >
Bumps [parse-link-header](https://github.com/thlorenz/parse-link-header)
from 1.0.1 to 2.0.0.
- [Release
notes](https://github.com/thlorenz/parse-link-header/releases)
-
[Commits](https://github.com/thlorenz/parse-link-header/compare/v1.0.1...v2.0.0)
body: |
Bumps [parse-link-header](https://github.com/thlorenz/parse-link-header) from 1.0.1 to 2.0.0.
- [Release notes](https://github.com/thlorenz/parse-link-header/releases)
- [Commits](https://github.com/thlorenz/parse-link-header/compare/v1.0.1...v2.0.0)
---
updated-dependencies:
- dependency-name: parse-link-header
dependency-type: direct:development
...
@ -11622,24 +12125,14 @@
- commits:
- subject: "patch: bump browserify from 14.5.0 to 17.0.0"
hash: 2ee532e8dcc3eda0c54296f468f7f9a9e637071a
body: >
Bumps [browserify](https://github.com/browserify/browserify)
from 14.5.0 to 17.0.0.
- [Release
notes](https://github.com/browserify/browserify/releases)
-
[Changelog](https://github.com/browserify/browserify/blob/master/changelog.markdown)
-
[Commits](https://github.com/browserify/browserify/compare/14.5.0...v17.0.0)
body: |
Bumps [browserify](https://github.com/browserify/browserify) from 14.5.0 to 17.0.0.
- [Release notes](https://github.com/browserify/browserify/releases)
- [Changelog](https://github.com/browserify/browserify/blob/master/changelog.markdown)
- [Commits](https://github.com/browserify/browserify/compare/14.5.0...v17.0.0)
---
updated-dependencies:
- dependency-name: browserify
dependency-type: direct:development
update-type: version-update:semver-major
@ -11655,23 +12148,14 @@
- commits:
- subject: "patch: bump tmp from 0.0.31 to 0.2.1"
hash: e905a6a8054297c89e75447e5ff48ca92e13bd49
body: >
Bumps [tmp](https://github.com/raszi/node-tmp) from 0.0.31 to
0.2.1.
body: |
Bumps [tmp](https://github.com/raszi/node-tmp) from 0.0.31 to 0.2.1.
- [Release notes](https://github.com/raszi/node-tmp/releases)
-
[Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/raszi/node-tmp/compare/v0.0.31...v0.2.1)
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.0.31...v0.2.1)
---
updated-dependencies:
- dependency-name: tmp
dependency-type: direct:development
update-type: version-update:semver-minor
@ -11741,23 +12225,14 @@
- commits:
- subject: "patch: bump mocha from 3.5.3 to 10.0.0"
hash: 548996665b7e6159e5e209aa4a10987e071da024
body: >
Bumps [mocha](https://github.com/mochajs/mocha) from 3.5.3 to
10.0.0.
body: |
Bumps [mocha](https://github.com/mochajs/mocha) from 3.5.3 to 10.0.0.
- [Release notes](https://github.com/mochajs/mocha/releases)
-
[Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/mochajs/mocha/compare/v3.5.3...v10.0.0)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v3.5.3...v10.0.0)
---
updated-dependencies:
- dependency-name: mocha
dependency-type: direct:development
update-type: version-update:semver-major
@ -11787,21 +12262,13 @@
- commits:
- subject: "patch: bump mockttp from 0.9.1 to 2.7.0"
hash: fa44187e4e510171666f046d6a3a658f59956fd4
body: >-
Bumps [mockttp](https://github.com/httptoolkit/mockttp) from
0.9.1 to 2.7.0.
- [Release
notes](https://github.com/httptoolkit/mockttp/releases)
-
[Commits](https://github.com/httptoolkit/mockttp/compare/v0.9.1...v2.7.0)
body: |-
Bumps [mockttp](https://github.com/httptoolkit/mockttp) from 0.9.1 to 2.7.0.
- [Release notes](https://github.com/httptoolkit/mockttp/releases)
- [Commits](https://github.com/httptoolkit/mockttp/compare/v0.9.1...v2.7.0)
---
updated-dependencies:
- dependency-name: mockttp
dependency-type: direct:development
update-type: version-update:semver-major
@ -11863,23 +12330,14 @@
nested: []
- subject: "patch: bump superagent from 3.8.3 to 7.1.2"
hash: ae3974af1965386bf236b7ae295e4a9ecc285f0c
body: >
Bumps [superagent](https://github.com/visionmedia/superagent)
from 3.8.3 to 7.1.2.
- [Release
notes](https://github.com/visionmedia/superagent/releases)
-
[Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
body: |
Bumps [superagent](https://github.com/visionmedia/superagent) from 3.8.3 to 7.1.2.
- [Release notes](https://github.com/visionmedia/superagent/releases)
- [Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
- [Commits](https://github.com/visionmedia/superagent/commits)
---
updated-dependencies:
- dependency-name: superagent
dependency-type: direct:development
update-type: version-update:semver-major
@ -11895,23 +12353,14 @@
- commits:
- subject: "patch: bump dotenv from 4.0.0 to 16.0.0"
hash: b2ddda64df84d5a109b2adc1ee847ff5aef17000
body: >
Bumps [dotenv](https://github.com/motdotla/dotenv) from 4.0.0 to
16.0.0.
body: |
Bumps [dotenv](https://github.com/motdotla/dotenv) from 4.0.0 to 16.0.0.
- [Release notes](https://github.com/motdotla/dotenv/releases)
-
[Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/motdotla/dotenv/compare/v4.0.0...v16.0.0)
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v4.0.0...v16.0.0)
---
updated-dependencies:
- dependency-name: dotenv
dependency-type: direct:development
update-type: version-update:semver-major
@ -15470,17 +15919,10 @@
- commits:
- subject: Add support for YAML anchors and aliases in 'docker-compose.yml'
hash: 8e712ac91055c4efde885854488000a27c6b483d
body: >
This allows project files to define services from generic fragments by
leveraging YAML's anchors and aliases. See here for an example:
https://github.com/compose-spec/compose-spec/blob/43f6537b2c8f01b6d3f0e184d13a0f3cb93d38d7/spec.md#fragments
body: |
This allows project files to define services from generic fragments by leveraging YAML's anchors and aliases. See here for an example: https://github.com/compose-spec/compose-spec/blob/43f6537b2c8f01b6d3f0e184d13a0f3cb93d38d7/spec.md#fragments
Removing the FAILSAFE_SCHEMA flag is not expected to break existing
project files, since the default behaviour is more liberal, or cause
problems down the road given we perform validation immediately after.
Docs for the flag:
https://github.com/nodeca/js-yaml#load-string---options-
Removing the FAILSAFE_SCHEMA flag is not expected to break existing project files, since the default behaviour is more liberal, or cause problems down the road given we perform validation immediately after. Docs for the flag: https://github.com/nodeca/js-yaml#load-string---options-
footer:
Change-type: minor
change-type: minor
@ -27694,32 +28136,16 @@
- commits:
- subject: Fix CI instability when building Typescript
hash: 05d58d82485d4b484550a6c438e6787802922561
body: >
body: |
The error appears to happen when symlinking typing files and manifests
on case sensitive file systems (like windows) with the error:
```
lib/actions-oclif/env/add.ts(73,16): error TS2742: The inferred type of 'flags' cannot be named without a reference to '../../../../../../../../../volumes/live/c64feead-f78e-4bd4-742d-ccd29aef53c4/volume/node_modules/@oclif/parser/lib/flags'. This is likely not portable. A type annotation is necessary.
lib/actions-oclif/version.ts(42,16): error TS2742: The inferred type of 'flags' cannot be named without a reference to '../../../../../../../../volumes/live/c64feead-f78e-4bd4-742d-ccd29aef53c4/volume/node_modules/@oclif/parser/lib/flags.js'. This is likely not portable. A type annotation is necessary.
```
lib/actions-oclif/env/add.ts(73,16): error TS2742: The inferred type of
'flags' cannot be named without a reference to
'../../../../../../../../../volumes/live/c64feead-f78e-4bd4-742d-ccd29aef53c4/volume/node_modules/@oclif/parser/lib/flags'.
This is likely not portable. A type annotation is necessary.
lib/actions-oclif/version.ts(42,16): error TS2742: The inferred type of
'flags' cannot be named without a reference to
'../../../../../../../../volumes/live/c64feead-f78e-4bd4-742d-ccd29aef53c4/volume/node_modules/@oclif/parser/lib/flags.js'.
This is likely not portable. A type annotation is necessary.
```
This appears to be reported on the Typescript repo here
https://github.com/microsoft/TypeScript/issues/29221
The suggested workaround is to explicitly set the type of the `flags`
static
This appears to be reported on the Typescript repo here https://github.com/microsoft/TypeScript/issues/29221
The suggested workaround is to explicitly set the type of the `flags` static
property.
footer:
Change-type: patch

View File

@ -4,6 +4,142 @@ All notable changes to this project will be documented in this file
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
This project adheres to [Semantic Versioning](http://semver.org/).
## 20.1.2 - 2024-12-17
* Remove unnecessary `Promise.resolve` and `Promise.reject` [Pagan Gazzard]
## 20.1.1 - 2024-12-16
* Update @balena/lint to v9.1.3 [Otavio Jacobi]
## 20.1.0 - 2024-12-12
* `device os-update`: Add handling for updates that require takeover [myarmolinsky]
* Update `balena-sdk` [myarmolinsky]
* Update `@balena/compose` [myarmolinsky]
## 20.0.9 - 2024-12-05
* Update shrinkwrapped express to v4.21.1 [Oskar Williams]
## 20.0.8 - 2024-12-04
* Run test and publish with macos-13 [Otavio Jacobi]
## 20.0.7 - 2024-11-23
* Update TypeScript to 5.7.2 [Thodoris Greasidis]
## 20.0.6 - 2024-11-08
* Refactor balena build for clarity [Thodoris Greasidis]
## 20.0.5 - 2024-11-05
* Update actions/upload-artifact digest to b4b15b8 [balena-renovate[bot]]
## 20.0.4 - 2024-11-05
* Update actions/setup-node digest to 39370e3 [balena-renovate[bot]]
## 20.0.3 - 2024-11-05
* api-key generate: Display a descriptive error when the generation fails due to a stale JWT [Thodoris Greasidis]
## 20.0.2 - 2024-10-29
* Restore ability to cat key into `ssh-key add` [myarmolinsky]
## 20.0.1 - 2024-10-29
* Fix sending input to some aliases not working [myarmolinsky]
## 20.0.0 - 2024-10-25
* `device update`: Use detached HUP for os updates [jaomaloy]
* Drop `-h` flag for help and stop manually adding `help` per command in favor of oclif automatically adding it [myarmolinsky]
* Stop checking for very old, long-removed commands [myarmolinsky]
* Deprecate `devices supported` command in favor of `device-type list` [myarmolinsky]
* Deprecate `notes` command in favor of `device note` [myarmolinsky]
* Deprecate `tunnel` command in favor of `device tunnel` [myarmolinsky]
* Deprecate `env add` in favor of `env set` [myarmolinsky]
* Deprecate `ssh` command in favor of `device ssh` [myarmolinsky]
* Deprecate `logs` command in favor of `device logs` [myarmolinsky]
* Deprecate `scan` command in favor of `device detect` [myarmolinsky]
* Deprecate `orgs` command in favor of `organization list` [myarmolinsky]
* Deprecate `tags` command in favor of `tag list` [myarmolinsky]
* Deprecate `envs` command in favor of `env list` [myarmolinsky]
* Deprecate `key` commands in favor of `ssh-key` [myarmolinsky]
* Deprecate `keys` command in favor of `key list` [myarmolinsky]
* Deprecate `releases` command in favor of `release list` [myarmolinsky]
* Deprecate `fleets` command in favor of `fleet list` [myarmolinsky]
* Deprecate `api-keys` command in favor of `api-key list` [myarmolinsky]
* Deprecate `devices` command in favor of `device list` [myarmolinsky]
* Docs: Show whether an alias is deprecated [myarmolinsky]
* Update `balena-preload` to 16.0.0 [myarmolinsky]
* Tests: Drop unused `my_application` resource mock [myarmolinsky]
* Rename `device.overall_status` values: `IDLE` to `OPERATIONAL`, `OFFLINE` to `DISCONNECTED`; add `REDUCED_FUNCTIONALITY` [myarmolinsky]
* Update `@balena/compose` to 5.0.0 [myarmolinsky]
* Bump balena-sdk to 20.3.0 [myarmolinsky]
## 19.16.0 - 2024-10-23
* device-type list: Add `--all` flag for including no longer supported device types in the list [myarmolinsky]
* Add alias `device-type list` for command `devices supported` [myarmolinsky]
## 19.15.0 - 2024-10-23
* Add alias `device note` for command `notes` [myarmolinsky]
## 19.14.0 - 2024-10-22
* Add alias `device tunnel` for command `tunnel` [myarmolinsky]
## 19.13.1 - 2024-10-21
* Update dependency chalk to v4 [Self-hosted Renovate Bot]
## 19.13.0 - 2024-10-21
* Add alias `env set` for command `env add` [myarmolinsky]
## 19.12.1 - 2024-10-21
* Update `@oclif/core` [myarmolinsky]
## 19.12.0 - 2024-10-21
* Add alias `device ssh` for `ssh` command [myarmolinsky]
## 19.11.1 - 2024-10-21
* Update dependency sinon to v19 [Self-hosted Renovate Bot]
## 19.11.0 - 2024-10-21
* Add alias `device logs` for `logs` [myarmolinsky]
* git mv `logs/index` to `device/logs` [myarmolinsky]
## 19.10.0 - 2024-10-21
* Add alias `device detect` for `scan` [myarmolinsky]
## 19.9.0 - 2024-10-18
* Add alias `organization list` for `orgs` command [myarmolinsky]
## 19.8.0 - 2024-10-18
* Add alias `tag list` for `tags` command [myarmolinsky]
## 19.7.0 - 2024-10-18
* Add alias `env list` for command `envs` [myarmolinsky]
## 19.6.0 - 2024-10-18
* Add `ssh-key` as aliases for all `key` commands [myarmolinsky]
## 19.5.0 - 2024-10-17
* Add `key list` alias for `keys` command [myarmolinsky]

View File

@ -145,7 +145,7 @@ container) in order to allow npm scripts like `postinstall` to be executed.
## Additional Dependencies
The `balena ssh`, `scan`, `build`, `deploy` and `preload` commands may require
The `balena device ssh`, `device detect`, `build`, `deploy` and `preload` commands may require
additional software to be installed. Check the Additional Dependencies sections for each operating
system:

View File

@ -33,7 +33,7 @@ as described above.
## sudo configuration
A few CLI commands require execution through sudo, e.g. `sudo balena scan`.
A few CLI commands require execution through sudo, e.g. `sudo balena device detect`.
If your Linux distribution has an `/etc/sudoers` file that defines a `secure_path`
setting, run `sudo visudo` to edit it and add the balena CLI's installation folder to
the ***pre-existing*** `secure_path` setting, for example:
@ -61,19 +61,19 @@ instructions](https://docs.docker.com/install/overview/) to install Docker on th
workstation as the balena CLI. The [advanced installation
options](./INSTALL-ADVANCED.md#additional-dependencies) document describes other possibilities.
### balena ssh
### balena device ssh
The `balena ssh` command requires the `ssh` command-line tool to be available. Most Linux
The `balena device ssh` command requires the `ssh` command-line tool to be available. Most Linux
distributions will already have it installed. Otherwise, `sudo apt-get install openssh-client`
should do the trick on Debian or Ubuntu.
The `balena ssh` command also requires an SSH key to be added to your balena account: see [SSH
The `balena device ssh` command also requires an SSH key to be added to your balena account: see [SSH
Access documentation](https://www.balena.io/docs/learn/manage/ssh-access/). The `balena key*`
command set can also be used to list and manage SSH keys: see `balena help -v`.
### balena scan
### balena device detect
The `balena scan` command requires a multicast DNS (mDNS) service like
The `balena device detect` command requires a multicast DNS (mDNS) service like
[Avahi](https://en.wikipedia.org/wiki/Avahi_(software)), which is installed by default on most
desktop Linux distributions. Otherwise, on Debian or Ubuntu, the installation command would be
`sudo apt-get install avahi-daemon`.

View File

@ -19,7 +19,7 @@ Selected operating system: **macOS**
- On the terminal prompt, type `balena version` and hit Enter. It should display
the version of the balena CLI that you have installed.
No further steps are required to run most CLI commands. The `balena ssh`, `build`, `deploy`
No further steps are required to run most CLI commands. The `balena device ssh`, `build`, `deploy`
and `preload` commands may require additional software to be installed, as described
in the next section.
@ -41,9 +41,9 @@ instructions](https://docs.docker.com/install/overview/) to install Docker on th
workstation as the balena CLI. The [advanced installation
options](./INSTALL-ADVANCED.md#additional-dependencies) document describes other possibilities.
### balena ssh
### balena device ssh
The `balena ssh` command requires the `ssh` command-line tool to be available. To check whether
The `balena device ssh` command requires the `ssh` command-line tool to be available. To check whether
it is already installed, run `ssh` on a Terminal window. If it is not yet installed, the options
include:
@ -52,7 +52,7 @@ include:
Components → Command Line Tools → Install.
* Or, install [Homebrew](https://brew.sh/), then `brew install openssh`
The `balena ssh` command also requires an SSH key to be added to your balena account: see [SSH
The `balena device ssh` command also requires an SSH key to be added to your balena account: see [SSH
Access documentation](https://www.balena.io/docs/learn/manage/ssh-access/). The `balena key*`
command set can also be used to list and manage SSH keys: see `balena help -v`.

View File

@ -19,7 +19,7 @@ Selected operating system: **Windows**
- On the command prompt, type `balena version` and hit Enter. It should display
the version of the balena CLI that you have installed.
No further steps are required to run most CLI commands. The `balena ssh`, `scan`, `build`,
No further steps are required to run most CLI commands. The `balena device ssh`, `device detect`, `build`,
`deploy` and `preload` commands may require additional software to be installed, as
described below.
@ -34,9 +34,9 @@ instructions](https://docs.docker.com/install/overview/) to install Docker on th
workstation as the balena CLI. The [advanced installation
options](./INSTALL-ADVANCED.md#additional-dependencies) document describes other possibilities.
### balena ssh
### balena device ssh
The `balena ssh` command requires the `ssh` command-line tool to be available. Microsoft started
The `balena device ssh` command requires the `ssh` command-line tool to be available. Microsoft started
distributing an SSH client with Windows 10, which is automatically installed through Windows
Update. To check whether it is installed, run `ssh` on a Windows Command Prompt or PowerShell. It
can also be [manually
@ -44,13 +44,13 @@ installed](https://docs.microsoft.com/en-us/windows-server/administration/openss
if needed. For older versions of Windows, there are several ssh/OpenSSH clients provided by 3rd
parties.
The `balena ssh` command also requires an SSH key to be added to your balena account: see [SSH
The `balena device ssh` command also requires an SSH key to be added to your balena account: see [SSH
Access documentation](https://www.balena.io/docs/learn/manage/ssh-access/). The `balena key*`
command set can also be used to list and manage SSH keys: see `balena help -v`.
### balena scan
### balena device detect
The `balena scan` command requires a multicast DNS (mDNS) service like Apple's Bonjour.
The `balena device detect` command requires a multicast DNS (mDNS) service like Apple's Bonjour.
Many Windows machines will already have this service installed, as it is bundled in popular
applications such as Skype (Wikipedia lists [several others](https://en.wikipedia.org/wiki/Bonjour_(software))).
Otherwise, Bonjour for Windows can be downloaded and installed from: https://support.apple.com/kb/DL999

View File

@ -88,9 +88,9 @@ HTTP(S) proxies can be configured through any of the following methods, in prece
* The `HTTPS_PROXY` and/or `HTTP_PROXY` environment variables, in the same URL format as
`BALENARC_PROXY`.
### Proxy setup for balena ssh
### Proxy setup for balena device ssh
In order to work behind a proxy server, the `balena ssh` command requires the
In order to work behind a proxy server, the `balena device ssh` command requires the
[`proxytunnel`](http://proxytunnel.sourceforge.net/) package (command-line tool) to be installed.
`proxytunnel` is available for Linux distributions like Ubuntu/Debian (`apt install proxytunnel`),
and for macOS through [Homebrew](https://brew.sh/). Windows support is limited to the [Windows
@ -110,7 +110,7 @@ The `BALENARC_NO_PROXY` variable may be used to exclude specified destinations f
> * This feature requires CLI version 11.30.8 or later. In the case of the npm [installation
> option](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md), it also requires
> Node.js version 10.16.0 or later.
> * To exclude a `balena ssh` target from proxying (IP address or `.local` hostname), the
> * To exclude a `balena device ssh` target from proxying (IP address or `.local` hostname), the
> `--noproxy` option should be specified in addition to the `BALENARC_NO_PROXY` variable.
By default (if `BALENARC_NO_PROXY` is not defined), all [private IPv4

View File

@ -31,7 +31,7 @@ command again.
Check whether the SD card is locked (a physical switch on the side of the card).
## I get `connect ETIMEDOUT` with `balena tunnel`
## I get `connect ETIMEDOUT` with `balena device tunnel`
Please update the CLI to the latest version. This issue was fixed in v12.38.5.
For more details, see: https://github.com/balena-io/balena-cli/issues/2172
@ -79,10 +79,10 @@ Try resetting the ownership by running:
$ sudo chown -R <user> $HOME/.balena
```
## Broken line wrapping / cursor behavior with `balena ssh`
## Broken line wrapping / cursor behavior with `balena device ssh`
Users sometimes come across broken line wrapping or cursor behavior in text terminals, for example
when long command lines are typed in a `balena ssh` session, or when using text editors like `vim`
when long command lines are typed in a `balena device ssh` session, or when using text editors like `vim`
or `nano`. This is not something specific to the balena CLI, being also a commonly reported issue
with standard remote terminal tools like `ssh` or `telnet`. It is often a remote shell
configuration issue (files like `/etc/profile`, `~/.bash_profile`, `~/.bash_login`, `~/.profile`

View File

@ -56,15 +56,11 @@ const commandHeadings: { [key: string]: string } = {
whoami: 'Authentication',
logout: 'Authentication',
env: 'Environment Variables',
envs: 'Environment Variables',
help: 'Help and Version',
key: 'SSH Keys',
orgs: 'Organizations',
'ssh-key': 'SSH Keys',
organization: 'Organizations',
os: 'OS',
util: 'Utilities',
ssh: 'Network',
scan: 'Network',
tunnel: 'Network',
build: 'Deploy',
join: 'Platform',
leave: 'Platform',
@ -149,7 +145,7 @@ export async function getCapitanoDoc(): Promise<typeof capitanoDoc> {
throw new Error(`Error parsing section title`);
}
// match[1] has the title, match[2] has the rest
return match && match[2];
return match?.[2];
}),
mdParser.getSectionOfTitle('Installation'),
mdParser.getSectionOfTitle('Choosing a shell (command prompt/terminal)'),

View File

@ -25,7 +25,14 @@ function renderOclifCommand(command: Category['commands'][0]): string[] {
const result = [`## ${ent.encode(command.name || '')}`];
if (command.aliases?.length) {
result.push('### Aliases');
result.push(command.aliases.map((alias) => `- \`${alias}\``).join('\n'));
result.push(
command.aliases
.map(
(alias) =>
`- \`${alias}\`${command.deprecateAliases ? ' *(deprecated)*' : ''}`,
)
.join('\n'),
);
result.push(
`\nTo use one of the aliases, replace \`${command.name}\` with the alias.`,
);

View File

@ -3,7 +3,7 @@ import * as semver from 'semver';
const changeTypes = ['major', 'minor', 'patch'] as const;
const validateChangeType = (maybeChangeType: string = 'minor') => {
const validateChangeType = (maybeChangeType = 'minor') => {
maybeChangeType = maybeChangeType.toLowerCase();
switch (maybeChangeType) {
case 'patch':
@ -136,5 +136,4 @@ async function main() {
}
}
// eslint-disable-next-line @typescript-eslint/no-floating-promises
main();
void main();

View File

@ -19,6 +19,7 @@ import { spawn } from 'child_process';
import * as path from 'path';
import * as fs from 'fs';
import { diffTrimmedLines } from 'diff';
import * as whichMod from 'which';
export const ROOT = path.join(__dirname, '..');
@ -101,7 +102,6 @@ export function loadPackageJson() {
* @returns The program's full path, e.g. 'C:\WINDOWS\System32\OpenSSH\ssh.EXE'
*/
export async function which(program: string): Promise<string> {
const whichMod = await import('which');
let programPath: string;
try {
programPath = await whichMod(program);
@ -132,7 +132,7 @@ export async function whichSpawn(
.on('error', reject)
.on('close', resolve);
} catch (err) {
reject(err);
reject(err as Error);
}
});
} catch (err) {

View File

@ -57,7 +57,10 @@ require('ts-node').register({
project: path.join(rootDir, 'tsconfig.json'),
transpileOnly: true,
});
require('../src/app').run(undefined, { dir: __dirname, development: true });
void require('../src/app').run(undefined, {
dir: __dirname,
development: true,
});
// Modify package.json oclif paths from build/ -> src/, or vice versa
function modifyOclifPaths(revert) {

View File

@ -5,7 +5,7 @@
process.env.UV_THREADPOOL_SIZE = '64';
// Disable oclif registering ts-node
process.env.OCLIF_TS_NODE = 0;
process.env.OCLIF_TS_NODE = '0';
async function run() {
// Use fast-boot to cache require lookups, speeding up startup
@ -18,4 +18,4 @@ async function run() {
await require('../build/app').run(undefined, { dir: __dirname });
}
run();
void run();

View File

@ -8,27 +8,28 @@ _balena() {
local context state line curcontext="$curcontext"
# Valid top-level completions
main_commands=( api-key app block build config deploy device devices env envs fleet internal join key leave local login logout logs notes orgs os preload push release scan settings ssh support tag tags tunnel util version whoami )
main_commands=( api-key app block build config deploy device device-type env fleet internal join leave local login logout organization os preload push release settings ssh-key support tag util version whoami )
# Sub-completions
api_key_cmds=( generate list revoke )
app_cmds=( create )
block_cmds=( create )
config_cmds=( generate inject read reconfigure write )
device_cmds=( deactivate identify init list local-mode move os-update pin public-url purge reboot register rename restart rm shutdown start-service stop-service track-fleet )
devices_cmds=( supported )
env_cmds=( add rename rm )
device_type_cmds=( list )
device_cmds=( deactivate detect identify init list local-mode logs move note os-update pin public-url purge reboot register rename restart rm shutdown ssh start-service stop-service track-fleet tunnel )
env_cmds=( list rename rm set )
fleet_cmds=( create list pin purge rename restart rm track-latest )
internal_cmds=( osinit )
key_cmds=( add list rm )
local_cmds=( configure flash )
organization_cmds=( list )
os_cmds=( build-config configure download initialize versions )
release_cmds=( finalize invalidate list validate )
tag_cmds=( rm set )
ssh_key_cmds=( add list rm )
tag_cmds=( list rm set )
_arguments -C \
'(- 1 *)--version[show version and exit]' \
'(- 1 *)'{-h,--help}'[show help options and exit]' \
'(- 1 *)--help[show help options and exit]' \
'1:first command:_balena_main_cmds' \
'2:second command:_balena_sec_cmds' \
&& ret=0
@ -54,12 +55,12 @@ _balena_sec_cmds() {
"config")
_describe -t config_cmds 'config_cmd' config_cmds "$@" && ret=0
;;
"device-type")
_describe -t device_type_cmds 'device-type_cmd' device_type_cmds "$@" && ret=0
;;
"device")
_describe -t device_cmds 'device_cmd' device_cmds "$@" && ret=0
;;
"devices")
_describe -t devices_cmds 'devices_cmd' devices_cmds "$@" && ret=0
;;
"env")
_describe -t env_cmds 'env_cmd' env_cmds "$@" && ret=0
;;
@ -69,18 +70,21 @@ _balena_sec_cmds() {
"internal")
_describe -t internal_cmds 'internal_cmd' internal_cmds "$@" && ret=0
;;
"key")
_describe -t key_cmds 'key_cmd' key_cmds "$@" && ret=0
;;
"local")
_describe -t local_cmds 'local_cmd' local_cmds "$@" && ret=0
;;
"organization")
_describe -t organization_cmds 'organization_cmd' organization_cmds "$@" && ret=0
;;
"os")
_describe -t os_cmds 'os_cmd' os_cmds "$@" && ret=0
;;
"release")
_describe -t release_cmds 'release_cmd' release_cmds "$@" && ret=0
;;
"ssh-key")
_describe -t ssh_key_cmds 'ssh-key_cmd' ssh_key_cmds "$@" && ret=0
;;
"tag")
_describe -t tag_cmds 'tag_cmd' tag_cmds "$@" && ret=0
;;

View File

@ -7,22 +7,23 @@ _balena_complete()
local cur prev
# Valid top-level completions
main_commands="api-key app block build config deploy device devices env envs fleet internal join key leave local login logout logs notes orgs os preload push release scan settings ssh support tag tags tunnel util version whoami"
main_commands="api-key app block build config deploy device device-type env fleet internal join leave local login logout organization os preload push release settings ssh-key support tag util version whoami"
# Sub-completions
api_key_cmds="generate list revoke"
app_cmds="create"
block_cmds="create"
config_cmds="generate inject read reconfigure write"
device_cmds="deactivate identify init list local-mode move os-update pin public-url purge reboot register rename restart rm shutdown start-service stop-service track-fleet"
devices_cmds="supported"
env_cmds="add rename rm"
device_type_cmds="list"
device_cmds="deactivate detect identify init list local-mode logs move note os-update pin public-url purge reboot register rename restart rm shutdown ssh start-service stop-service track-fleet tunnel"
env_cmds="list rename rm set"
fleet_cmds="create list pin purge rename restart rm track-latest"
internal_cmds="osinit"
key_cmds="add list rm"
local_cmds="configure flash"
organization_cmds="list"
os_cmds="build-config configure download initialize versions"
release_cmds="finalize invalidate list validate"
tag_cmds="rm set"
ssh_key_cmds="add list rm"
tag_cmds="list rm set"
@ -48,12 +49,12 @@ _balena_complete()
config)
COMPREPLY=( $(compgen -W "$config_cmds" -- $cur) )
;;
device-type)
COMPREPLY=( $(compgen -W "$device_type_cmds" -- $cur) )
;;
device)
COMPREPLY=( $(compgen -W "$device_cmds" -- $cur) )
;;
devices)
COMPREPLY=( $(compgen -W "$devices_cmds" -- $cur) )
;;
env)
COMPREPLY=( $(compgen -W "$env_cmds" -- $cur) )
;;
@ -63,18 +64,21 @@ _balena_complete()
internal)
COMPREPLY=( $(compgen -W "$internal_cmds" -- $cur) )
;;
key)
COMPREPLY=( $(compgen -W "$key_cmds" -- $cur) )
;;
local)
COMPREPLY=( $(compgen -W "$local_cmds" -- $cur) )
;;
organization)
COMPREPLY=( $(compgen -W "$organization_cmds" -- $cur) )
;;
os)
COMPREPLY=( $(compgen -W "$os_cmds" -- $cur) )
;;
release)
COMPREPLY=( $(compgen -W "$release_cmds" -- $cur) )
;;
ssh-key)
COMPREPLY=( $(compgen -W "$ssh_key_cmds" -- $cur) )
;;
tag)
COMPREPLY=( $(compgen -W "$tag_cmds" -- $cur) )
;;

View File

@ -14,7 +14,7 @@ $sub_cmds$
_arguments -C \
'(- 1 *)--version[show version and exit]' \
'(- 1 *)'{-h,--help}'[show help options and exit]' \
'(- 1 *)--help[show help options and exit]' \
'1:first command:_balena_main_cmds' \
'2:second command:_balena_sec_cmds' \
&& ret=0

File diff suppressed because it is too large Load Diff

32
eslint.config.js Normal file
View File

@ -0,0 +1,32 @@
const { FlatCompat } = require('@eslint/eslintrc');
const compat = new FlatCompat({
baseDirectory: __dirname,
});
module.exports = [
...require('@balena/lint/config/eslint.config'),
...compat.config({
parserOptions: {
project: 'tsconfig.dev.json',
},
ignorePatterns: ['**/generate-completion.js', '**/bin/**/*'],
rules: {
ignoreDefinitionFiles: 0,
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-shadow': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-unnecessary-type-assertion': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'warn',
'no-restricted-imports': ['error', {
paths: ['resin-cli-visuals', 'chalk', 'common-tags', 'resin-cli-form'],
}],
'@typescript-eslint/no-unused-vars': ['error', {
argsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
}],
},
}),
];

3403
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "balena-cli",
"version": "19.5.0",
"version": "20.1.2",
"description": "The official balena Command Line Interface",
"main": "./build/app.js",
"homepage": "https://github.com/balena-io/balena-cli",
@ -111,7 +111,7 @@
}
},
"devDependencies": {
"@balena/lint": "^8.0.0",
"@balena/lint": "^9.1.3",
"@electron/notarize": "^2.0.0",
"@types/archiver": "^6.0.2",
"@types/bluebird": "^3.5.36",
@ -183,30 +183,30 @@
"oclif": "^4.14.0",
"rewire": "^7.0.0",
"simple-git": "^3.14.1",
"sinon": "^18.0.0",
"sinon": "^19.0.0",
"string-to-stream": "^3.0.1",
"ts-node": "^10.4.0",
"typescript": "^5.6.2"
"typescript": "^5.7.2"
},
"dependencies": {
"@balena/compose": "^4.0.1",
"@balena/compose": "^6.0.0",
"@balena/dockerignore": "^1.0.2",
"@balena/env-parsing": "^1.1.8",
"@balena/es-version": "^1.0.1",
"@oclif/core": "^4.0.8",
"@oclif/core": "^4.0.31",
"@sentry/node": "^6.16.1",
"balena-config-json": "^4.2.0",
"balena-device-init": "^7.0.1",
"balena-device-init": "8.0.0-build-decaffeinate-67ac7d853a63cde2d4a89347889b2ee42748cd5c-1",
"balena-errors": "^4.7.3",
"balena-image-fs": "^7.0.6",
"balena-preload": "^15.0.6",
"balena-sdk": "^19.7.3",
"balena-preload": "^16.0.0",
"balena-sdk": "^20.8.0",
"balena-semver": "^2.3.0",
"balena-settings-client": "^5.0.2",
"balena-settings-storage": "^8.1.0",
"body-parser": "^1.19.1",
"bonjour-service": "^1.2.1",
"chalk": "^3.0.0",
"chalk": "^4.0.0",
"chokidar": "^3.5.2",
"cli-truncate": "^2.1.0",
"color-hash": "^1.1.1",
@ -231,6 +231,7 @@
"is-root": "^2.1.0",
"js-yaml": "^4.1.0",
"JSONStream": "^1.0.3",
"jwt-decode": "^3.1.2",
"livepush": "^3.5.1",
"lodash": "^4.17.21",
"mime": "^2.4.6",
@ -273,6 +274,6 @@
}
},
"versionist": {
"publishedAt": "2024-10-17T14:56:39.279Z"
"publishedAt": "2024-12-17T11:34:56.167Z"
}
}

View File

@ -1,5 +1,5 @@
diff --git a/node_modules/@oclif/core/lib/help/command.js b/node_modules/@oclif/core/lib/help/command.js
index 90922c8..6b7f417 100644
index 33105a0..0436982 100644
--- a/node_modules/@oclif/core/lib/help/command.js
+++ b/node_modules/@oclif/core/lib/help/command.js
@@ -58,7 +58,8 @@ class CommandHelp extends formatter_1.HelpFormatter {
@ -13,10 +13,10 @@ index 90922c8..6b7f417 100644
if (a.default)
description = `${(0, theme_1.colorize)(this.config?.theme?.flagDefaultValue, `[default: ${a.default}]`)} ${description}`;
diff --git a/node_modules/@oclif/core/lib/help/index.js b/node_modules/@oclif/core/lib/help/index.js
index 4a34b89..d7eb6ac 100644
index 0b48c0e..ff4fed4 100644
--- a/node_modules/@oclif/core/lib/help/index.js
+++ b/node_modules/@oclif/core/lib/help/index.js
@@ -172,11 +172,12 @@ class Help extends HelpBase {
@@ -173,11 +173,12 @@ class Help extends HelpBase {
}
this.log(this.formatCommand(command));
this.log('');

View File

@ -101,11 +101,9 @@ async function init() {
/** Execute the oclif parser and the CLI command. */
async function oclifRun(command: string[], options: AppOptions) {
let deprecationPromise: Promise<void>;
let deprecationPromise: Promise<void> | undefined;
// check and enforce the CLI's deprecation policy
if (unsupportedFlag || process.env.BALENARC_UNSUPPORTED) {
deprecationPromise = Promise.resolve();
} else {
if (!(unsupportedFlag || process.env.BALENARC_UNSUPPORTED)) {
const { DeprecationChecker } = await import('./deprecation');
const deprecationChecker = new DeprecationChecker(packageJSON.version);
// warnAndAbortIfDeprecated uses previously cached data only

View File

@ -17,9 +17,20 @@
import { Args, Command } from '@oclif/core';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
async function isLoggedInWithJwt() {
const balena = getBalenaSdk();
try {
const token = await balena.auth.getToken();
const { default: jwtDecode } = await import('jwt-decode');
jwtDecode(token);
return true;
} catch {
return false;
}
}
export default class GenerateCmd extends Command {
public static description = stripIndent`
Generate a new balenaCloud API key.
@ -39,10 +50,6 @@ export default class GenerateCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {
@ -53,6 +60,13 @@ export default class GenerateCmd extends Command {
key = await getBalenaSdk().models.apiKey.create(params.name);
} catch (e) {
if (e.name === 'BalenaNotLoggedIn') {
if (await isLoggedInWithJwt()) {
throw new ExpectedError(stripIndent`
This command requires you to have been recently authenticated.
Please login again with 'balena login'.
In case you are using the Web authorization method, you need to logout and re-login to the dashboard first.
`);
}
throw new ExpectedError(stripIndent`
This command cannot be run when logged in with an API key.
Please login again with 'balena login' and select an alternative method.

View File

@ -21,6 +21,7 @@ import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
export default class APIKeyListCmd extends Command {
public static aliases = ['api-keys'];
public static deprecateAliases = true;
public static description = stripIndent`
Print a list of balenaCloud API keys.
@ -32,7 +33,6 @@ export default class APIKeyListCmd extends Command {
public static examples = ['$ balena api-key list'];
public static flags = {
help: cf.help,
user: Flags.boolean({
char: 'u',
description: 'show API keys for your user',
@ -51,7 +51,7 @@ export default class APIKeyListCmd extends Command {
await getApplication(getBalenaSdk(), options.fleet, {
$select: 'actor',
})
).actor
).actor.__id
: await getBalenaSdk().auth.getActorId();
const keys = await getBalenaSdk().pine.get({
resource: 'api_key',

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class RevokeCmd extends Command {
@ -40,10 +39,6 @@ export default class RevokeCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {
@ -55,9 +50,9 @@ export default class RevokeCmd extends Command {
return;
}
await Promise.all(
apiKeyIds.map(
async (id) => await getBalenaSdk().models.apiKey.revoke(Number(id)),
),
apiKeyIds.map(async (id) => {
await getBalenaSdk().models.apiKey.revoke(Number(id));
}),
);
console.log('Successfully revoked the given API keys');
}

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class AppCreateCmd extends Command {
@ -28,10 +27,10 @@ export default class AppCreateCmd extends Command {
You can specify the organization the app should belong to using
the \`--organization\` option. The organization's handle, not its name,
should be provided. Organization handles can be listed with the
\`balena orgs\` command.
\`balena organization list\` command.
The app's default device type is specified with the \`--type\` option.
The \`balena devices supported\` command can be used to list the available
The \`balena device-type list\` command can be used to list the available
device types.
Interactive dropdowns will be shown for selection if no device type or
@ -62,9 +61,8 @@ export default class AppCreateCmd extends Command {
type: Flags.string({
char: 't',
description:
'app device type (Check available types with `balena devices supported`)',
'app device type (Check available types with `balena device-type list`)',
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class BlockCreateCmd extends Command {
@ -28,10 +27,10 @@ export default class BlockCreateCmd extends Command {
You can specify the organization the block should belong to using
the \`--organization\` option. The organization's handle, not its name,
should be provided. Organization handles can be listed with the
\`balena orgs\` command.
\`balena organization list\` command.
The block's default device type is specified with the \`--type\` option.
The \`balena devices supported\` command can be used to list the available
The \`balena device-type list\` command can be used to list the available
device types.
Interactive dropdowns will be shown for selection if no device type or
@ -62,9 +61,8 @@ export default class BlockCreateCmd extends Command {
type: Flags.string({
char: 't',
description:
'block device type (Check available types with `balena devices supported`)',
'block device type (Check available types with `balena device-type list`)',
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -36,15 +36,16 @@ import { buildProject, composeCliFlags } from '../../utils/compose_ts';
import type { BuildOpts, DockerCliFlags } from '../../utils/docker';
import { dockerCliFlags } from '../../utils/docker';
// TODO: For this special one we can't use Interfaces.InferredFlags/InferredArgs
// because of the 'registry-secrets' type which is defined in the actual code
// as a path (string | undefined) but then the cli turns it into an object
interface FlagsDef extends ComposeCliFlags, DockerCliFlags {
type ComposeGenerateOptsParam = Parameters<typeof compose.generateOpts>[0];
interface PrepareBuildOpts
extends ComposeCliFlags,
DockerCliFlags,
ComposeGenerateOptsParam {
arch?: string;
deviceType?: string;
fleet?: string;
source?: string; // Not part of command profile - source param copied here.
help: void;
source?: string;
}
export default class BuildCmd extends Command {
@ -95,9 +96,6 @@ ${dockerignoreHelp}
fleet: cf.fleet,
...composeCliFlags,
...dockerCliFlags,
// NOTE: Not supporting -h for help, because of clash with -h in DockerCliFlags
// Revisit this in future release.
help: Flags.help({}),
};
public static primary = true;
@ -117,29 +115,31 @@ ${dockerignoreHelp}
const logger = Logger.getLogger();
logger.logDebug('Parsing input...');
// `build` accepts `source` as a parameter, but compose expects it as an option
options.source = params.source;
delete params.source;
const prepareBuildOpts = {
...options,
source: params.source,
};
await this.resolveArchFromDeviceType(sdk, options);
await this.resolveArchFromDeviceType(sdk, prepareBuildOpts);
await this.validateOptions(options, sdk);
await this.validateOptions(prepareBuildOpts, sdk);
// Build args are under consideration for removal - warn user
if (options.buildArg) {
if (prepareBuildOpts.buildArg) {
console.log(buildArgDeprecation);
}
const app = await this.getAppAndResolveArch(options);
const app = await this.getAppAndResolveArch(prepareBuildOpts);
const { docker, buildOpts, composeOpts } = await this.prepareBuild(options);
const { docker, buildOpts, composeOpts } =
await this.prepareBuild(prepareBuildOpts);
try {
await this.buildProject(docker, logger, composeOpts, {
appType: app?.application_type?.[0],
arch: options.arch!,
deviceType: options.deviceType!,
buildEmulated: options.emulated,
arch: prepareBuildOpts.arch!,
deviceType: prepareBuildOpts.deviceType!,
buildEmulated: prepareBuildOpts.emulated,
buildOpts,
});
} catch (err) {
@ -151,7 +151,7 @@ ${dockerignoreHelp}
logger.logSuccess('Build succeeded!');
}
protected async validateOptions(opts: FlagsDef, sdk: BalenaSDK) {
protected async validateOptions(opts: PrepareBuildOpts, sdk: BalenaSDK) {
// Validate option combinations
if (
(opts.fleet == null && (opts.arch == null || opts.deviceType == null)) ||
@ -179,7 +179,10 @@ ${dockerignoreHelp}
opts['registry-secrets'] = registrySecrets;
}
protected async resolveArchFromDeviceType(sdk: BalenaSDK, opts: FlagsDef) {
protected async resolveArchFromDeviceType(
sdk: BalenaSDK,
opts: PrepareBuildOpts,
) {
if (opts.deviceType != null && opts.arch == null) {
try {
const deviceTypeOpts = {
@ -212,7 +215,7 @@ ${dockerignoreHelp}
}
}
protected async getAppAndResolveArch(opts: FlagsDef) {
protected async getAppAndResolveArch(opts: PrepareBuildOpts) {
if (opts.fleet) {
const { getAppWithArch } = await import('../../utils/helpers');
const app = await getAppWithArch(opts.fleet);
@ -222,7 +225,7 @@ ${dockerignoreHelp}
}
}
protected async prepareBuild(options: FlagsDef) {
protected async prepareBuild(options: PrepareBuildOpts) {
const { getDocker, generateBuildOpts } = await import('../../utils/docker');
const [docker, buildOpts, composeOpts] = await Promise.all([
getDocker(options),

View File

@ -82,7 +82,7 @@ export default class ConfigGenerateCmd extends Command {
}),
deviceType: Flags.string({
description:
"device type slug (run 'balena devices supported' for possible values)",
"device type slug (run 'balena device-type list' for possible values)",
}),
'generate-device-api-key': Flags.boolean({
description: 'generate a fresh device key for the device',
@ -117,7 +117,6 @@ export default class ConfigGenerateCmd extends Command {
'expiry date assigned to generated provisioning api key (format: YYYY-MM-DD)',
exclusive: ['device'],
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -44,7 +44,6 @@ export default class ConfigInjectCmd extends Command {
public static flags = {
drive: cf.driveOrImg,
help: cf.help,
};
public static root = true;

View File

@ -38,7 +38,6 @@ export default class ConfigReadCmd extends Command {
public static flags = {
drive: cf.driveOrImg,
help: cf.help,
json: cf.json,
};

View File

@ -44,7 +44,6 @@ export default class ConfigReconfigureCmd extends Command {
description: 'show advanced commands',
char: 'v',
}),
help: cf.help,
version: Flags.string({
description: 'balenaOS version, for example "2.32.0" or "2.44.0+rev1"',
}),

View File

@ -49,7 +49,6 @@ export default class ConfigWriteCmd extends Command {
public static flags = {
drive: cf.driveOrImg,
help: cf.help,
};
public static root = true;

View File

@ -60,7 +60,6 @@ interface FlagsDef extends ComposeCliFlags, DockerCliFlags {
'release-tag'?: string[];
draft: boolean;
note?: string;
help: void;
}
export default class DeployCmd extends Command {
@ -139,9 +138,6 @@ ${dockerignoreHelp}
note: Flags.string({ description: 'The notes for this release' }),
...composeCliFlags,
...dockerCliFlags,
// NOTE: Not supporting -h for help, because of clash with -h in DockerCliFlags
// Revisit this in future release.
help: Flags.help({}),
};
public static authenticated = true;

View File

@ -17,14 +17,20 @@
import { Flags, Command } from '@oclif/core';
import type * as BalenaSdk from 'balena-sdk';
import * as _ from 'lodash';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
export default class DevicesSupportedCmd extends Command {
public static description = stripIndent`
List the supported device types (like 'raspberrypi3' or 'intel-nuc').
export default class DeviceTypeListCmd extends Command {
public static aliases = ['devices supported'];
public static deprecateAliases = true;
List the supported device types (like 'raspberrypi3' or 'intel-nuc').
public static description = stripIndent`
List the device types supported by balena (like 'raspberrypi3' or 'intel-nuc').
List the device types supported by balena (like 'raspberrypi3' or 'intel-nuc').
By default, only actively supported device types are listed.
The --all option can be used to list all device types, including those that are
no longer supported by balena.
The --json option is recommended when scripting the output of this command,
because the JSON format is less likely to change and it better represents data
@ -33,20 +39,24 @@ export default class DevicesSupportedCmd extends Command {
(https://stedolan.github.io/jq/manual/).
`;
public static examples = [
'$ balena devices supported',
'$ balena devices supported --json',
'$ balena device-type list',
'$ balena device-type list --all',
'$ balena device-type list --json',
];
public static flags = {
help: cf.help,
json: Flags.boolean({
char: 'j',
description: 'produce JSON output instead of tabular output',
}),
all: Flags.boolean({
description: 'include device types no longer supported by balena',
default: false,
}),
};
public async run() {
const { flags: options } = await this.parse(DevicesSupportedCmd);
const { flags: options } = await this.parse(DeviceTypeListCmd);
const pineOptions = {
$select: ['slug', 'name'],
$expand: {
@ -57,9 +67,11 @@ export default class DevicesSupportedCmd extends Command {
},
},
} satisfies BalenaSdk.PineOptions<BalenaSdk.DeviceType>;
const dts = (await getBalenaSdk().models.deviceType.getAllSupported(
pineOptions,
)) as Array<
const dts = (
options.all
? await getBalenaSdk().models.deviceType.getAll(pineOptions)
: await getBalenaSdk().models.deviceType.getAllSupported(pineOptions)
) as Array<
BalenaSdk.PineTypedResult<BalenaSdk.DeviceType, typeof pineOptions>
>;
interface DT {

View File

@ -42,7 +42,6 @@ export default class DeviceDeactivateCmd extends Command {
public static flags = {
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;

View File

@ -16,10 +16,12 @@
*/
import { Flags, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getCliUx, stripIndent } from '../../utils/lazy';
export default class ScanCmd extends Command {
export default class DeviceDetectCmd extends Command {
public static aliases = ['scan'];
public static deprecateAliases = true;
public static description = stripIndent`
Scan for balenaOS devices on your local network.
@ -32,9 +34,9 @@ export default class ScanCmd extends Command {
`;
public static examples = [
'$ balena scan',
'$ balena scan --timeout 120',
'$ balena scan --verbose',
'$ balena device detect',
'$ balena device detect --timeout 120',
'$ balena device detect --verbose',
];
public static flags = {
@ -47,7 +49,6 @@ export default class ScanCmd extends Command {
char: 't',
description: 'scan timeout in seconds',
}),
help: cf.help,
json: Flags.boolean({
default: false,
char: 'j',
@ -70,7 +71,7 @@ export default class ScanCmd extends Command {
const dockerPort = 2375;
const dockerTimeout = 2000;
const { flags: options } = await this.parse(ScanCmd);
const { flags: options } = await this.parse(DeviceDetectCmd);
const discoverTimeout =
options.timeout != null ? options.timeout * 1000 : undefined;
@ -90,7 +91,7 @@ export default class ScanCmd extends Command {
try {
await docker.ping();
return true;
} catch (err) {
} catch {
return false;
}
}),
@ -144,10 +145,10 @@ export default class ScanCmd extends Command {
if (!options.verbose) {
devicesInfo.forEach((d: any) => {
d.dockerInfo = _.isObject(d.dockerInfo)
? _.pick(d.dockerInfo, ScanCmd.dockerInfoProperties)
? _.pick(d.dockerInfo, DeviceDetectCmd.dockerInfoProperties)
: d.dockerInfo;
d.dockerVersion = _.isObject(d.dockerVersion)
? _.pick(d.dockerVersion, ScanCmd.dockerVersionProperties)
? _.pick(d.dockerVersion, DeviceDetectCmd.dockerVersionProperties)
: d.dockerVersion;
});
}
@ -164,8 +165,9 @@ export default class ScanCmd extends Command {
if (!options.json && cmdOutput.length === 0) {
console.error(
process.platform === 'win32'
? ScanCmd.noDevicesFoundMessage + ScanCmd.windowsTipMessage
: ScanCmd.noDevicesFoundMessage,
? DeviceDetectCmd.noDevicesFoundMessage +
DeviceDetectCmd.windowsTipMessage
: DeviceDetectCmd.noDevicesFoundMessage,
);
return;
}
@ -197,11 +199,11 @@ export default class ScanCmd extends Command {
protected static windowsTipMessage = `
Note for Windows users:
The 'scan' command relies on the Bonjour service. Check whether Bonjour is
The 'device detect' command relies on the Bonjour service. Check whether Bonjour is
installed (Control Panel > Programs and Features). If not, you can download
Bonjour for Windows (included with Bonjour Print Services) from here:
https://support.apple.com/kb/DL999
After installing Bonjour, restart your PC and run the 'balena scan' command
After installing Bonjour, restart your PC and run the 'balena device detect' command
again.`;
}

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { ExpectedError } from '../../errors';
@ -35,10 +34,6 @@ export default class DeviceIdentifyCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -63,7 +63,6 @@ export default class DeviceCmd extends Command {
public static flags = {
json: cf.json,
help: cf.help,
view: Flags.boolean({
default: false,
description: 'open device dashboard page',

View File

@ -28,7 +28,6 @@ interface FlagsDef {
'os-version'?: string;
drive?: string;
config?: string;
help: void;
'provisioning-key-name'?: string;
'provisioning-key-expiry-date'?: string;
}
@ -100,7 +99,6 @@ export default class DeviceInitCmd extends Command {
description:
'expiry date assigned to generated provisioning api key (format: YYYY-MM-DD)',
}),
help: cf.help,
};
public static authenticated = true;
@ -157,7 +155,7 @@ export default class DeviceInitCmd extends Command {
try {
logger.logDebug(`Process failed, removing device ${device.uuid}`);
await balena.models.device.remove(device.uuid);
} catch (e) {
} catch {
// Ignore removal failures, and throw original error
}
throw e;

View File

@ -37,6 +37,7 @@ const devicesSelectFields = {
export default class DeviceListCmd extends Command {
public static aliases = ['devices'];
public static deprecateAliases = true;
public static description = stripIndent`
List all devices.
@ -58,7 +59,6 @@ export default class DeviceListCmd extends Command {
public static flags = {
fleet: cf.fleet,
json: cf.json,
help: cf.help,
};
public static primary = true;

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class DeviceLocalModeCmd extends Command {
@ -54,7 +53,6 @@ export default class DeviceLocalModeCmd extends Command {
description: 'output boolean indicating local mode status',
exclusive: ['enable', 'disable'],
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -16,13 +16,15 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import type { LogMessage } from 'balena-sdk';
const MAX_RETRY = 1000;
export default class LogsCmd extends Command {
export default class DeviceLogsCmd extends Command {
public static aliases = ['logs'];
public static deprecateAliases = true;
public static description = stripIndent`
Show device logs.
@ -42,15 +44,15 @@ export default class LogsCmd extends Command {
Note: --service and --system flags must come after the device parameter, as per examples.
`;
public static examples = [
'$ balena logs 23c73a1',
'$ balena logs 23c73a1 --tail',
'$ balena device logs 23c73a1',
'$ balena device logs 23c73a1 --tail',
'',
'$ balena logs 192.168.0.31',
'$ balena logs 192.168.0.31 --service my-service',
'$ balena logs 192.168.0.31 --service my-service-1 --service my-service-2',
'$ balena device logs 192.168.0.31',
'$ balena device logs 192.168.0.31 --service my-service',
'$ balena device logs 192.168.0.31 --service my-service-1 --service my-service-2',
'',
'$ balena logs 23c73a1.local --system',
'$ balena logs 23c73a1.local --system --service my-service',
'$ balena device logs 23c73a1.local --system',
'$ balena device logs 23c73a1.local --system --service my-service',
];
public static args = {
@ -84,13 +86,12 @@ export default class LogsCmd extends Command {
'Only show system logs. This can be used in combination with --service.',
char: 'S',
}),
help: cf.help,
};
public static primary = true;
public async run() {
const { args: params, flags: options } = await this.parse(LogsCmd);
const { args: params, flags: options } = await this.parse(DeviceLogsCmd);
const balena = getBalenaSdk();
const { serviceIdToName } = await import('../../utils/cloud');
@ -134,7 +135,7 @@ export default class LogsCmd extends Command {
logger.logDebug('Checking we can access device');
try {
await deviceApi.ping();
} catch (e) {
} catch {
const { ExpectedError } = await import('../../errors');
throw new ExpectedError(
`Cannot access device at address ${params.device}. Device may not be in local mode.`,

View File

@ -55,7 +55,6 @@ export default class DeviceMoveCmd extends Command {
public static flags = {
fleet: cf.fleet,
help: cf.help,
};
public static authenticated = true;

View File

@ -20,7 +20,10 @@ import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class NoteCmd extends Command {
export default class DeviceNoteCmd extends Command {
public static aliases = ['notes'];
public static deprecateAliases = true;
public static description = stripIndent`
Set a device note.
@ -31,8 +34,8 @@ export default class NoteCmd extends Command {
`;
public static examples = [
'$ balena note "My useful note" --device 7cf02a6',
'$ cat note.txt | balena note --device 7cf02a6',
'$ balena device note "My useful note" --device 7cf02a6',
'$ cat note.txt | balena device note --device 7cf02a6',
];
public static args = {
@ -47,13 +50,12 @@ export default class NoteCmd extends Command {
exclusive: ['device'],
hidden: true,
}),
help: cf.help,
};
public static authenticated = true;
public async run() {
const { args: params, flags: options } = await this.parse(NoteCmd);
const { args: params, flags: options } = await this.parse(DeviceNoteCmd);
if (params.note?.length === 0) {
throw new ExpectedError('Missing note content');

View File

@ -20,6 +20,7 @@ import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent, getCliForm } from '../../utils/lazy';
import type { Device } from 'balena-sdk';
import { ExpectedError } from '../../errors';
import { getExpandedProp } from '../../utils/pine';
export default class DeviceOsUpdateCmd extends Command {
public static description = stripIndent`
@ -57,7 +58,6 @@ export default class DeviceOsUpdateCmd extends Command {
exclusive: ['version'],
}),
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;
@ -127,27 +127,64 @@ export default class DeviceOsUpdateCmd extends Command {
);
}
} else {
const choices = await Promise.all(
hupVersionInfo.versions.map(async (version) => {
const takeoverRequired =
(await sdk.models.os.getOsUpdateType(
getExpandedProp(is_of__device_type, 'slug')!,
currentOsVersion,
version,
)) === 'takeover';
return {
name: `${version}${hupVersionInfo.recommended === version ? ' (recommended)' : ''}${takeoverRequired ? ' ADVANCED UPDATE: Requires disk re-partitioning with no rollback option' : ''}`,
value: version,
};
}),
);
targetOsVersion = await getCliForm().ask({
message: 'Target OS version',
type: 'list',
choices: hupVersionInfo.versions.map((version) => ({
name:
hupVersionInfo.recommended === version
? `${version} (recommended)`
: version,
value: version,
})),
choices,
});
}
const takeoverRequired =
(await sdk.models.os.getOsUpdateType(
getExpandedProp(is_of__device_type, 'slug')!,
currentOsVersion,
targetOsVersion,
)) === 'takeover';
const patterns = await import('../../utils/patterns');
// Warn the user if the update requires a takeover
if (takeoverRequired) {
await patterns.confirm(
options.yes || false,
stripIndent`Before you proceed, note that this update process is different from a regular HostOS Update:
DATA LOSS: This update requires disk re-partitioning, which will erase all data stored on the device.
NO ROLLBACK: Unlike our HostOS update mechanism, this process does not allow reverting to a previous version in case of failure.
Make sure to back up all important data before continuing. For more details, check our documentation: https://docs.balena.io/reference/OS/updates/update-process/
`,
);
}
// Confirm and start update
await patterns.confirm(
options.yes || false,
'Host OS updates require a device restart when they complete. Are you sure you want to proceed?',
);
await sdk.models.device.startOsUpdate(uuid, targetOsVersion);
await patterns.awaitDeviceOsUpdate(uuid, targetOsVersion);
await sdk.models.device
.startOsUpdate(uuid, targetOsVersion, {
runDetached: true,
})
.then(() => {
console.log(
`The balena OS update has started. You can keep track of the progress via the dashboard.\n` +
`To open the dashboard page related to a device via the CLI, you can use \`balena device UUID --view\``,
);
})
.catch((error) => {
console.error(`Failed to start OS update for device ${uuid}:`, error);
});
}
}

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { getExpandedProp } from '../../utils/pine';
@ -43,10 +42,6 @@ export default class DevicePinCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {
@ -56,7 +51,7 @@ export default class DevicePinCmd extends Command {
const device = await balena.models.device.get(params.uuid, {
$expand: {
should_be_running__release: {
is_pinned_on__release: {
$select: 'commit',
},
belongs_to__application: {
@ -66,7 +61,7 @@ export default class DevicePinCmd extends Command {
});
const pinnedRelease = getExpandedProp(
device.should_be_running__release,
device.is_pinned_on__release,
'commit',
);
const appSlug = getExpandedProp(device.belongs_to__application, 'slug');

View File

@ -17,7 +17,6 @@
import { Flags, Args, Command } from '@oclif/core';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class DevicePublicUrlCmd extends Command {
@ -56,7 +55,6 @@ export default class DevicePublicUrlCmd extends Command {
description: 'determine if public URL is enabled',
exclusive: ['enable', 'disable'],
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getCliUx, stripIndent } from '../../utils/lazy';
export default class DevicePurgeCmd extends Command {
@ -41,10 +40,6 @@ export default class DevicePurgeCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -36,7 +36,6 @@ export default class DeviceRebootCmd extends Command {
public static flags = {
force: cf.force,
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Flags, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import * as ca from '../../utils/common-args';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
@ -50,9 +49,8 @@ export default class DeviceRegisterCmd extends Command {
}),
deviceType: Flags.string({
description:
"device type slug (run 'balena devices supported' for possible values)",
"device type slug (run 'balena device-type list' for possible values)",
}),
help: cf.help,
};
public static authenticated = true;
@ -78,6 +76,6 @@ export default class DeviceRegisterCmd extends Command {
options.deviceType,
);
return result && result.uuid;
return result.uuid;
}
}

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent, getCliForm } from '../../utils/lazy';
export default class DeviceRenameCmd extends Command {
@ -42,10 +41,6 @@ export default class DeviceRenameCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getCliUx, stripIndent } from '../../utils/lazy';
import type {
BalenaSDK,
@ -58,7 +57,6 @@ export default class DeviceRestartCmd extends Command {
'comma-separated list (no blank spaces) of service names to restart',
char: 's',
}),
help: cf.help,
};
public static authenticated = true;
@ -156,7 +154,7 @@ export default class DeviceRestartCmd extends Command {
async restartAllServices(balena: BalenaSDK, deviceUuid: string) {
// Note: device.restartApplication throws `BalenaDeviceNotFound: Device not found` if device not online.
// Need to use device.get first to distinguish between non-existant and offline devices.
// Need to use device.get first to distinguish between non-existant and disconnected devices.
// Remove this workaround when SDK issue resolved: https://github.com/balena-io/balena-sdk/issues/649
const { instanceOf, ExpectedError } = await import('../../errors');
try {

View File

@ -44,7 +44,6 @@ export default class DeviceRmCmd extends Command {
public static flags = {
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;

View File

@ -37,7 +37,6 @@ export default class DeviceShutdownCmd extends Command {
public static flags = {
force: cf.force,
help: cf.help,
};
public static authenticated = true;

View File

@ -16,14 +16,16 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import {
parseAsInteger,
validateLocalHostnameOrIp,
} from '../../utils/validation';
export default class SshCmd extends Command {
export default class DeviceSSHCmd extends Command {
public static aliases = ['ssh'];
public static deprecateAliases = true;
public static description = stripIndent`
Open a SSH prompt on a device's host OS or service container.
@ -52,14 +54,14 @@ export default class SshCmd extends Command {
`;
public static examples = [
'$ balena ssh MyFleet',
'$ balena ssh f49cefd',
'$ balena ssh f49cefd my-service',
'$ balena ssh f49cefd --port <port>',
'$ balena ssh 192.168.0.1 --verbose',
'$ balena ssh f49cefd.local my-service',
'$ echo "uptime; exit;" | balena ssh f49cefd',
'$ echo "uptime; exit;" | balena ssh 192.168.0.1 myService',
'$ balena device ssh MyFleet',
'$ balena device ssh f49cefd',
'$ balena device ssh f49cefd my-service',
'$ balena device ssh f49cefd --port <port>',
'$ balena device ssh 192.168.0.1 --verbose',
'$ balena device ssh f49cefd.local my-service',
'$ echo "uptime; exit;" | balena device ssh f49cefd',
'$ echo "uptime; exit;" | balena device ssh 192.168.0.1 myService',
];
public static args = {
@ -80,7 +82,7 @@ export default class SshCmd extends Command {
SSH server port number (default 22222) if the target is an IP address or .local
hostname. Otherwise, port number for the balenaCloud gateway (default 22).`,
char: 'p',
parse: async (p) => parseAsInteger(p, 'port'),
parse: (p) => parseAsInteger(p, 'port'),
}),
tty: Flags.boolean({
default: false,
@ -97,25 +99,25 @@ export default class SshCmd extends Command {
default: false,
description: 'bypass global proxy configuration for the ssh connection',
}),
help: cf.help,
};
public static primary = true;
public static offlineCompatible = true;
public async run() {
const { args: params, flags: options } = await this.parse(SshCmd);
const { args: params, flags: options } = await this.parse(DeviceSSHCmd);
// Local connection
if (validateLocalHostnameOrIp(params.fleetOrDevice)) {
const { performLocalDeviceSSH } = await import('../../utils/device/ssh');
return await performLocalDeviceSSH({
await performLocalDeviceSSH({
hostname: params.fleetOrDevice,
port: options.port || 'local',
forceTTY: options.tty,
verbose: options.verbose,
service: params.service,
});
return;
}
// Remote connection
@ -131,7 +133,7 @@ export default class SshCmd extends Command {
const useProxy = !!proxyConfig && !options.noproxy;
// this will be a tunnelled SSH connection...
await checkNotUsingOfflineMode();
checkNotUsingOfflineMode();
await checkLoggedIn();
const deviceUuid = await getOnlineTargetDeviceUuid(
sdk,

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getCliUx, stripIndent } from '../../utils/lazy';
import type { BalenaSDK } from 'balena-sdk';
@ -45,10 +44,6 @@ export default class DeviceStartServiceCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getCliUx, stripIndent } from '../../utils/lazy';
import type { BalenaSDK } from 'balena-sdk';
@ -45,10 +44,6 @@ export default class DeviceStopServiceCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class DeviceTrackFleetCmd extends Command {
@ -34,10 +33,6 @@ export default class DeviceTrackFleetCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -21,13 +21,15 @@ import {
InvalidPortMappingError,
ExpectedError,
} from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { lowercaseIfSlug } from '../../utils/normalization';
import type { Server, Socket } from 'net';
export default class TunnelCmd extends Command {
export default class DeviceTunnelCmd extends Command {
public static aliases = ['tunnel'];
public static deprecateAliases = true;
public static description = stripIndent`
Tunnel local ports to your balenaOS device.
@ -54,19 +56,19 @@ export default class TunnelCmd extends Command {
public static examples = [
'# map remote port 22222 to localhost:22222',
'$ balena tunnel myFleet -p 22222',
'$ balena device tunnel myFleet -p 22222',
'',
'# map remote port 22222 to localhost:222',
'$ balena tunnel 2ead211 -p 22222:222',
'$ balena device tunnel 2ead211 -p 22222:222',
'',
'# map remote port 22222 to any address on your host machine, port 22222',
'$ balena tunnel 1546690 -p 22222:0.0.0.0',
'$ balena device tunnel 1546690 -p 22222:0.0.0.0',
'',
'# map remote port 22222 to any address on your host machine, port 222',
'$ balena tunnel myFleet -p 22222:0.0.0.0:222',
'$ balena device tunnel myFleet -p 22222:0.0.0.0:222',
'',
'# multiple port tunnels can be specified at any one time',
'$ balena tunnel myFleet -p 8080:3000 -p 8081:9000',
'$ balena device tunnel myFleet -p 8080:3000 -p 8081:9000',
];
public static args = {
@ -84,14 +86,13 @@ export default class TunnelCmd extends Command {
char: 'p',
multiple: true,
}),
help: cf.help,
};
public static primary = true;
public static authenticated = true;
public async run() {
const { args: params, flags: options } = await this.parse(TunnelCmd);
const { args: params, flags: options } = await this.parse(DeviceTunnelCmd);
const Logger = await import('../../utils/logger');

View File

@ -23,7 +23,7 @@ import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
type FlagsDef = Interfaces.InferredFlags<typeof EnvsCmd.flags>;
type FlagsDef = Interfaces.InferredFlags<typeof EnvListCmd.flags>;
interface EnvironmentVariableInfo extends SDK.EnvironmentVariableBase {
fleet?: string | null; // fleet slug
@ -45,7 +45,10 @@ interface ServiceEnvironmentVariableInfo
serviceName?: string; // service name
}
export default class EnvsCmd extends Command {
export default class EnvListCmd extends Command {
public static aliases = ['envs'];
public static deprecateAliases = true;
public static description = stripIndent`
List the environment or config variables of a fleet, device or service.
@ -83,14 +86,14 @@ export default class EnvsCmd extends Command {
`;
public static examples = [
'$ balena envs --fleet myorg/myfleet',
'$ balena envs --fleet MyFleet --json',
'$ balena envs --fleet MyFleet --service MyService',
'$ balena envs --fleet MyFleet --config',
'$ balena envs --device 7cf02a6',
'$ balena envs --device 7cf02a6 --json',
'$ balena envs --device 7cf02a6 --config --json',
'$ balena envs --device 7cf02a6 --service MyService',
'$ balena env list --fleet myorg/myfleet',
'$ balena env list --fleet MyFleet --json',
'$ balena env list --fleet MyFleet --service MyService',
'$ balena env list --fleet MyFleet --config',
'$ balena env list --device 7cf02a6',
'$ balena env list --device 7cf02a6 --json',
'$ balena env list --device 7cf02a6 --config --json',
'$ balena env list --device 7cf02a6 --service MyService',
];
public static flags = {
@ -102,13 +105,12 @@ export default class EnvsCmd extends Command {
exclusive: ['service'],
}),
device: { ...cf.device, exclusive: ['fleet'] },
help: cf.help,
json: cf.json,
service: { ...cf.service, exclusive: ['config'] },
};
public async run() {
const { flags: options } = await this.parse(EnvsCmd);
const { flags: options } = await this.parse(EnvListCmd);
const variables: EnvironmentVariableInfo[] = [];

View File

@ -15,7 +15,6 @@
* limitations under the License.
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import * as ec from '../../utils/env-common';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { parseAsInteger } from '../../utils/validation';
@ -42,7 +41,7 @@ export default class EnvRenameCmd extends Command {
id: Args.integer({
required: true,
description: "variable's numeric database ID",
parse: async (input) => parseAsInteger(input, 'id'),
parse: (input) => parseAsInteger(input, 'id'),
}),
value: Args.string({
required: true,
@ -55,7 +54,6 @@ export default class EnvRenameCmd extends Command {
config: ec.booleanConfig,
device: ec.booleanDevice,
service: ec.booleanService,
help: cf.help,
};
public async run() {

View File

@ -46,7 +46,7 @@ export default class EnvRmCmd extends Command {
id: Args.integer({
required: true,
description: "variable's numeric database ID",
parse: async (input) => parseAsInteger(input, 'id'),
parse: (input) => parseAsInteger(input, 'id'),
}),
};

View File

@ -25,7 +25,6 @@ import { applicationIdInfo } from '../../utils/messages';
interface FlagsDef {
fleet?: string;
device?: string; // device UUID
help: void;
quiet: boolean;
service?: string; // service name
}
@ -35,11 +34,14 @@ interface ArgsDef {
value?: string;
}
export default class EnvAddCmd extends Command {
public static description = stripIndent`
Add env or config variable to fleets, devices or services.
export default class EnvSetCmd extends Command {
public static aliases = ['env add'];
public static deprecateAliases = true;
Add an environment or config variable to one or more fleets, devices or
public static description = stripIndent`
Add or update env or config variable to fleets, devices or services.
Add or update an environment or config variable to one or more fleets, devices or
services, as selected by the respective command-line options. Either the
--fleet or the --device option must be provided, and either may be be
used alongside the --service option to define a service-specific variable.
@ -66,15 +68,15 @@ export default class EnvAddCmd extends Command {
`;
public static examples = [
'$ balena env add TERM --fleet MyFleet',
'$ balena env add EDITOR vim -f myorg/myfleet',
'$ balena env add EDITOR vim --fleet MyFleet,MyFleet2',
'$ balena env add EDITOR vim --fleet MyFleet --service MyService',
'$ balena env add EDITOR vim --fleet MyFleet,MyFleet2 --service MyService,MyService2',
'$ balena env add EDITOR vim --device 7cf02a6',
'$ balena env add EDITOR vim --device 7cf02a6,d6f1433',
'$ balena env add EDITOR vim --device 7cf02a6 --service MyService',
'$ balena env add EDITOR vim --device 7cf02a6,d6f1433 --service MyService,MyService2',
'$ balena env set TERM --fleet MyFleet',
'$ balena env set EDITOR vim -f myorg/myfleet',
'$ balena env set EDITOR vim --fleet MyFleet,MyFleet2',
'$ balena env set EDITOR vim --fleet MyFleet --service MyService',
'$ balena env set EDITOR vim --fleet MyFleet,MyFleet2 --service MyService,MyService2',
'$ balena env set EDITOR vim --device 7cf02a6',
'$ balena env set EDITOR vim --device 7cf02a6,d6f1433',
'$ balena env set EDITOR vim --device 7cf02a6 --service MyService',
'$ balena env set EDITOR vim --device 7cf02a6,d6f1433 --service MyService,MyService2',
];
public static args = {
@ -95,13 +97,12 @@ export default class EnvAddCmd extends Command {
public static flags = {
fleet: { ...cf.fleet, exclusive: ['device'] },
device: { ...cf.device, exclusive: ['fleet'] },
help: cf.help,
quiet: cf.quiet,
service: cf.service,
};
public async run() {
const { args: params, flags: options } = await this.parse(EnvAddCmd);
const { args: params, flags: options } = await this.parse(EnvSetCmd);
const cmd = this;
if (!options.fleet && !options.device) {

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class FleetCreateCmd extends Command {
@ -28,10 +27,10 @@ export default class FleetCreateCmd extends Command {
You can specify the organization the fleet should belong to using
the \`--organization\` option. The organization's handle, not its name,
should be provided. Organization handles can be listed with the
\`balena orgs\` command.
\`balena organization list\` command.
The fleet's default device type is specified with the \`--type\` option.
The \`balena devices supported\` command can be used to list the available
The \`balena device-type list\` command can be used to list the available
device types.
Interactive dropdowns will be shown for selection if no device type or
@ -62,9 +61,8 @@ export default class FleetCreateCmd extends Command {
type: Flags.string({
char: 't',
description:
'fleet device type (Check available types with `balena devices supported`)',
'fleet device type (Check available types with `balena device-type list`)',
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -40,7 +40,6 @@ export default class FleetCmd extends Command {
};
public static flags = {
help: cf.help,
view: Flags.boolean({
default: false,
description: 'open fleet dashboard page',

View File

@ -28,6 +28,7 @@ interface ExtendedApplication extends ApplicationWithDeviceTypeSlug {
export default class FleetListCmd extends Command {
public static aliases = ['fleets'];
public static deprecateAliases = true;
public static description = stripIndent`
List all fleets.
@ -41,7 +42,6 @@ export default class FleetListCmd extends Command {
public static examples = ['$ balena fleet list'];
public static flags = {
help: cf.help,
json: cf.json,
};

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { getExpandedProp } from '../../utils/pine';
@ -43,10 +42,6 @@ export default class FleetPinCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import * as ca from '../../utils/common-args';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
@ -40,10 +39,6 @@ export default class FleetPurgeCmd extends Command {
fleet: ca.fleetRequired,
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import * as ca from '../../utils/common-args';
import { getBalenaSdk, stripIndent, getCliForm } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
@ -46,10 +45,6 @@ export default class FleetRenameCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -16,7 +16,6 @@
*/
import { Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import * as ca from '../../utils/common-args';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
@ -39,10 +38,6 @@ export default class FleetRestartCmd extends Command {
fleet: ca.fleetRequired,
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -44,7 +44,6 @@ export default class FleetRmCmd extends Command {
public static flags = {
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class FleetTrackLatestCmd extends Command {
@ -37,10 +36,6 @@ export default class FleetTrackLatestCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {

View File

@ -65,7 +65,6 @@ export default class JoinCmd extends Command {
description: 'the interval in minutes to check for updates',
char: 'i',
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
import { parseAsLocalHostnameOrIp } from '../../utils/validation';
@ -49,10 +48,6 @@ export default class LeaveCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public static primary = true;

View File

@ -17,7 +17,6 @@
import { Args, Command } from '@oclif/core';
import { promisify } from 'util';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class LocalConfigureCmd extends Command {
@ -39,10 +38,6 @@ export default class LocalConfigureCmd extends Command {
}),
};
public static flags = {
help: cf.help,
};
public static root = true;
public static offlineCompatible = true;
@ -257,10 +252,7 @@ export default class LocalConfigureCmd extends Command {
`${this.CONNECTIONS_FOLDER}/resin-sample.ignore`,
{ encoding: 'utf8' },
);
return await writeFileAsync(
`${this.CONNECTIONS_FOLDER}/resin-wifi`,
contents,
);
await writeFileAsync(`${this.CONNECTIONS_FOLDER}/resin-wifi`, contents);
});
} else if (_.includes(files, 'resin-sample')) {
// Legacy mode, to be removed later
@ -274,13 +266,13 @@ export default class LocalConfigureCmd extends Command {
} else {
// In case there's no file at all (shouldn't happen normally, but the file might have been removed)
await imagefs.interact(target, bootPartition, async (_fs) => {
return await promisify(_fs.writeFile)(
await promisify(_fs.writeFile)(
`${this.CONNECTIONS_FOLDER}/resin-wifi`,
this.CONNECTION_FILE,
);
});
}
return await this.getConfigurationSchema(bootPartition, connectionFileName);
return this.getConfigurationSchema(bootPartition, connectionFileName);
}
async removeHostname(schema: any) {

View File

@ -48,7 +48,6 @@ export default class LocalFlashCmd extends Command {
public static flags = {
drive: cf.drive,
yes: cf.yes,
help: cf.help,
};
public static offlineCompatible = true;

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent, getCliForm } from '../../utils/lazy';
import { ExpectedError } from '../../errors';
import type { WhoamiResult } from 'balena-sdk';
@ -29,7 +28,6 @@ interface FlagsDef {
user?: string;
password?: string;
port?: number;
help: void;
hideExperimentalWarning: boolean;
}
@ -111,7 +109,6 @@ export default class LoginCmd extends Command {
default: false,
description: 'Hides warning for experimental features',
}),
help: cf.help,
};
public static primary = true;
@ -135,7 +132,7 @@ export default class LoginCmd extends Command {
// We can safely assume this won't be undefined as doLogin will throw if this call fails
// We also don't need to worry too much about the amount of calls to whoami
// as these are cached by the SDK
const whoamiResult = (await balena.auth.whoami()) as WhoamiResult;
const whoamiResult = (await balena.auth.whoami())!;
if (whoamiResult.actorType !== 'user' && !options.hideExperimentalWarning) {
console.info(stripIndent`
@ -171,7 +168,7 @@ ${messages.reachingOut}`);
async doLogin(
loginOptions: FlagsDef,
balenaUrl: string = 'balena-cloud.com',
balenaUrl = 'balena-cloud.com',
token?: string,
): Promise<void> {
// Token

View File

@ -16,25 +16,23 @@
*/
import { Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
export default class OrgsCmd extends Command {
export default class OrganizationListCmd extends Command {
public static aliases = ['orgs'];
public static deprecateAliases = true;
public static description = stripIndent`
List all organizations.
list all the organizations that you are a member of.
`;
public static examples = ['$ balena orgs'];
public static flags = {
help: cf.help,
};
public static examples = ['$ balena organization list'];
public static authenticated = true;
public async run() {
await this.parse(OrgsCmd);
await this.parse(OrganizationListCmd);
const { getOwnOrganizations } = await import('../../utils/sdk');

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getCliForm, stripIndent } from '../../utils/lazy';
import * as _ from 'lodash';
import type { DeviceTypeJson } from 'balena-sdk';
@ -55,7 +54,6 @@ export default class OsBuildConfigCmd extends Command {
char: 'o',
required: true,
}),
help: cf.help,
};
public static authenticated = true;

View File

@ -154,7 +154,6 @@ export default class OsConfigureCmd extends Command {
'expiry date assigned to generated provisioning api key (format: YYYY-MM-DD)',
exclusive: ['config', 'device'],
}),
help: cf.help,
};
public static authenticated = true;
@ -293,7 +292,7 @@ export default class OsConfigureCmd extends Command {
for (const { name, content } of files) {
await imagefs.interact(image, bootPartition, async (_fs) => {
return await promisify(_fs.writeFile)(
await promisify(_fs.writeFile)(
path.join(CONNECTIONS_FOLDER, name),
content,
);

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class OsDownloadCmd extends Command {
@ -24,7 +23,7 @@ export default class OsDownloadCmd extends Command {
Download an unconfigured OS image.
Download an unconfigured OS image for the specified device type.
Check available device types with 'balena devices supported'.
Check available device types with 'balena device-type list'.
Note: Currently this command only works with balenaCloud, not openBalena.
If using openBalena, please download the OS from: https://www.balena.io/os/
@ -78,7 +77,6 @@ export default class OsDownloadCmd extends Command {
or 'menu-esr' (interactive menu, ESR versions)
`,
}),
help: cf.help,
};
public async run() {

View File

@ -51,7 +51,6 @@ export default class OsInitializeCmd extends Command {
type: cf.deviceType,
drive: cf.drive,
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;

View File

@ -16,7 +16,6 @@
*/
import { Flags, Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
export default class OsVersionsCmd extends Command {
@ -24,7 +23,7 @@ export default class OsVersionsCmd extends Command {
Show available balenaOS versions for the given device type.
Show the available balenaOS versions for the given device type.
Check available types with \`balena devices supported\`.
Check available types with \`balena device-type list\`.
balenaOS ESR versions can be listed with the '--esr' option. See also:
https://www.balena.io/docs/reference/OS/extended-support-release/
@ -40,7 +39,6 @@ export default class OsVersionsCmd extends Command {
};
public static flags = {
help: cf.help,
esr: Flags.boolean({
description: 'select balenaOS ESR versions',
default: false,

View File

@ -84,9 +84,9 @@ export default class PreloadCmd extends Command {
description: `\
The commit hash of the release to preload. Use "current" to specify the current
release (ignored if no appId is given). The current release is usually also the
latest, but can be pinned to a specific release. See:
https://www.balena.io/docs/learn/deploy/release-strategy/release-policy/
https://www.balena.io/docs/learn/more/masterclasses/fleet-management/#63-pin-using-the-api
latest, but can be pinned to a specific release. See:
https://www.balena.io/docs/learn/deploy/release-strategy/release-policy/
https://www.balena.io/docs/learn/more/masterclasses/fleet-management/#63-pin-using-the-api
https://github.com/balena-io-examples/staged-releases\
`,
char: 'c',
@ -109,7 +109,7 @@ https://github.com/balena-io-examples/staged-releases\
'additional-space': Flags.integer({
description:
'expand the image by this amount of bytes instead of automatically estimating the required amount',
parse: async (x) => parseAsInteger(x, 'additional-space'),
parse: (x) => parseAsInteger(x, 'additional-space'),
}),
'add-certificate': Flags.string({
description: `\
@ -126,11 +126,8 @@ Can be repeated to add multiple certificates.\
dockerPort: Flags.integer({
description:
'Docker daemon TCP port number (hint: 2375 for balena devices)',
parse: async (p) => parseAsInteger(p, 'dockerPort'),
parse: (p) => parseAsInteger(p, 'dockerPort'),
}),
// Not supporting -h for help, because of clash with -h in DockerCliFlags
// Revisit this in future release.
help: Flags.help({}),
};
public static authenticated = true;
@ -158,7 +155,7 @@ Can be repeated to add multiple certificates.\
------------------------------------------------------------------------------
`);
}
} catch (error) {
} catch {
throw new ExpectedError(
`The provided image path does not exist: ${params.image}`,
);
@ -195,11 +192,11 @@ Can be repeated to add multiple certificates.\
event.name,
));
if (event.action === 'start') {
return spinner.start();
} else {
console.log();
return spinner.stop();
spinner.start();
return;
}
console.log();
spinner.stop();
};
const commit = this.isCurrentCommit(options.commit || '')
@ -413,6 +410,8 @@ Can be repeated to add multiple certificates.\
const DEFAULT_CHOICE = { name: 'current', value: 'current' };
const choices = [DEFAULT_CHOICE].concat(
releases.map((release) => ({
// TODO: [next-major] consider changing this to use the release semver
// and maybe the commit as well
name: `${release.end_timestamp} - ${release.commit}`,
value: release.commit,
})),

View File

@ -17,7 +17,6 @@
import { Flags, Args, Command } from '@oclif/core';
import type { Interfaces } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { dockerignoreHelp, registrySecretsHelp } from '../../utils/messages';
import type { BalenaSDK } from 'balena-sdk';
@ -218,7 +217,6 @@ export default class PushCmd extends Command {
default: false,
}),
note: Flags.string({ description: 'The notes for this release' }),
help: cf.help,
};
public static primary = true;

View File

@ -17,7 +17,6 @@
import { Command } from '@oclif/core';
import { commitOrIdArg } from '.';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class ReleaseFinalizeCmd extends Command {
@ -40,10 +39,6 @@ export default class ReleaseFinalizeCmd extends Command {
'$ balena release finalize 1234567',
];
public static flags = {
help: cf.help,
};
public static args = {
commitOrId: commitOrIdArg({
description: 'the commit or ID of the release to finalize',

View File

@ -24,7 +24,7 @@ import { tryAsInteger } from '../../utils/validation';
import { jsonInfo } from '../../utils/messages';
export const commitOrIdArg = Args.custom({
parse: async (commitOrId: string) => tryAsInteger(commitOrId),
parse: tryAsInteger,
});
type FlagsDef = Interfaces.InferredFlags<typeof ReleaseCmd.flags>;
@ -43,7 +43,6 @@ export default class ReleaseCmd extends Command {
public static flags = {
json: cf.json,
help: cf.help,
composition: Flags.boolean({
default: false,
char: 'c',
@ -87,7 +86,7 @@ export default class ReleaseCmd extends Command {
balena: BalenaSdk.BalenaSDK,
options: FlagsDef,
) {
const fields: Array<keyof BalenaSdk.Release> = [
const fields = [
'id',
'commit',
'created_at',
@ -97,7 +96,7 @@ export default class ReleaseCmd extends Command {
'build_log',
'start_timestamp',
'end_timestamp',
];
] satisfies BalenaSdk.PineOptions<BalenaSdk.Release>['$select'];
const release = await balena.models.release.get(commitOrId, {
...(!options.json && { $select: fields }),

View File

@ -17,7 +17,6 @@
import { Command } from '@oclif/core';
import { commitOrIdArg } from '.';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class ReleaseInvalidateCmd extends Command {
@ -35,10 +34,6 @@ export default class ReleaseInvalidateCmd extends Command {
'$ balena release invalidate 1234567',
];
public static flags = {
help: cf.help,
};
public static args = {
commitOrId: commitOrIdArg({
description: 'the commit or ID of the release to invalidate',

View File

@ -24,6 +24,7 @@ import { jsonInfo } from '../../utils/messages';
export default class ReleaseListCmd extends Command {
public static aliases = ['releases'];
public static deprecateAliases = true;
public static description = stripIndent`
List all releases of a fleet.
@ -41,7 +42,6 @@ export default class ReleaseListCmd extends Command {
public static flags = {
json: cf.json,
help: cf.help,
};
public static args = {
@ -56,14 +56,14 @@ export default class ReleaseListCmd extends Command {
public async run() {
const { args: params, flags: options } = await this.parse(ReleaseListCmd);
const fields: Array<keyof BalenaSdk.Release> = [
const fields = [
'id',
'commit',
'created_at',
'status',
'semver',
'is_final',
];
] satisfies BalenaSdk.PineOptions<BalenaSdk.Release>['$select'];
const balena = getBalenaSdk();
const { getFleetSlug } = await import('../../utils/sdk');

View File

@ -17,7 +17,6 @@
import { Command } from '@oclif/core';
import { commitOrIdArg } from '.';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class ReleaseValidateCmd extends Command {
@ -34,10 +33,6 @@ export default class ReleaseValidateCmd extends Command {
'$ balena release validate 1234567',
];
public static flags = {
help: cf.help,
};
public static args = {
commitOrId: commitOrIdArg({
description: 'the commit or ID of the release to validate',

View File

@ -16,7 +16,6 @@
*/
import { Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class SettingsCmd extends Command {
@ -27,10 +26,6 @@ export default class SettingsCmd extends Command {
`;
public static examples = ['$ balena settings'];
public static flags = {
help: cf.help,
};
public async run() {
await this.parse(SettingsCmd);

View File

@ -16,11 +16,12 @@
*/
import { Args, Command } from '@oclif/core';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
export default class KeyAddCmd extends Command {
export default class SSHKeyAddCmd extends Command {
public static aliases = ['key add'];
public static deprecateAliases = true;
public static description = stripIndent`
Add an SSH key to balenaCloud.
@ -44,10 +45,10 @@ export default class KeyAddCmd extends Command {
`;
public static examples = [
'$ balena key add Main ~/.ssh/id_rsa.pub',
'$ cat ~/.ssh/id_rsa.pub | balena key add Main',
'$ balena ssh-key add Main ~/.ssh/id_rsa.pub',
'$ cat ~/.ssh/id_rsa.pub | balena ssh-key add Main',
'# Windows 10 (cmd.exe prompt) example',
'$ balena key add Main %userprofile%.sshid_rsa.pub',
'$ balena ssh-key add Main %userprofile%.sshid_rsa.pub',
];
public static args = {
@ -57,24 +58,21 @@ export default class KeyAddCmd extends Command {
}),
path: Args.string({
description: `the path to the public key file`,
required: true,
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {
const { args: params } = await this.parse(KeyAddCmd);
const { args: params } = await this.parse(SSHKeyAddCmd);
const { readFile } = (await import('fs')).promises;
let key: string;
if (params.path != null) {
const { readFile } = (await import('fs')).promises;
try {
key = await readFile(params.path, 'utf8');
} else {
throw new ExpectedError('No public key file or path provided.');
} catch {
key = params.path;
}
await getBalenaSdk().models.key.create(params.name, key);

View File

@ -16,35 +16,33 @@
*/
import { Args, Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
import { parseAsInteger } from '../../utils/validation';
export default class KeyCmd extends Command {
export default class SSHKeyCmd extends Command {
public static aliases = ['key'];
public static deprecateAliases = true;
public static description = stripIndent`
Display an SSH key.
Display a single SSH key registered in balenaCloud for the logged in user.
`;
public static examples = ['$ balena key 17'];
public static examples = ['$ balena ssh-key 17'];
public static args = {
id: Args.integer({
description: 'balenaCloud ID for the SSH key',
parse: async (x) => parseAsInteger(x, 'id'),
parse: (x) => parseAsInteger(x, 'id'),
required: true,
}),
};
public static flags = {
help: cf.help,
};
public static authenticated = true;
public async run() {
const { args: params } = await this.parse(KeyCmd);
const { args: params } = await this.parse(SSHKeyCmd);
const key = await getBalenaSdk().models.key.get(params.id);

View File

@ -16,27 +16,23 @@
*/
import { Command } from '@oclif/core';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
export default class KeyListCmd extends Command {
public static aliases = ['keys'];
export default class SSHKeyListCmd extends Command {
public static aliases = ['keys', 'key list'];
public static deprecateAliases = true;
public static description = stripIndent`
List the SSH keys in balenaCloud.
List all SSH keys registered in balenaCloud for the logged in user.
`;
public static examples = ['$ balena key list'];
public static flags = {
help: cf.help,
};
public static examples = ['$ balena ssh-key list'];
public static authenticated = true;
public async run() {
await this.parse(KeyListCmd);
await this.parse(SSHKeyListCmd);
const keys = await getBalenaSdk().models.key.getAll();

View File

@ -20,7 +20,10 @@ import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { parseAsInteger } from '../../utils/validation';
export default class KeyRmCmd extends Command {
export default class SSHKeyRmCmd extends Command {
public static aliases = ['key rm'];
public static deprecateAliases = true;
public static description = stripIndent`
Remove an SSH key from balenaCloud.
@ -29,25 +32,27 @@ export default class KeyRmCmd extends Command {
The --yes option may be used to avoid interactive confirmation.
`;
public static examples = ['$ balena key rm 17', '$ balena key rm 17 --yes'];
public static examples = [
'$ balena ssh-key rm 17',
'$ balena ssh-key rm 17 --yes',
];
public static args = {
id: Args.integer({
description: 'balenaCloud ID for the SSH key',
parse: async (x) => parseAsInteger(x, 'id'),
parse: (x) => parseAsInteger(x, 'id'),
required: true,
}),
};
public static flags = {
yes: cf.yes,
help: cf.help,
};
public static authenticated = true;
public async run() {
const { args: params, flags: options } = await this.parse(KeyRmCmd);
const { args: params, flags: options } = await this.parse(SSHKeyRmCmd);
const patterns = await import('../../utils/patterns');

Some files were not shown because too many files have changed in this diff Show More