@alwaysai/device-agent 0.0.12 → 0.0.14
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/lib/application-control/backup.d.ts.map +1 -1
- package/lib/application-control/backup.js +11 -5
- package/lib/application-control/backup.js.map +1 -1
- package/lib/application-control/config.d.ts +12 -4
- package/lib/application-control/config.d.ts.map +1 -1
- package/lib/application-control/config.js +59 -16
- package/lib/application-control/config.js.map +1 -1
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/index.d.ts +5 -5
- package/lib/application-control/index.d.ts.map +1 -1
- package/lib/application-control/index.js +4 -6
- package/lib/application-control/index.js.map +1 -1
- package/lib/application-control/install.d.ts +1 -1
- package/lib/application-control/install.d.ts.map +1 -1
- package/lib/application-control/install.js +58 -57
- package/lib/application-control/install.js.map +1 -1
- package/lib/application-control/models.d.ts +7 -5
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +78 -57
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/status.d.ts +0 -6
- package/lib/application-control/status.d.ts.map +1 -1
- package/lib/application-control/status.js +21 -33
- package/lib/application-control/status.js.map +1 -1
- package/lib/application-control/utils.d.ts +3 -2
- package/lib/application-control/utils.d.ts.map +1 -1
- package/lib/application-control/utils.js +54 -34
- package/lib/application-control/utils.js.map +1 -1
- package/lib/cloud-connection/app-install-status.d.ts +16 -0
- package/lib/cloud-connection/app-install-status.d.ts.map +1 -0
- package/lib/cloud-connection/app-install-status.js +53 -0
- package/lib/cloud-connection/app-install-status.js.map +1 -0
- package/lib/cloud-connection/bootstrap-provision.d.ts +2 -0
- package/lib/cloud-connection/bootstrap-provision.d.ts.map +1 -0
- package/lib/cloud-connection/bootstrap-provision.js +34 -0
- package/lib/cloud-connection/bootstrap-provision.js.map +1 -0
- package/lib/cloud-connection/cmd-status.d.ts +16 -0
- package/lib/cloud-connection/cmd-status.d.ts.map +1 -0
- package/lib/cloud-connection/cmd-status.js +49 -0
- package/lib/cloud-connection/cmd-status.js.map +1 -0
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +21 -34
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +211 -387
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/device-agent.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent.js +22 -26
- package/lib/cloud-connection/device-agent.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts +34 -0
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -0
- package/lib/cloud-connection/live-updates-handler.js +167 -0
- package/lib/cloud-connection/live-updates-handler.js.map +1 -0
- package/lib/cloud-connection/messages.d.ts +14 -0
- package/lib/cloud-connection/messages.d.ts.map +1 -0
- package/lib/cloud-connection/messages.js +38 -0
- package/lib/cloud-connection/messages.js.map +1 -0
- package/lib/cloud-connection/passthrough-handler.d.ts +11 -0
- package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -0
- package/lib/cloud-connection/passthrough-handler.js +59 -0
- package/lib/cloud-connection/passthrough-handler.js.map +1 -0
- package/lib/cloud-connection/publisher.d.ts +15 -0
- package/lib/cloud-connection/publisher.d.ts.map +1 -0
- package/lib/cloud-connection/publisher.js +58 -0
- package/lib/cloud-connection/publisher.js.map +1 -0
- package/lib/cloud-connection/shadow-handler.d.ts +33 -0
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -0
- package/lib/cloud-connection/shadow-handler.js +108 -0
- package/lib/cloud-connection/shadow-handler.js.map +1 -0
- package/lib/cloud-connection/shadow-handler.test.d.ts +2 -0
- package/lib/cloud-connection/shadow-handler.test.d.ts.map +1 -0
- package/lib/cloud-connection/shadow-handler.test.js +321 -0
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -0
- package/lib/cloud-connection/shadow.d.ts +16 -0
- package/lib/cloud-connection/shadow.d.ts.map +1 -0
- package/lib/cloud-connection/shadow.js +36 -0
- package/lib/cloud-connection/shadow.js.map +1 -0
- package/lib/device-control/device-control.d.ts.map +1 -1
- package/lib/device-control/device-control.js +1 -0
- package/lib/device-control/device-control.js.map +1 -1
- package/lib/docker/docker-cmd.js +1 -1
- package/lib/docker/docker-compose-cmd.d.ts.map +1 -1
- package/lib/docker/docker-compose-cmd.js +1 -1
- package/lib/docker/docker-compose-cmd.js.map +1 -1
- package/lib/endpoints.js +10 -10
- package/lib/endpoints.js.map +1 -1
- package/lib/environment.d.ts +1 -0
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js +2 -1
- package/lib/environment.js.map +1 -1
- package/lib/infrastructure/agent-config.d.ts +15 -58
- package/lib/infrastructure/agent-config.d.ts.map +1 -1
- package/lib/infrastructure/agent-config.js +22 -15
- package/lib/infrastructure/agent-config.js.map +1 -1
- package/lib/infrastructure/agent-config.test.js +25 -23
- package/lib/infrastructure/agent-config.test.js.map +1 -1
- package/lib/infrastructure/system-id.d.ts +2 -0
- package/lib/infrastructure/system-id.d.ts.map +1 -0
- package/lib/infrastructure/system-id.js +21 -0
- package/lib/infrastructure/system-id.js.map +1 -0
- package/lib/infrastructure/tokens-and-device-cfg.d.ts +4 -0
- package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -0
- package/lib/infrastructure/tokens-and-device-cfg.js +27 -0
- package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -0
- package/lib/infrastructure/urls.d.ts.map +1 -1
- package/lib/infrastructure/urls.js +3 -3
- package/lib/infrastructure/urls.js.map +1 -1
- package/lib/local-connection/rabbitmq-connection.d.ts +4 -0
- package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -0
- package/lib/local-connection/rabbitmq-connection.js +58 -0
- package/lib/local-connection/rabbitmq-connection.js.map +1 -0
- package/lib/root.d.ts.map +1 -1
- package/lib/root.js +2 -7
- package/lib/root.js.map +1 -1
- package/lib/subcommands/app/app.d.ts +2 -1
- package/lib/subcommands/app/app.d.ts.map +1 -1
- package/lib/subcommands/app/app.js +112 -77
- package/lib/subcommands/app/app.js.map +1 -1
- package/lib/subcommands/app/index.js +2 -2
- package/lib/subcommands/device/clean.d.ts +2 -0
- package/lib/subcommands/device/clean.d.ts.map +1 -0
- package/lib/subcommands/device/clean.js +29 -0
- package/lib/subcommands/device/clean.js.map +1 -0
- package/lib/subcommands/device/device.d.ts +1 -1
- package/lib/subcommands/device/device.d.ts.map +1 -1
- package/lib/subcommands/device/device.js +44 -33
- package/lib/subcommands/device/device.js.map +1 -1
- package/lib/subcommands/device/index.d.ts.map +1 -1
- package/lib/subcommands/device/index.js +2 -1
- package/lib/subcommands/device/index.js.map +1 -1
- package/lib/subcommands/get-model-package.js +5 -5
- package/lib/subcommands/index.d.ts +0 -1
- package/lib/subcommands/index.d.ts.map +1 -1
- package/lib/subcommands/index.js +1 -1
- package/lib/subcommands/login.d.ts +0 -1
- package/lib/subcommands/login.d.ts.map +1 -1
- package/lib/subcommands/login.js +6 -14
- package/lib/subcommands/login.js.map +1 -1
- package/lib/util/clean-certs.d.ts +2 -0
- package/lib/util/clean-certs.d.ts.map +1 -0
- package/lib/util/clean-certs.js +16 -0
- package/lib/util/clean-certs.js.map +1 -0
- package/lib/util/directories.d.ts +16 -15
- package/lib/util/directories.d.ts.map +1 -1
- package/lib/util/directories.js +45 -26
- package/lib/util/directories.js.map +1 -1
- package/lib/util/fetch-with-timeout.d.ts +4 -0
- package/lib/util/fetch-with-timeout.d.ts.map +1 -0
- package/lib/util/fetch-with-timeout.js +15 -0
- package/lib/util/fetch-with-timeout.js.map +1 -0
- package/lib/util/get-device-id.d.ts +1 -1
- package/lib/util/get-device-id.d.ts.map +1 -1
- package/lib/util/get-device-id.js +14 -19
- package/lib/util/get-device-id.js.map +1 -1
- package/lib/util/http-client.d.ts +1 -1
- package/lib/util/http-client.d.ts.map +1 -1
- package/lib/util/http-client.js +10 -8
- package/lib/util/http-client.js.map +1 -1
- package/lib/util/logger.d.ts.map +1 -1
- package/lib/util/logger.js +4 -5
- package/lib/util/logger.js.map +1 -1
- package/lib/util/require-logged-in-and-paid-plan.d.ts +2 -0
- package/lib/util/require-logged-in-and-paid-plan.d.ts.map +1 -0
- package/lib/util/require-logged-in-and-paid-plan.js +18 -0
- package/lib/util/require-logged-in-and-paid-plan.js.map +1 -0
- package/lib/util/run-in-dir.d.ts.map +1 -1
- package/lib/util/run-in-dir.js +1 -0
- package/lib/util/run-in-dir.js.map +1 -1
- package/lib/util/timer.d.ts +2 -0
- package/lib/util/timer.d.ts.map +1 -0
- package/lib/util/timer.js +6 -0
- package/lib/util/timer.js.map +1 -0
- package/package.json +32 -35
- package/readme.md +100 -89
- package/src/application-control/backup.ts +11 -6
- package/src/application-control/config.ts +75 -13
- package/src/application-control/environment-variables.ts +3 -3
- package/src/application-control/index.ts +18 -11
- package/src/application-control/install.ts +82 -78
- package/src/application-control/models.ts +104 -72
- package/src/application-control/status.ts +29 -40
- package/src/application-control/utils.ts +66 -38
- package/src/cloud-connection/app-install-status.ts +62 -0
- package/src/cloud-connection/bootstrap-provision.ts +40 -0
- package/src/cloud-connection/cmd-status.ts +52 -0
- package/src/cloud-connection/device-agent-cloud-connection.ts +302 -526
- package/src/cloud-connection/device-agent.ts +31 -38
- package/src/cloud-connection/live-updates-handler.ts +226 -0
- package/src/cloud-connection/messages.ts +39 -0
- package/src/cloud-connection/passthrough-handler.ts +67 -0
- package/src/cloud-connection/publisher.ts +86 -0
- package/src/cloud-connection/shadow-handler.test.ts +361 -0
- package/src/cloud-connection/shadow-handler.ts +175 -0
- package/src/cloud-connection/shadow.ts +50 -0
- package/src/device-control/device-control.ts +1 -0
- package/src/docker/docker-cmd.ts +1 -1
- package/src/docker/docker-compose-cmd.ts +5 -2
- package/src/endpoints.ts +9 -9
- package/src/environment.ts +11 -3
- package/src/infrastructure/agent-config.test.ts +33 -29
- package/src/infrastructure/agent-config.ts +57 -22
- package/src/infrastructure/system-id.ts +18 -0
- package/src/infrastructure/tokens-and-device-cfg.ts +34 -0
- package/src/infrastructure/urls.ts +4 -2
- package/src/local-connection/rabbitmq-connection.ts +53 -0
- package/src/root.ts +2 -8
- package/src/subcommands/app/app.ts +119 -83
- package/src/subcommands/app/index.ts +3 -3
- package/src/subcommands/device/clean.ts +26 -0
- package/src/subcommands/device/device.ts +67 -54
- package/src/subcommands/device/index.ts +2 -1
- package/src/subcommands/get-model-package.ts +5 -5
- package/src/subcommands/index.ts +1 -1
- package/src/subcommands/login.ts +6 -14
- package/src/util/clean-certs.ts +12 -0
- package/src/util/directories.ts +68 -52
- package/src/util/fetch-with-timeout.ts +18 -0
- package/src/util/get-device-id.ts +16 -18
- package/src/util/http-client.ts +18 -13
- package/src/util/logger.ts +6 -6
- package/src/util/require-logged-in-and-paid-plan.ts +16 -0
- package/src/util/run-in-dir.ts +2 -1
- package/src/util/timer.ts +1 -0
- package/lib/infrastructure/certificates-and-tokens.d.ts +0 -6
- package/lib/infrastructure/certificates-and-tokens.d.ts.map +0 -1
- package/lib/infrastructure/certificates-and-tokens.js +0 -43
- package/lib/infrastructure/certificates-and-tokens.js.map +0 -1
- package/src/infrastructure/certificates-and-tokens.ts +0 -53
package/src/subcommands/index.ts
CHANGED
package/src/subcommands/login.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CliLeaf, CliStringInput } from '@alwaysai/alwayscli';
|
|
2
2
|
import { alwaysaiUserLoginYesComponent } from 'alwaysai/lib/components/user';
|
|
3
|
-
import { writeCertificateAndToken } from '../infrastructure/certificates-and-tokens';
|
|
4
3
|
|
|
5
4
|
export const loginCliLeaf = CliLeaf({
|
|
6
5
|
name: 'login',
|
|
@@ -8,26 +7,19 @@ export const loginCliLeaf = CliLeaf({
|
|
|
8
7
|
namedInputs: {
|
|
9
8
|
email: CliStringInput({
|
|
10
9
|
description: 'alwaysAI email',
|
|
11
|
-
required: true
|
|
10
|
+
required: true
|
|
12
11
|
}),
|
|
13
12
|
password: CliStringInput({
|
|
14
13
|
description: 'Account password',
|
|
15
|
-
required: true
|
|
16
|
-
})
|
|
17
|
-
device: CliStringInput({
|
|
18
|
-
description: 'The device UUID',
|
|
19
|
-
required: false,
|
|
20
|
-
}),
|
|
14
|
+
required: true
|
|
15
|
+
})
|
|
21
16
|
},
|
|
22
17
|
async action(_, opts) {
|
|
23
|
-
const { email, password
|
|
18
|
+
const { email, password } = opts;
|
|
24
19
|
|
|
25
20
|
await alwaysaiUserLoginYesComponent({
|
|
26
21
|
alwaysaiUserEmail: email,
|
|
27
|
-
alwaysaiUserPassword: password
|
|
22
|
+
alwaysaiUserPassword: password
|
|
28
23
|
});
|
|
29
|
-
|
|
30
|
-
await writeCertificateAndToken({ deviceUuid: device });
|
|
31
|
-
}
|
|
32
|
-
},
|
|
24
|
+
}
|
|
33
25
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { JsSpawner } from 'alwaysai/lib/util';
|
|
2
|
+
import { logger } from '../util/logger';
|
|
3
|
+
import { LOCAL_CERT_AND_KEY_DIR } from 'alwaysai/lib/constants';
|
|
4
|
+
import { BOOTSTRAP_CERTIFICATES_DIR_PATH } from '../util/directories';
|
|
5
|
+
|
|
6
|
+
export const rmBootstrapCertsAndClose = async () => {
|
|
7
|
+
const spawner = JsSpawner();
|
|
8
|
+
await spawner.rimraf(BOOTSTRAP_CERTIFICATES_DIR_PATH());
|
|
9
|
+
await spawner.rimraf(LOCAL_CERT_AND_KEY_DIR);
|
|
10
|
+
logger.error('Could not provision device. Try again.');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
};
|
package/src/util/directories.ts
CHANGED
|
@@ -1,68 +1,84 @@
|
|
|
1
1
|
import {
|
|
2
|
+
AAI_DIR,
|
|
2
3
|
DEVICE_TOKEN_FILE_NAME,
|
|
3
4
|
LOCAL_AAI_CFG_DIR,
|
|
5
|
+
LOCAL_CERT_AND_KEY_DIR
|
|
6
|
+
} from 'alwaysai/lib/constants';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { getSystemId } from '../infrastructure/system-id';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
|
|
11
|
+
export const APP_ROOT = path.join(AAI_DIR, 'applications');
|
|
12
|
+
|
|
13
|
+
export const CREDENTIALS_FILE_PATH = join(
|
|
14
|
+
LOCAL_AAI_CFG_DIR,
|
|
15
|
+
DEVICE_TOKEN_FILE_NAME
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export const AWS_ROOT_CERTIFICATE_FILE_NAME = 'AmazonRootCA1.pem';
|
|
19
|
+
export const AWS_ROOT_CERTIFICATE_FILE_PATH = join(
|
|
4
20
|
LOCAL_CERT_AND_KEY_DIR,
|
|
5
|
-
|
|
6
|
-
|
|
21
|
+
AWS_ROOT_CERTIFICATE_FILE_NAME
|
|
22
|
+
);
|
|
7
23
|
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
export const shortenSystemId = () => {
|
|
25
|
+
const id = getSystemId();
|
|
26
|
+
switch (id) {
|
|
27
|
+
case 'development':
|
|
28
|
+
return 'dev';
|
|
29
|
+
case 'qa':
|
|
30
|
+
return 'qa';
|
|
31
|
+
case 'production':
|
|
32
|
+
return 'prod';
|
|
33
|
+
}
|
|
34
|
+
};
|
|
17
35
|
|
|
18
|
-
export const
|
|
19
|
-
export const
|
|
20
|
-
|
|
36
|
+
export const BOOTSTRAP_DIR_NAME = 'bootstrap-certificates';
|
|
37
|
+
export const BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_NAME = () =>
|
|
38
|
+
`aai-claim-private-key_${shortenSystemId()}.pem.key`;
|
|
39
|
+
export const BOOTSTRAP_DEVICE_CERTIFICATE_FILE_NAME = () =>
|
|
40
|
+
`aai-claim-cert_${shortenSystemId()}.pem.crt`;
|
|
41
|
+
export const BOOTSTRAP_CLAIM_ID_FILE_NAME = () =>
|
|
42
|
+
`aai-claim-cert-id_${shortenSystemId()}.txt`;
|
|
43
|
+
export const CERTIFICATE_OWNERSHIP_TOKEN_FILE_NAME =
|
|
44
|
+
'certificate-ownership-token.txt';
|
|
45
|
+
export const DEVICE_PRIVATE_KEY_FILE_NAME = () =>
|
|
46
|
+
`aai-claim-private-key_${shortenSystemId()}.pem.key`;
|
|
47
|
+
export const DEVICE_CERTIFICATE_FILE_NAME = () =>
|
|
48
|
+
`aai-claim-cert_${shortenSystemId()}.pem.crt`;
|
|
49
|
+
export const DEVICE_CLAIM_ID_FILE_NAME = () =>
|
|
50
|
+
`aai-claim-cert-id_${shortenSystemId()}.txt`;
|
|
21
51
|
|
|
22
52
|
export function getPrivateKeyFilePath() {
|
|
23
|
-
return join(LOCAL_CERT_AND_KEY_DIR, DEVICE_PRIVATE_KEY_FILE_NAME);
|
|
53
|
+
return join(LOCAL_CERT_AND_KEY_DIR, DEVICE_PRIVATE_KEY_FILE_NAME());
|
|
24
54
|
}
|
|
25
55
|
|
|
26
56
|
export function getCertificateFilePath() {
|
|
27
|
-
return join(LOCAL_CERT_AND_KEY_DIR, DEVICE_CERTIFICATE_FILE_NAME);
|
|
57
|
+
return join(LOCAL_CERT_AND_KEY_DIR, DEVICE_CERTIFICATE_FILE_NAME());
|
|
28
58
|
}
|
|
29
59
|
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
60
|
+
export const BOOTSTRAP_CERTIFICATES_DIR_PATH = () =>
|
|
61
|
+
join(LOCAL_CERT_AND_KEY_DIR, BOOTSTRAP_DIR_NAME);
|
|
62
|
+
export const DEVICE_CLAIM_ID_FILE_PATH = () =>
|
|
63
|
+
join(LOCAL_CERT_AND_KEY_DIR, DEVICE_TOKEN_FILE_NAME);
|
|
33
64
|
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
65
|
+
export const BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_PATH = () =>
|
|
66
|
+
join(
|
|
67
|
+
LOCAL_CERT_AND_KEY_DIR,
|
|
68
|
+
BOOTSTRAP_DIR_NAME,
|
|
69
|
+
BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_NAME()
|
|
70
|
+
);
|
|
37
71
|
|
|
38
|
-
export const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
DEVICE_TOKEN_FILE_NAME
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
export const BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_PATH = join(
|
|
48
|
-
LOCAL_CERT_AND_KEY_DIR,
|
|
49
|
-
BOOTSTRAP_DIR_NAME,
|
|
50
|
-
BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_NAME
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
export const BOOTSTRAP_DEVICE_CERTIFICATE_FILE_PATH = join(
|
|
54
|
-
LOCAL_CERT_AND_KEY_DIR,
|
|
55
|
-
BOOTSTRAP_DIR_NAME,
|
|
56
|
-
BOOTSTRAP_DEVICE_CERTIFICATE_FILE_NAME
|
|
57
|
-
);
|
|
72
|
+
export const BOOTSTRAP_DEVICE_CERTIFICATE_FILE_PATH = () =>
|
|
73
|
+
join(
|
|
74
|
+
LOCAL_CERT_AND_KEY_DIR,
|
|
75
|
+
BOOTSTRAP_DIR_NAME,
|
|
76
|
+
BOOTSTRAP_DEVICE_CERTIFICATE_FILE_NAME()
|
|
77
|
+
);
|
|
58
78
|
|
|
59
|
-
export const BOOTSTRAP_CLAIM_ID_FILE_PATH =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
export const AWS_ROOT_CERTIFICATE_FILE_PATH = join(
|
|
66
|
-
LOCAL_CERT_AND_KEY_DIR,
|
|
67
|
-
AWS_ROOT_CERTIFICATE_FILE_NAME
|
|
68
|
-
);
|
|
79
|
+
export const BOOTSTRAP_CLAIM_ID_FILE_PATH = () =>
|
|
80
|
+
join(
|
|
81
|
+
LOCAL_CERT_AND_KEY_DIR,
|
|
82
|
+
BOOTSTRAP_DIR_NAME,
|
|
83
|
+
BOOTSTRAP_CLAIM_ID_FILE_NAME()
|
|
84
|
+
);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import nodeFetch from 'node-fetch';
|
|
2
|
+
|
|
3
|
+
export async function fetchWithTimeout(
|
|
4
|
+
url: string,
|
|
5
|
+
options: { timeout?: number } = {}
|
|
6
|
+
) {
|
|
7
|
+
//time (ms)
|
|
8
|
+
const { timeout = 60000 } = options;
|
|
9
|
+
|
|
10
|
+
const controller = new AbortController();
|
|
11
|
+
const id = setTimeout(() => controller.abort(), timeout);
|
|
12
|
+
const response = await nodeFetch(url, {
|
|
13
|
+
...options,
|
|
14
|
+
signal: controller.signal
|
|
15
|
+
});
|
|
16
|
+
clearTimeout(id);
|
|
17
|
+
return response;
|
|
18
|
+
}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CliTerseError } from '@alwaysai/alwayscli';
|
|
3
|
-
import { ConfigFile } from '@alwaysai/config-nodejs';
|
|
4
|
-
import * as t from 'io-ts';
|
|
1
|
+
import { DeviceConfigFile } from 'alwaysai/lib/core/device';
|
|
5
2
|
|
|
6
|
-
export function
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
3
|
+
export function getDeviceUuid() {
|
|
4
|
+
const deviceCfgFile = DeviceConfigFile();
|
|
5
|
+
if (!deviceCfgFile.exists()) {
|
|
6
|
+
throw new Error('Device configuration not found!');
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const cfg = deviceCfgFile.read();
|
|
10
|
+
return cfg.deviceUuid;
|
|
11
|
+
} catch (err) {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`Failed to read device configuration: ${JSON.stringify(
|
|
14
|
+
deviceCfgFile.getErrors(),
|
|
15
|
+
null,
|
|
16
|
+
2
|
|
17
|
+
)}`
|
|
19
18
|
);
|
|
20
19
|
}
|
|
21
|
-
return config.deviceId;
|
|
22
20
|
}
|
package/src/util/http-client.ts
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
import fetch from
|
|
2
|
-
import { serviceEndpointBuilder } from
|
|
3
|
-
import { CliAuthenticationClient } from
|
|
1
|
+
import fetch from 'node-fetch';
|
|
2
|
+
import { serviceEndpointBuilder } from '../endpoints';
|
|
3
|
+
import { CliAuthenticationClient } from 'alwaysai/lib/infrastructure';
|
|
4
|
+
import { logger } from '../util/logger';
|
|
4
5
|
|
|
5
6
|
export async function httpClient(
|
|
6
7
|
url: string,
|
|
7
8
|
method: string,
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
headers: any,
|
|
10
|
+
data?: string
|
|
10
11
|
) {
|
|
11
|
-
const options = {
|
|
12
|
+
const options = {
|
|
13
|
+
method,
|
|
14
|
+
...(data ? { body: data, headers } : { headers })
|
|
15
|
+
};
|
|
12
16
|
try {
|
|
13
17
|
const response = await fetch(url, options);
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const contentType = response.headers.get("content-type");
|
|
17
|
-
if (contentType === "application/json") {
|
|
18
|
+
const contentType = response.headers.get('content-type');
|
|
19
|
+
if (contentType === 'application/json') {
|
|
18
20
|
return await response.json();
|
|
19
|
-
}
|
|
21
|
+
}
|
|
22
|
+
if (contentType!.includes('text/plain')) {
|
|
20
23
|
return await response.text();
|
|
21
24
|
}
|
|
22
|
-
} catch (e) {
|
|
25
|
+
} catch (e) {
|
|
26
|
+
logger.error(`HTTP Client error for ${url}: ${e}`);
|
|
27
|
+
}
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
export async function microServiceHttpClient(
|
|
@@ -31,5 +36,5 @@ export async function microServiceHttpClient(
|
|
|
31
36
|
const endpoint = serviceEndpointBuilder(service, path);
|
|
32
37
|
const { getIdAuthorizationHeader } = CliAuthenticationClient();
|
|
33
38
|
const authorizationHeader = await getIdAuthorizationHeader();
|
|
34
|
-
return await httpClient(endpoint, method, data);
|
|
39
|
+
return await httpClient(endpoint, method, authorizationHeader, data);
|
|
35
40
|
}
|
package/src/util/logger.ts
CHANGED
|
@@ -5,24 +5,24 @@ import { AAI_DIR } from 'alwaysai/lib/constants';
|
|
|
5
5
|
import { ALWAYSAI_LOG_LEVEL, ALWAYSAI_LOG_TO_CONSOLE } from '../environment';
|
|
6
6
|
|
|
7
7
|
const LOG_LEVEL = ALWAYSAI_LOG_LEVEL || 'info';
|
|
8
|
+
|
|
8
9
|
const transports = ALWAYSAI_LOG_TO_CONSOLE
|
|
9
10
|
? [new winston.transports.Console({ level: LOG_LEVEL })]
|
|
10
11
|
: [
|
|
11
12
|
new winston.transports.DailyRotateFile({
|
|
12
13
|
filename: path.join(AAI_DIR, 'agent-logs', 'agent-logs.txt'),
|
|
13
14
|
maxSize: '5m',
|
|
14
|
-
maxFiles: '2d'
|
|
15
|
-
})
|
|
15
|
+
maxFiles: '2d'
|
|
16
|
+
})
|
|
16
17
|
];
|
|
17
18
|
|
|
18
19
|
export const logger = winston.createLogger({
|
|
19
20
|
level: LOG_LEVEL,
|
|
20
21
|
format: winston.format.combine(
|
|
22
|
+
winston.format.colorize(),
|
|
21
23
|
winston.format.errors({ stack: true }),
|
|
22
24
|
winston.format.splat(),
|
|
23
|
-
winston.format.simple()
|
|
25
|
+
winston.format.simple()
|
|
24
26
|
),
|
|
25
|
-
transports
|
|
27
|
+
transports
|
|
26
28
|
});
|
|
27
|
-
|
|
28
|
-
logger.info(`Initialized logger with log level: ${LOG_LEVEL}`);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { checkPaidPlan } from 'alwaysai/lib/core/project';
|
|
2
|
+
import { CliAuthenticationClient } from 'alwaysai/lib/infrastructure';
|
|
3
|
+
|
|
4
|
+
export async function requireLoggedInAndPaidPlan() {
|
|
5
|
+
// FIXME: Remove this requirement
|
|
6
|
+
if (!CliAuthenticationClient().isSignedIn()) {
|
|
7
|
+
throw new Error('You must be logged in to run this command!');
|
|
8
|
+
}
|
|
9
|
+
// FIXME: This also requires Cognito and should be replaced by a check in
|
|
10
|
+
// microServiceHttpClient()
|
|
11
|
+
if (!(await checkPaidPlan())) {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`This action only supported for Enterprise alwaysAI accounts!`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/util/run-in-dir.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const timer = (ms: number) => new Promise((res) => setTimeout(res, ms));
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { Spawner } from "alwaysai/lib/util";
|
|
2
|
-
export declare function getTargetHardwareUuid(spawner: Spawner): Promise<string>;
|
|
3
|
-
export declare function writeCertificateAndToken(props: {
|
|
4
|
-
deviceUuid: string;
|
|
5
|
-
}): Promise<void>;
|
|
6
|
-
//# sourceMappingURL=certificates-and-tokens.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"certificates-and-tokens.d.ts","sourceRoot":"","sources":["../../src/infrastructure/certificates-and-tokens.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,OAAO,EAGR,MAAM,mBAAmB,CAAC;AAI3B,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,OAAO,mBAW3D;AAGD,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,iBAmB3E"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.writeCertificateAndToken = exports.getTargetHardwareUuid = void 0;
|
|
4
|
-
const device_1 = require("alwaysai/lib/components/device");
|
|
5
|
-
const user_1 = require("alwaysai/lib/components/user");
|
|
6
|
-
const constants_1 = require("alwaysai/lib/constants");
|
|
7
|
-
const project_1 = require("alwaysai/lib/core/project");
|
|
8
|
-
const util_1 = require("alwaysai/lib/util");
|
|
9
|
-
const logger_1 = require("../util/logger");
|
|
10
|
-
// NOTE: This is reimplemented from the CLI to work for local checks
|
|
11
|
-
async function getTargetHardwareUuid(spawner) {
|
|
12
|
-
if (await spawner.exists("/var/lib/dbus/machine-id")) {
|
|
13
|
-
return await spawner.run({
|
|
14
|
-
exe: "cat",
|
|
15
|
-
args: ["/var/lib/dbus/machine-id"],
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
if (await spawner.exists("/etc/machine-id")) {
|
|
19
|
-
return await spawner.run({ exe: "cat", args: ["/etc/machine-id"] });
|
|
20
|
-
}
|
|
21
|
-
return await spawner.run({ exe: "hostname" });
|
|
22
|
-
}
|
|
23
|
-
exports.getTargetHardwareUuid = getTargetHardwareUuid;
|
|
24
|
-
// NOTE: This closely follows the flow of deviceCheckAndUpdateComponent in the CLI
|
|
25
|
-
async function writeCertificateAndToken(props) {
|
|
26
|
-
const { deviceUuid } = props;
|
|
27
|
-
await (0, user_1.checkUserIsLoggedInComponent)({ yes: true });
|
|
28
|
-
if (!(await (0, project_1.checkPaidPlan)())) {
|
|
29
|
-
throw new Error(`This action only supported for Enterprise alwaysAI accounts!`);
|
|
30
|
-
}
|
|
31
|
-
const tokens = {
|
|
32
|
-
deviceId: deviceUuid,
|
|
33
|
-
accessToken: "",
|
|
34
|
-
refreshToken: "",
|
|
35
|
-
idToken: "",
|
|
36
|
-
};
|
|
37
|
-
const tokenSpawner = (0, util_1.JsSpawner)({ path: constants_1.LOCAL_AAI_CFG_DIR });
|
|
38
|
-
await (0, util_1.writeTokens)({ spawner: tokenSpawner, tokens });
|
|
39
|
-
await (0, device_1.writeOrUpdateDeviceCfgFile)({ spawner: tokenSpawner });
|
|
40
|
-
logger_1.logger.info("Updated tokens and certificate");
|
|
41
|
-
}
|
|
42
|
-
exports.writeCertificateAndToken = writeCertificateAndToken;
|
|
43
|
-
//# sourceMappingURL=certificates-and-tokens.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"certificates-and-tokens.js","sourceRoot":"","sources":["../../src/infrastructure/certificates-and-tokens.ts"],"names":[],"mappings":";;;AAAA,2DAGwC;AACxC,uDAA4E;AAC5E,sDAGgC;AAChC,uDAA0D;AAC1D,4CAK2B;AAC3B,2CAAwC;AAExC,oEAAoE;AAC7D,KAAK,UAAU,qBAAqB,CAAC,OAAgB;IAC1D,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAAE;QACpD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;YACvB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC,0BAA0B,CAAC;SACnC,CAAC,CAAC;KACJ;IACD,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE;QAC3C,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;KACrE;IACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;AAChD,CAAC;AAXD,sDAWC;AAED,kFAAkF;AAC3E,KAAK,UAAU,wBAAwB,CAAC,KAA6B;IAC1E,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC7B,MAAM,IAAA,mCAA4B,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC,MAAM,IAAA,uBAAa,GAAE,CAAC,EAAE;QAC5B,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;KACH;IACD,MAAM,MAAM,GAAiB;QAC3B,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,MAAM,YAAY,GAAG,IAAA,gBAAS,EAAC,EAAE,IAAI,EAAE,6BAAiB,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAA,kBAAW,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,IAAA,mCAA0B,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAE5D,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAnBD,4DAmBC"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DeviceTokens,
|
|
3
|
-
writeOrUpdateDeviceCfgFile,
|
|
4
|
-
} from "alwaysai/lib/components/device";
|
|
5
|
-
import { checkUserIsLoggedInComponent } from "alwaysai/lib/components/user";
|
|
6
|
-
import {
|
|
7
|
-
LOCAL_AAI_CFG_DIR,
|
|
8
|
-
LOCAL_CERT_AND_KEY_DIR,
|
|
9
|
-
} from "alwaysai/lib/constants";
|
|
10
|
-
import { checkPaidPlan } from "alwaysai/lib/core/project";
|
|
11
|
-
import {
|
|
12
|
-
JsSpawner,
|
|
13
|
-
Spawner,
|
|
14
|
-
writeCertificate,
|
|
15
|
-
writeTokens,
|
|
16
|
-
} from "alwaysai/lib/util";
|
|
17
|
-
import { logger } from "../util/logger";
|
|
18
|
-
|
|
19
|
-
// NOTE: This is reimplemented from the CLI to work for local checks
|
|
20
|
-
export async function getTargetHardwareUuid(spawner: Spawner) {
|
|
21
|
-
if (await spawner.exists("/var/lib/dbus/machine-id")) {
|
|
22
|
-
return await spawner.run({
|
|
23
|
-
exe: "cat",
|
|
24
|
-
args: ["/var/lib/dbus/machine-id"],
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
if (await spawner.exists("/etc/machine-id")) {
|
|
28
|
-
return await spawner.run({ exe: "cat", args: ["/etc/machine-id"] });
|
|
29
|
-
}
|
|
30
|
-
return await spawner.run({ exe: "hostname" });
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// NOTE: This closely follows the flow of deviceCheckAndUpdateComponent in the CLI
|
|
34
|
-
export async function writeCertificateAndToken(props: { deviceUuid: string }) {
|
|
35
|
-
const { deviceUuid } = props;
|
|
36
|
-
await checkUserIsLoggedInComponent({ yes: true });
|
|
37
|
-
if (!(await checkPaidPlan())) {
|
|
38
|
-
throw new Error(
|
|
39
|
-
`This action only supported for Enterprise alwaysAI accounts!`
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
const tokens: DeviceTokens = {
|
|
43
|
-
deviceId: deviceUuid,
|
|
44
|
-
accessToken: "",
|
|
45
|
-
refreshToken: "",
|
|
46
|
-
idToken: "",
|
|
47
|
-
};
|
|
48
|
-
const tokenSpawner = JsSpawner({ path: LOCAL_AAI_CFG_DIR });
|
|
49
|
-
await writeTokens({ spawner: tokenSpawner, tokens });
|
|
50
|
-
await writeOrUpdateDeviceCfgFile({ spawner: tokenSpawner });
|
|
51
|
-
|
|
52
|
-
logger.info("Updated tokens and certificate");
|
|
53
|
-
}
|