mirror of
https://github.com/balena-io/balena-cli.git
synced 2025-06-24 18:45:07 +00:00
Compare commits
141 Commits
bash-compl
...
os-configu
Author | SHA1 | Date | |
---|---|---|---|
d35787705f | |||
e5076434c6 | |||
5d687f5a55 | |||
e192767156 | |||
5a8d2fad5f | |||
45f482fad1 | |||
c0e7ae9c91 | |||
36077cacda | |||
82b9983450 | |||
703dbd01c9 | |||
602e63c8a9 | |||
2ab635f49a | |||
322736a145 | |||
c347b67b25 | |||
4022beeb56 | |||
ccf97cfc9f | |||
9c5fe14f2e | |||
38e29251e7 | |||
bfc7a14646 | |||
610db81fcb | |||
d1f7d6d07f | |||
694eb78aaa | |||
1caccafbcd | |||
61d4d1f1e7 | |||
a01c85bc15 | |||
5d7b7cfc6f | |||
92fd9e0883 | |||
24273b5ac0 | |||
6155509f4c | |||
735af9f6a9 | |||
d7c60e6dea | |||
bcb42c8a21 | |||
04f5e0fa2b | |||
8cb5804848 | |||
91c3fced49 | |||
99a94eafbb | |||
b4cff78588 | |||
8577bb6281 | |||
e0f081623b | |||
2887ab8200 | |||
aaf4625abb | |||
6f30dc0550 | |||
6565ef4392 | |||
60b46192a2 | |||
bb101de96e | |||
ca6344bf4c | |||
48596fa318 | |||
7fb28ddb21 | |||
6dd6f43d64 | |||
07a7bd76fe | |||
4b3fdcf99c | |||
d023d0af91 | |||
de1821d7ac | |||
12923c9b84 | |||
8be069dbdb | |||
9d3f9128a8 | |||
61ebf9e4fd | |||
84985022e5 | |||
c5d8f73263 | |||
5db0c71bb3 | |||
c7a06f7259 | |||
bc66febc50 | |||
bb80311700 | |||
3dee7bd6f6 | |||
3251f04287 | |||
35dce4579a | |||
71ef00534d | |||
b6f8be27ec | |||
13110cca45 | |||
d4b554da1b | |||
1275c11573 | |||
593233a99f | |||
ec92f21b70 | |||
5adc43bcbd | |||
1ee9a68288 | |||
56e5dafb20 | |||
f0e0c0d728 | |||
afd14794f5 | |||
37e08e4667 | |||
61af57acc9 | |||
19be0fec1a | |||
2b656c23b3 | |||
2bf7b81645 | |||
746b6fa439 | |||
f52e218290 | |||
8655b89313 | |||
09d52c504d | |||
e5cee648f2 | |||
98a6b431d9 | |||
f305d5d9a0 | |||
5cb5ac80a6 | |||
3eb3b3b584 | |||
8ee5ede34d | |||
d6d08cc7c9 | |||
76c63d4b20 | |||
bff5897047 | |||
22c9fd399e | |||
65222b5fc9 | |||
d554658eee | |||
8ded517dd9 | |||
b0d8b021d5 | |||
2eb5d7f6b3 | |||
f1924bba6b | |||
44082e22e4 | |||
2d15530f61 | |||
a7c612f7de | |||
147ce8067a | |||
5e7ac09dd0 | |||
4c9fc89a6b | |||
9b1eb57973 | |||
76c08b6c13 | |||
3f82f42652 | |||
69d820878a | |||
aaaee47e0c | |||
e7761a616b | |||
9559d5cba3 | |||
c1649dd828 | |||
8e9b992a59 | |||
b77f266bd7 | |||
3c9ac76982 | |||
e483d06d2b | |||
24d2d19d33 | |||
ba5bb7b12c | |||
9082e7b3f7 | |||
0716544042 | |||
e1858aa69d | |||
082cce332a | |||
218e0a1b6b | |||
4065c5775c | |||
fd966df1f0 | |||
5eba175bf1 | |||
bd1b71bf2f | |||
bd7ea3d21a | |||
31662d9175 | |||
417c75484b | |||
fcd77e97d9 | |||
1dd819ae61 | |||
388e02ce85 | |||
30446605e1 | |||
e853b15f12 | |||
96cf380f66 |
4
.github/actions/publish/action.yml
vendored
4
.github/actions/publish/action.yml
vendored
@ -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
|
||||
|
4
.github/actions/test/action.yml
vendored
4
.github/actions/test/action.yml
vendored
@ -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
|
||||
|
4
.github/workflows/flowzone.yml
vendored
4
.github/workflows/flowzone.yml
vendored
@ -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"]
|
||||
]
|
||||
|
@ -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
|
||||
|
136
CHANGELOG.md
136
CHANGELOG.md
@ -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]
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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`.
|
||||
|
@ -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`.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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`
|
||||
|
@ -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)'),
|
||||
|
@ -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.`,
|
||||
);
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
;;
|
||||
|
@ -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) )
|
||||
;;
|
||||
|
@ -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
|
||||
|
1017
docs/balena-cli.md
1017
docs/balena-cli.md
File diff suppressed because it is too large
Load Diff
32
eslint.config.js
Normal file
32
eslint.config.js
Normal 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
3403
npm-shrinkwrap.json
generated
File diff suppressed because it is too large
Load Diff
23
package.json
23
package.json
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -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('');
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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',
|
||||
|
@ -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');
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
@ -44,7 +44,6 @@ export default class ConfigInjectCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
drive: cf.driveOrImg,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static root = true;
|
||||
|
@ -38,7 +38,6 @@ export default class ConfigReadCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
drive: cf.driveOrImg,
|
||||
help: cf.help,
|
||||
json: cf.json,
|
||||
};
|
||||
|
||||
|
@ -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"',
|
||||
}),
|
||||
|
@ -49,7 +49,6 @@ export default class ConfigWriteCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
drive: cf.driveOrImg,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static root = true;
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
@ -42,7 +42,6 @@ export default class DeviceDeactivateCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
yes: cf.yes,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -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.`;
|
||||
}
|
@ -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() {
|
||||
|
@ -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',
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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.`,
|
@ -55,7 +55,6 @@ export default class DeviceMoveCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
fleet: cf.fleet,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -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');
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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');
|
||||
|
@ -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;
|
||||
|
@ -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() {
|
||||
|
@ -36,7 +36,6 @@ export default class DeviceRebootCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
force: cf.force,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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 {
|
||||
|
@ -44,7 +44,6 @@ export default class DeviceRmCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
yes: cf.yes,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -37,7 +37,6 @@ export default class DeviceShutdownCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
force: cf.force,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -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,
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -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');
|
||||
|
@ -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[] = [];
|
||||
|
4
src/commands/env/rename.ts
vendored
4
src/commands/env/rename.ts
vendored
@ -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() {
|
||||
|
2
src/commands/env/rm.ts
vendored
2
src/commands/env/rm.ts
vendored
@ -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'),
|
||||
}),
|
||||
};
|
||||
|
||||
|
@ -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) {
|
@ -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;
|
||||
|
@ -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',
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -44,7 +44,6 @@ export default class FleetRmCmd extends Command {
|
||||
|
||||
public static flags = {
|
||||
yes: cf.yes,
|
||||
help: cf.help,
|
||||
};
|
||||
|
||||
public static authenticated = true;
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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');
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
);
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
})),
|
||||
|
@ -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;
|
||||
|
@ -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',
|
||||
|
@ -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 }),
|
||||
|
@ -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',
|
||||
|
@ -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');
|
||||
|
@ -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',
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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
Reference in New Issue
Block a user