edge-impulse-linux 1.9.2 → 1.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/build/cli/aws-iotcore-connector.d.ts +62 -0
- package/build/cli/aws-iotcore-connector.js +255 -0
- package/build/cli/aws-iotcore-connector.js.map +1 -0
- package/build/cli/aws-sm-utils.d.ts +18 -0
- package/build/cli/aws-sm-utils.js +52 -0
- package/build/cli/aws-sm-utils.js.map +1 -0
- package/build/cli/init-cli-app.d.ts +10 -0
- package/build/cli/init-cli-app.js +62 -1
- package/build/cli/init-cli-app.js.map +1 -1
- package/build/cli/linux/linux.js +3 -0
- package/build/cli/linux/linux.js.map +1 -1
- package/build/cli/linux/runner.js +121 -7
- package/build/cli/linux/runner.js.map +1 -1
- package/build/sdk/studio/sdk/api/rawDataApi.d.ts +4 -0
- package/build/sdk/studio/sdk/api/rawDataApi.js +8 -0
- package/build/sdk/studio/sdk/api/rawDataApi.js.map +1 -1
- package/build/sdk/studio/sdk/model/aIActionLastPreviewStateProposedChanges.d.ts +1 -0
- package/build/sdk/studio/sdk/model/aIActionLastPreviewStateProposedChanges.js +5 -0
- package/build/sdk/studio/sdk/model/aIActionLastPreviewStateProposedChanges.js.map +1 -1
- package/build/sdk/studio/sdk/model/aIActionsConfig.d.ts +2 -10
- package/build/sdk/studio/sdk/model/aIActionsConfig.js +3 -8
- package/build/sdk/studio/sdk/model/aIActionsConfig.js.map +1 -1
- package/build/sdk/studio/sdk/model/aIActionsConfigStep.d.ts +34 -0
- package/build/sdk/studio/sdk/model/aIActionsConfigStep.js +34 -0
- package/build/sdk/studio/sdk/model/aIActionsConfigStep.js.map +1 -0
- package/build/sdk/studio/sdk/model/aIActionsOperatesOn.d.ts +13 -0
- package/build/sdk/studio/sdk/model/aIActionsOperatesOn.js +16 -0
- package/build/sdk/studio/sdk/model/aIActionsOperatesOn.js.map +1 -0
- package/build/sdk/studio/sdk/model/addOrganizationTransformationBlockRequest.d.ts +6 -1
- package/build/sdk/studio/sdk/model/addOrganizationTransformationBlockRequest.js +5 -0
- package/build/sdk/studio/sdk/model/addOrganizationTransformationBlockRequest.js.map +1 -1
- package/build/sdk/studio/sdk/model/createPreviewAIActionsJobRequest.d.ts +2 -10
- package/build/sdk/studio/sdk/model/createPreviewAIActionsJobRequest.js +3 -8
- package/build/sdk/studio/sdk/model/createPreviewAIActionsJobRequest.js.map +1 -1
- package/build/sdk/studio/sdk/model/dSPGroupItem.d.ts +8 -0
- package/build/sdk/studio/sdk/model/dSPGroupItem.js +10 -0
- package/build/sdk/studio/sdk/model/dSPGroupItem.js.map +1 -1
- package/build/sdk/studio/sdk/model/models.d.ts +4 -2
- package/build/sdk/studio/sdk/model/models.js +11 -6
- package/build/sdk/studio/sdk/model/models.js.map +1 -1
- package/build/sdk/studio/sdk/model/organizationTransformationBlock.d.ts +6 -1
- package/build/sdk/studio/sdk/model/organizationTransformationBlock.js +5 -0
- package/build/sdk/studio/sdk/model/organizationTransformationBlock.js.map +1 -1
- package/build/sdk/studio/sdk/model/profileModelInfoMemory.d.ts +4 -5
- package/build/sdk/studio/sdk/model/profileModelInfoMemory.js +3 -3
- package/build/sdk/studio/sdk/model/profileModelInfoMemory.js.map +1 -1
- package/build/sdk/studio/sdk/model/{profileModelInfoMemoryTflite.d.ts → profileModelInfoMemoryDetails.d.ts} +10 -1
- package/build/sdk/studio/sdk/model/{profileModelInfoMemoryTflite.js → profileModelInfoMemoryDetails.js} +7 -7
- package/build/sdk/studio/sdk/model/profileModelInfoMemoryDetails.js.map +1 -0
- package/build/sdk/studio/sdk/model/profileModelTableMcuMemory.d.ts +4 -4
- package/build/sdk/studio/sdk/model/profileModelTableMcuMemory.js +3 -3
- package/build/sdk/studio/sdk/model/profileModelTableMcuMemory.js.map +1 -1
- package/build/sdk/studio/sdk/model/{profileModelInfoMemoryEon.d.ts → profileModelTableMcuMemoryTflite.d.ts} +1 -1
- package/build/sdk/studio/sdk/model/{profileModelInfoMemoryEon.js → profileModelTableMcuMemoryTflite.js} +7 -7
- package/build/sdk/studio/sdk/model/profileModelTableMcuMemoryTflite.js.map +1 -0
- package/build/sdk/studio/sdk/model/publicOrganizationTransformationBlock.d.ts +6 -1
- package/build/sdk/studio/sdk/model/publicOrganizationTransformationBlock.js +5 -0
- package/build/sdk/studio/sdk/model/publicOrganizationTransformationBlock.js.map +1 -1
- package/build/sdk/studio/sdk/model/updateAIActionRequest.d.ts +2 -10
- package/build/sdk/studio/sdk/model/updateAIActionRequest.js +3 -8
- package/build/sdk/studio/sdk/model/updateAIActionRequest.js.map +1 -1
- package/build/sdk/studio/sdk/model/updateOrganizationTransformationBlockRequest.d.ts +6 -1
- package/build/sdk/studio/sdk/model/updateOrganizationTransformationBlockRequest.js +5 -0
- package/build/sdk/studio/sdk/model/updateOrganizationTransformationBlockRequest.js.map +1 -1
- package/build/shared/viewmodels/init.d.ts +4 -1
- package/build/shared/viewmodels/init.js +4 -1
- package/build/shared/viewmodels/init.js.map +1 -1
- package/package.json +4 -1
- package/build/sdk/studio/sdk/model/profileModelInfoMemoryEon.js.map +0 -1
- package/build/sdk/studio/sdk/model/profileModelInfoMemoryTflite.js.map +0 -1
package/README.md
CHANGED
|
@@ -42,8 +42,13 @@ You can pass in options to the CLI. Here are the key ones:
|
|
|
42
42
|
* `--disable-microphone` - disable the microphone.
|
|
43
43
|
* `--clean` - clear credentials, and re-authenticate. Use this to switch projects or devices.
|
|
44
44
|
* `--api-key <apikey>` - set an API key, useful for automatic authentication with a new project.
|
|
45
|
+
* `--greengrass` - utilize the AWS IoT Greengrass authentication context and AWS Secrets Manager to authenticate with a new project. See additional Greegrass notes below.
|
|
45
46
|
* `--help` - see all options.
|
|
46
47
|
|
|
48
|
+
#### Greengrass Integration Note
|
|
49
|
+
|
|
50
|
+
edge-impulse-linux and edge-impulse-linux-runner can be run as a service via a custom AWS IoT Greengrass component(s). When provided with the "--greengrass" option, both services will utilize the AWS IoT Greengrass authentication context (ONLY present when launched as a AWS IoT Greengrass custom component) as well as AWS Secrets Manager to extract the api key to be used to authenticate to a new project. If the authentication context is abscent and/or incorrect, both services will simply ignore the "--greengrass" option that was provided and continue with any of the other provided options normally.
|
|
51
|
+
|
|
47
52
|
## Classifying data
|
|
48
53
|
|
|
49
54
|
To classify data (whether this is from the camera, the microphone, or a custom sensor) you'll need a model file. This model file contains all signal processing code, classical ML algorithms and neural networks - and typically contains hardware optimizations to run as fast as possible. To grab a model file:
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
type ClassificationResult = {
|
|
2
|
+
[k: string]: string | number;
|
|
3
|
+
};
|
|
4
|
+
type BoundingBox = {
|
|
5
|
+
label: string;
|
|
6
|
+
value: number;
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
type BasePayload = {
|
|
13
|
+
time_ms: number;
|
|
14
|
+
info?: string;
|
|
15
|
+
id: string;
|
|
16
|
+
ts: number;
|
|
17
|
+
inference_count: number;
|
|
18
|
+
total_inferences: number;
|
|
19
|
+
};
|
|
20
|
+
type DynamicPayload = {
|
|
21
|
+
[key in AwsResultKey]?: AwsResult;
|
|
22
|
+
};
|
|
23
|
+
export type AwsResult = ClassificationResult | BoundingBox[];
|
|
24
|
+
export type AwsResultKey = 'c' | 'box' | 'grid';
|
|
25
|
+
export type Payload = BasePayload & DynamicPayload;
|
|
26
|
+
export declare class AWSIoTCoreConnector {
|
|
27
|
+
private _notSilent;
|
|
28
|
+
private _inferenceOutputTopic;
|
|
29
|
+
private _metricsOutputTopic;
|
|
30
|
+
private _commandInputTopic;
|
|
31
|
+
private _commandOutputTopic;
|
|
32
|
+
private _iot;
|
|
33
|
+
private _clientConfig;
|
|
34
|
+
private _iotcoreQoS;
|
|
35
|
+
private _connected;
|
|
36
|
+
private _delayCountdown;
|
|
37
|
+
private _delayInferences;
|
|
38
|
+
private _poolSleepTimeMS;
|
|
39
|
+
private _opts;
|
|
40
|
+
constructor(opts: {
|
|
41
|
+
appName: string;
|
|
42
|
+
silentArgv: boolean;
|
|
43
|
+
cleanArgv: boolean;
|
|
44
|
+
apiKeyArgv: string | undefined;
|
|
45
|
+
greengrassArgv: boolean;
|
|
46
|
+
devArgv: boolean;
|
|
47
|
+
hmacKeyArgv: string | undefined;
|
|
48
|
+
connectProjectMsg: string;
|
|
49
|
+
});
|
|
50
|
+
createTopics(): void;
|
|
51
|
+
connect(): Promise<boolean>;
|
|
52
|
+
isConnected(): boolean;
|
|
53
|
+
isEmptyInference(payload: Payload, key: AwsResultKey): boolean;
|
|
54
|
+
launchCommandReceiver(): Promise<void>;
|
|
55
|
+
clearRetainedQueue(cmd_topic: string): Promise<void>;
|
|
56
|
+
isRestartCommand(command: string): boolean;
|
|
57
|
+
processRestartCommand(): void;
|
|
58
|
+
listenForCommands(commandInputTopic: string, longPollSleepMS: number): Promise<void>;
|
|
59
|
+
sendModelMetrics(payload: object): Promise<void>;
|
|
60
|
+
sendInference(payload: Payload, key: AwsResultKey): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AWSIoTCoreConnector = void 0;
|
|
4
|
+
const client_iot_data_plane_1 = require("@aws-sdk/client-iot-data-plane");
|
|
5
|
+
const PREFIX = '\x1b[34m[AWS_IOTCORE]\x1b[0m';
|
|
6
|
+
class AWSIoTCoreConnector {
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
this._notSilent = (!opts.silentArgv);
|
|
9
|
+
this._inferenceOutputTopic = "";
|
|
10
|
+
this._metricsOutputTopic = "";
|
|
11
|
+
this._commandInputTopic = "";
|
|
12
|
+
this._commandOutputTopic = "";
|
|
13
|
+
this._clientConfig = { region: process.env.AWS_REGION };
|
|
14
|
+
this._iot = undefined;
|
|
15
|
+
this._connected = false;
|
|
16
|
+
this._delayCountdown = 0;
|
|
17
|
+
this._iotcoreQoS = Number(process.env.EI_IOTCORE_QOS);
|
|
18
|
+
this._poolSleepTimeMS = Number(process.env.EI_IOTCORE_POLL_SLEEP_TIME_MS);
|
|
19
|
+
this._opts = opts;
|
|
20
|
+
// We can slow down the publication to IoTCore to save IoTCore message cost$.
|
|
21
|
+
// set "iotcore_backoff" in Greengrass component config to "n" > 0 to enable
|
|
22
|
+
// countdown backoff... "-1" to disable... (default: "10")
|
|
23
|
+
this._delayInferences = Number(process.env.EI_OUTPUT_BACKOFF_COUNT);
|
|
24
|
+
}
|
|
25
|
+
createTopics() {
|
|
26
|
+
// Inference result topic
|
|
27
|
+
this._inferenceOutputTopic = process.env.EI_INFERENCE_OUTPUT_TOPIC;
|
|
28
|
+
// Model metrics status topic
|
|
29
|
+
this._metricsOutputTopic = process.env.EI_METRICS_OUTPUT_TOPIC;
|
|
30
|
+
// Command/control topics
|
|
31
|
+
this._commandInputTopic = process.env.EI_COMMAND_INPUT_TOPIC;
|
|
32
|
+
this._commandOutputTopic = process.env.EI_COMMAND_OUTPUT_TOPIC;
|
|
33
|
+
}
|
|
34
|
+
async connect() {
|
|
35
|
+
if (this._iot === undefined) {
|
|
36
|
+
if (this._notSilent) {
|
|
37
|
+
// not connected.. so connect to IoTCore
|
|
38
|
+
console.log(PREFIX + " EI: Connecting to IoTCore...");
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
// create topics
|
|
42
|
+
this.createTopics();
|
|
43
|
+
// allocate...
|
|
44
|
+
this._iot = await new client_iot_data_plane_1.IoTDataPlaneClient(this._clientConfig);
|
|
45
|
+
// we are connected!
|
|
46
|
+
this._connected = true;
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// unable to allocate
|
|
50
|
+
if (this._notSilent) {
|
|
51
|
+
// not connected.. so connect to IoTCore
|
|
52
|
+
console.log(PREFIX + " EI: ERROR - Unable to allocate IoTDataPlaneClient with exception: " + err);
|
|
53
|
+
}
|
|
54
|
+
this._iot = undefined;
|
|
55
|
+
this._connected = false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// already connected... OK
|
|
60
|
+
this._connected = true;
|
|
61
|
+
}
|
|
62
|
+
return this.isConnected();
|
|
63
|
+
}
|
|
64
|
+
isConnected() {
|
|
65
|
+
return this._connected;
|
|
66
|
+
}
|
|
67
|
+
isEmptyInference(payload, key) {
|
|
68
|
+
if (payload && key in payload) {
|
|
69
|
+
const value = payload[key];
|
|
70
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Check if it's an object and not empty
|
|
74
|
+
if (typeof value === 'object' && value !== null && Object.keys(value).length > 0) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
async launchCommandReceiver() {
|
|
81
|
+
await this.listenForCommands(this._commandInputTopic, this._poolSleepTimeMS);
|
|
82
|
+
}
|
|
83
|
+
async clearRetainedQueue(cmd_topic) {
|
|
84
|
+
try {
|
|
85
|
+
if (this._iot !== undefined) {
|
|
86
|
+
// publish... do not proceed until this message has been cleared...
|
|
87
|
+
await this._iot.send(new client_iot_data_plane_1.PublishCommand({
|
|
88
|
+
topic: cmd_topic,
|
|
89
|
+
retain: true
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
// ignore
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
isRestartCommand(command) {
|
|
98
|
+
return (command === "restart");
|
|
99
|
+
}
|
|
100
|
+
processRestartCommand() {
|
|
101
|
+
// announce
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
103
|
+
console.log("EI: Restarting Service: " + this._opts.appName + "...");
|
|
104
|
+
// send ourselves a single to gracefully shutdown...
|
|
105
|
+
process.kill(process.pid, "SIGINT");
|
|
106
|
+
}
|
|
107
|
+
async listenForCommands(commandInputTopic, longPollSleepMS) {
|
|
108
|
+
while (this.isConnected() === true) {
|
|
109
|
+
// Long Poll via GetRetainedMessageCommand()...
|
|
110
|
+
try {
|
|
111
|
+
if (this._iot !== undefined) {
|
|
112
|
+
const response = await this._iot.send(new client_iot_data_plane_1.GetRetainedMessageCommand({ topic: commandInputTopic }));
|
|
113
|
+
if (response !== undefined) {
|
|
114
|
+
// Retrieve the command
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
116
|
+
const rcvdCmd = JSON.parse(new TextDecoder().decode(response.payload));
|
|
117
|
+
// Clear Retained Messages
|
|
118
|
+
await this.clearRetainedQueue(commandInputTopic);
|
|
119
|
+
// ensure we have a received command...
|
|
120
|
+
if (rcvdCmd !== undefined) {
|
|
121
|
+
// Process the received command
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
123
|
+
if (this.isRestartCommand((rcvdCmd.cmd)) === true) {
|
|
124
|
+
// process the restart command...
|
|
125
|
+
this.processRestartCommand();
|
|
126
|
+
}
|
|
127
|
+
// more commands supported here over time...
|
|
128
|
+
// default case
|
|
129
|
+
else {
|
|
130
|
+
// command not supported/understood... so ignore
|
|
131
|
+
if (this._notSilent === true) {
|
|
132
|
+
console.log("EI: listenForCommands() Command: " + JSON.stringify(rcvdCmd) + " not supported/understood. Ignoring...");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// empty/null command... just ignore
|
|
138
|
+
if (this._notSilent === true) {
|
|
139
|
+
console.log("EI: listenForCommands() Command is empty/null. Ignoring...");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
if (this._notSilent === true) {
|
|
146
|
+
// Connected but null command object
|
|
147
|
+
console.log("listenForCommands(): WARNING Status states connected() but iotcore handle is NULL!");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
// ignore
|
|
153
|
+
}
|
|
154
|
+
// Sleep
|
|
155
|
+
await new Promise(resolve => setTimeout(resolve, longPollSleepMS));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// FUTURE: XXX
|
|
159
|
+
async sendModelMetrics(payload) {
|
|
160
|
+
if (this._iot !== undefined && this.isConnected() === true &&
|
|
161
|
+
this._metricsOutputTopic !== undefined && this._metricsOutputTopic.length > 0) {
|
|
162
|
+
// publish!
|
|
163
|
+
try {
|
|
164
|
+
// send the publication
|
|
165
|
+
await this._iot.send(new client_iot_data_plane_1.PublishCommand({
|
|
166
|
+
topic: this._metricsOutputTopic,
|
|
167
|
+
qos: this._iotcoreQoS,
|
|
168
|
+
retain: false,
|
|
169
|
+
payload: Buffer.from(JSON.stringify(payload))
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
if (this._notSilent === true) {
|
|
174
|
+
// exception during send()...
|
|
175
|
+
console.log(PREFIX + " EI: sendModelMetrics() ERROR - IoTDataPlaneClient.send() errored with exception: " + err);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (this._iot !== undefined && this.isConnected() === true) {
|
|
180
|
+
// no model metrics topic
|
|
181
|
+
if (this._notSilent) {
|
|
182
|
+
console.log(PREFIX + " EI: ERROR - No model metrics topic specified in configuration... not sending inference.");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// not connected
|
|
187
|
+
if (this._notSilent) {
|
|
188
|
+
console.log(PREFIX + " EI: ERROR - Not connected to IoTCore... not sending mdoel metrics.");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async sendInference(payload, key) {
|
|
193
|
+
if (this._iot !== undefined && this.isConnected() === true &&
|
|
194
|
+
this._inferenceOutputTopic !== undefined && this._inferenceOutputTopic.length > 0) {
|
|
195
|
+
if (this.isEmptyInference(payload, key)) {
|
|
196
|
+
// empty inference ... so save money and don't publish
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
if (this._delayInferences > 0) {
|
|
200
|
+
++this._delayCountdown;
|
|
201
|
+
if (this._delayCountdown >= this._delayInferences) {
|
|
202
|
+
// reset:
|
|
203
|
+
this._delayCountdown = 0;
|
|
204
|
+
// publish!
|
|
205
|
+
try {
|
|
206
|
+
// send the publication
|
|
207
|
+
await this._iot.send(new client_iot_data_plane_1.PublishCommand({
|
|
208
|
+
topic: this._inferenceOutputTopic,
|
|
209
|
+
qos: this._iotcoreQoS,
|
|
210
|
+
payload: Buffer.from(JSON.stringify(payload))
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
if (this._notSilent) {
|
|
215
|
+
// exception during send()...
|
|
216
|
+
console.log(PREFIX + " EI: sendInference() ERROR - IoTDataPlaneClient.send() errored with exception: " + err);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// publish!
|
|
223
|
+
try {
|
|
224
|
+
// send the publication
|
|
225
|
+
await this._iot.send(new client_iot_data_plane_1.PublishCommand({
|
|
226
|
+
topic: this._inferenceOutputTopic,
|
|
227
|
+
qos: this._iotcoreQoS,
|
|
228
|
+
payload: Buffer.from(JSON.stringify(payload))
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
if (this._notSilent) {
|
|
233
|
+
// exception during send()...
|
|
234
|
+
console.log(PREFIX + " EI: ERROR - IoTDataPlaneClient.send() errored with exception: " + err);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (this._iot !== undefined && this.isConnected() === true) {
|
|
241
|
+
// no publication topic
|
|
242
|
+
if (this._notSilent) {
|
|
243
|
+
console.log(PREFIX + " EI: ERROR - No model inference publication topic specified in configuration... not sending inference results.");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// not connected
|
|
248
|
+
if (this._notSilent) {
|
|
249
|
+
console.log(PREFIX + " EI: ERROR - Not connected to IoTCore... not sending inference.");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
exports.AWSIoTCoreConnector = AWSIoTCoreConnector;
|
|
255
|
+
//# sourceMappingURL=aws-iotcore-connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-iotcore-connector.js","sourceRoot":"","sources":["../../cli/aws-iotcore-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class AWSSecretsManagerUtils {
|
|
2
|
+
private _smInput;
|
|
3
|
+
private _smName;
|
|
4
|
+
private _notSilent;
|
|
5
|
+
private _client;
|
|
6
|
+
private _clientConfig;
|
|
7
|
+
constructor(opts: {
|
|
8
|
+
appName: string;
|
|
9
|
+
silentArgv: boolean;
|
|
10
|
+
cleanArgv: boolean;
|
|
11
|
+
apiKeyArgv: string | undefined;
|
|
12
|
+
greengrassArgv: boolean;
|
|
13
|
+
devArgv: boolean;
|
|
14
|
+
hmacKeyArgv: string | undefined;
|
|
15
|
+
connectProjectMsg: string;
|
|
16
|
+
});
|
|
17
|
+
getEdgeImpulseAPIKeyFromSecretsManager(): Promise<any>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AWSSecretsManagerUtils = void 0;
|
|
4
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
5
|
+
const PREFIX = '\x1b[34m[AWS_SECRET_MANAGER]\x1b[0m';
|
|
6
|
+
class AWSSecretsManagerUtils {
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
this._notSilent = (!opts.silentArgv);
|
|
9
|
+
this._smInput = { SecretId: process.env.EI_AWS_SECRET_ID };
|
|
10
|
+
this._clientConfig = { region: process.env.AWS_REGION };
|
|
11
|
+
this._smName = process.env.EI_AWS_SECRET_NAME;
|
|
12
|
+
this._client = new client_secrets_manager_1.SecretsManagerClient(this._clientConfig);
|
|
13
|
+
}
|
|
14
|
+
async getEdgeImpulseAPIKeyFromSecretsManager() {
|
|
15
|
+
const command = new client_secrets_manager_1.GetSecretValueCommand(this._smInput);
|
|
16
|
+
let name = this._smName;
|
|
17
|
+
if (name === undefined) {
|
|
18
|
+
name = "";
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const response = await this._client.send(command);
|
|
22
|
+
if (response !== undefined && response.SecretString !== undefined && name.length > 0 &&
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
24
|
+
JSON.parse(response.SecretString)[name] !== undefined) {
|
|
25
|
+
// return the API Key
|
|
26
|
+
if (this._notSilent) {
|
|
27
|
+
// runtime: show status only...
|
|
28
|
+
console.log(PREFIX + " EI: API Key FOUND within AWS Secrets Manager. Continuing...");
|
|
29
|
+
}
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
31
|
+
return JSON.parse(response.SecretString)[name];
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (this._notSilent) {
|
|
35
|
+
// Unable to find the API Key... invalid SecretId more than likely...
|
|
36
|
+
console.log(PREFIX +
|
|
37
|
+
" EI: ERROR - Unable to retrieve API Key from AWS Secrets Manager with greengrass option selected. Check ID in configuration: NAME: " +
|
|
38
|
+
name + " ID: " + process.env.EI_AWS_SECRET_ID);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (this._notSilent) {
|
|
44
|
+
console.log(PREFIX + " EI: ERROR - Unable to retrieve API Key from AWS Secrets Manager with greengrass option selected. Caught Exception: " +
|
|
45
|
+
err + " NAME: " + name + " ID: " + process.env.EI_AWS_SECRET_ID);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.AWSSecretsManagerUtils = AWSSecretsManagerUtils;
|
|
52
|
+
//# sourceMappingURL=aws-sm-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-sm-utils.js","sourceRoot":"","sources":["../../cli/aws-sm-utils.ts"],"names":[],"mappings":";;;AAAA,4EAA8F;AAE9F,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAErD,MAAa,sBAAsB;IAQ/B,YAAY,IASX;QACG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,6CAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,sCAAsC;QACxC,MAAM,OAAO,GAAG,IAAI,8CAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACxB,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,IAAI,GAAG,EAAE,CAAC;SACb;QACD,IAAI;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAChF,sEAAsE;gBACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE;gBACvD,qBAAqB;gBACrB,IAAI,IAAI,CAAC,UAAU,EAAE;oBACjB,+BAA+B;oBAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,8DAA8D,CAAC,CAAC;iBACxF;gBAED,sEAAsE;gBACtE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;aAClD;iBACI;gBACD,IAAI,IAAI,CAAC,UAAU,EAAE;oBACjB,qEAAqE;oBACrE,OAAO,CAAC,GAAG,CAAC,MAAM;wBACd,qIAAqI;wBACrI,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;iBACtD;aACJ;SACJ;QACD,OAAM,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,sHAAsH;oBAC/H,GAAG,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;aAChF;SACJ;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ;AA9DD,wDA8DC"}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { Config, EdgeImpulseConfig } from "./config";
|
|
2
|
+
import { AWSSecretsManagerUtils } from "./aws-sm-utils";
|
|
3
|
+
import { AWSIoTCoreConnector } from "./aws-iotcore-connector";
|
|
2
4
|
export declare function getCliVersion(): string;
|
|
3
5
|
export declare function initCliApp(opts: {
|
|
4
6
|
appName: string;
|
|
5
7
|
silentArgv: boolean;
|
|
6
8
|
cleanArgv: boolean;
|
|
7
9
|
apiKeyArgv: string | undefined;
|
|
10
|
+
greengrassArgv: boolean;
|
|
8
11
|
devArgv: boolean;
|
|
9
12
|
hmacKeyArgv: string | undefined;
|
|
10
13
|
connectProjectMsg: string;
|
|
11
14
|
}): Promise<{
|
|
12
15
|
configFactory: Config;
|
|
13
16
|
config: EdgeImpulseConfig;
|
|
17
|
+
awsSM: AWSSecretsManagerUtils;
|
|
18
|
+
awsIOT: AWSIoTCoreConnector;
|
|
19
|
+
} | {
|
|
20
|
+
configFactory: Config;
|
|
21
|
+
config: EdgeImpulseConfig;
|
|
22
|
+
awsSM?: undefined;
|
|
23
|
+
awsIOT?: undefined;
|
|
14
24
|
}>;
|
|
15
25
|
export declare function setupCliApp(configFactory: Config, config: EdgeImpulseConfig, opts: {
|
|
16
26
|
appName: string;
|
|
@@ -9,6 +9,8 @@ const check_new_version_1 = __importDefault(require("./check-new-version"));
|
|
|
9
9
|
const fs_1 = __importDefault(require("fs"));
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
12
|
+
const aws_sm_utils_1 = require("./aws-sm-utils");
|
|
13
|
+
const aws_iotcore_connector_1 = require("./aws-iotcore-connector");
|
|
12
14
|
const version = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '..', 'package.json'), 'utf-8')).version;
|
|
13
15
|
function getCliVersion() {
|
|
14
16
|
return version;
|
|
@@ -20,11 +22,61 @@ async function initCliApp(opts) {
|
|
|
20
22
|
}
|
|
21
23
|
const configFactory = new config_1.Config();
|
|
22
24
|
let config;
|
|
25
|
+
// AWS Support
|
|
26
|
+
let awsSM;
|
|
27
|
+
let awsIOT;
|
|
23
28
|
try {
|
|
24
29
|
if (opts.cleanArgv) {
|
|
25
30
|
await configFactory.clean();
|
|
26
31
|
}
|
|
27
|
-
|
|
32
|
+
// AWS: Secrets Manager + IoTCore Connect Integration
|
|
33
|
+
if (opts.greengrassArgv) {
|
|
34
|
+
if (awsSM === undefined) {
|
|
35
|
+
awsSM = await new aws_sm_utils_1.AWSSecretsManagerUtils(opts);
|
|
36
|
+
}
|
|
37
|
+
let smApiKey;
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
39
|
+
smApiKey = await awsSM.getEdgeImpulseAPIKeyFromSecretsManager();
|
|
40
|
+
if (smApiKey !== undefined && smApiKey.length > 0) {
|
|
41
|
+
// assign if we capture the API key via SM...
|
|
42
|
+
opts.apiKeyArgv = smApiKey;
|
|
43
|
+
// we only need AWS IoTCore connectivity for the runner app...
|
|
44
|
+
if (opts.appName === "Edge Impulse Linux runner") {
|
|
45
|
+
// success - allocate the AWS IoT Helper
|
|
46
|
+
awsIOT = new aws_iotcore_connector_1.AWSIoTCoreConnector(opts);
|
|
47
|
+
if (awsIOT !== undefined) {
|
|
48
|
+
if (!opts.silentArgv) {
|
|
49
|
+
console.log(opts.appName + ": Connecting to IoTCore...");
|
|
50
|
+
}
|
|
51
|
+
const connected = await awsIOT.connect();
|
|
52
|
+
if (!opts.silentArgv) {
|
|
53
|
+
if (connected) {
|
|
54
|
+
// success
|
|
55
|
+
console.log(opts.appName + ": Connected to IoTCore Successfully!");
|
|
56
|
+
// launch the command poller
|
|
57
|
+
console.log(opts.appName + ": launching command receiver...");
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
59
|
+
awsIOT.launchCommandReceiver();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// failure
|
|
63
|
+
console.log(opts.appName + ": FAILED to connect to IoTCore");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// continue...
|
|
69
|
+
await configFactory.removeProjectReferences();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
if (!opts.silentArgv) {
|
|
73
|
+
// unable to continue as no API key was found in Secrets Manager
|
|
74
|
+
console.log(opts.appName + " ERROR: Unable to find EI API Key within AWS Secrets Manager. Check AWS configuration. Continuing...");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// AWS: Secrets Manager + IoTCore Connect Integration
|
|
79
|
+
if (opts.apiKeyArgv) {
|
|
28
80
|
await configFactory.removeProjectReferences();
|
|
29
81
|
}
|
|
30
82
|
try {
|
|
@@ -73,6 +125,15 @@ async function initCliApp(opts) {
|
|
|
73
125
|
}
|
|
74
126
|
process.exit(1);
|
|
75
127
|
}
|
|
128
|
+
// AWS Integration additions
|
|
129
|
+
if (awsSM !== undefined && awsIOT !== undefined) {
|
|
130
|
+
return {
|
|
131
|
+
configFactory,
|
|
132
|
+
config,
|
|
133
|
+
awsSM,
|
|
134
|
+
awsIOT
|
|
135
|
+
};
|
|
136
|
+
}
|
|
76
137
|
return {
|
|
77
138
|
configFactory,
|
|
78
139
|
config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-cli-app.js","sourceRoot":"","sources":["../../cli/init-cli-app.ts"],"names":[],"mappings":";;;;;;AAAA,qCAAqD;AACrD,4EAAmD;AACnD,4CAAoB;AACpB,gDAAwB;AACxB,wDAAgC;
|
|
1
|
+
{"version":3,"file":"init-cli-app.js","sourceRoot":"","sources":["../../cli/init-cli-app.ts"],"names":[],"mappings":"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"}
|
package/build/cli/linux/linux.js
CHANGED
|
@@ -38,6 +38,7 @@ commander_1.default
|
|
|
38
38
|
.option('--dev', 'List development servers, alternatively you can use the EI_HOST environmental variable ' +
|
|
39
39
|
'to specify the Edge Impulse instance.')
|
|
40
40
|
.option('--verbose', 'Enable debug logs')
|
|
41
|
+
.option('--greengrass', 'Enable AWS IoT greengrass integration mode')
|
|
41
42
|
.allowUnknownOption(true)
|
|
42
43
|
.parse(process.argv);
|
|
43
44
|
const devArgv = !!commander_1.default.dev;
|
|
@@ -45,6 +46,7 @@ const cleanArgv = !!commander_1.default.clean;
|
|
|
45
46
|
const silentArgv = !!commander_1.default.silent;
|
|
46
47
|
const verboseArgv = !!commander_1.default.verbose;
|
|
47
48
|
const apiKeyArgv = commander_1.default.apiKey;
|
|
49
|
+
const greengrassArgv = !!commander_1.default.greengrass;
|
|
48
50
|
const hmacKeyArgv = commander_1.default.hmacKey;
|
|
49
51
|
const gstLaunchArgsArgv = commander_1.default.gstLaunchArgs;
|
|
50
52
|
const noCamera = !!commander_1.default.disableCamera;
|
|
@@ -63,6 +65,7 @@ const SERIAL_PREFIX = '\x1b[33m[SER]\x1b[0m';
|
|
|
63
65
|
const cliOptions = {
|
|
64
66
|
appName: 'Edge Impulse Linux client',
|
|
65
67
|
apiKeyArgv: apiKeyArgv,
|
|
68
|
+
greengrassArgv: greengrassArgv,
|
|
66
69
|
cleanArgv: cleanArgv,
|
|
67
70
|
devArgv: devArgv,
|
|
68
71
|
hmacKeyArgv: hmacKeyArgv,
|