UNPKG

alwaysai

Version:

The alwaysAI command-line interface (CLI)

99 lines (95 loc) 3.24 kB
import { CliTerseError } from '@alwaysai/alwayscli'; import { join } from 'path'; import { PLEASE_REPORT_THIS_ERROR_MESSAGE } from '../../constants'; import { writeCertificate } from '../../core/device'; import { writeDeviceCfgFile } from '../../core/device/write-or-validate-device-cfg-file'; import { requirePaidPlan } from '../../core/project'; import { addDevice, AddedDevice, CliAuthenticationClient, LocalAaiCfg } from '../../infrastructure'; import { DEVICE_CERTIFICATES_DIRECTORY_NAME } from '../../infrastructure/certificate-paths'; import { getDeviceConfigPath } from '../../infrastructure/device-paths'; import { AAI_CONFIG_DIRECTORY_NAME } from '../../paths'; import { echo, JsSpawner, logger, runWithSpinner, stringifyError } from '../../util'; import { checkUserIsLoggedInComponent } from '../user'; export async function generateProductionDeviceFunc(props: { name: string; description?: string; }) { const { name, description } = props; await checkUserIsLoggedInComponent({ yes: false }); await requirePaidPlan(); const { username } = await CliAuthenticationClient().getInfo(); const deviceToAdd = { owner: username, friendly_name: name, host_name: '', device_user_name: '', description: description ?? '', hardware_ids: '', device_hash: '', iotKeys: '' }; try { const response: AddedDevice = await generateDevice(deviceToAdd); const outDir = join(process.cwd(), response.deviceUUID); const aaiDir = join(outDir, AAI_CONFIG_DIRECTORY_NAME); const cfgDir = join(aaiDir, getDeviceConfigPath()); await runWithSpinner( async () => { // Write tokens, deviceId and systemId to // {cwd}/{UUID}/.config/alwaysai/device{getSystemId()}/alwaysai.device.json // and write systemId to // {cwd}/{UUID}/.config/alwaysai/alwaysai.config.json const tokenSpawner = JsSpawner({ path: cfgDir }); const certSpawner = JsSpawner({ path: join(cfgDir, DEVICE_CERTIFICATES_DIRECTORY_NAME) }); const aaiConfigFile = new LocalAaiCfg(aaiDir); await aaiConfigFile.writeAaiCfgFile(); await writeDeviceCfgFile({ spawner: tokenSpawner, deviceUuid: response.deviceUUID, accessToken: response.accessToken, refreshToken: response.refreshToken, idToken: response.idToken }); await writeCertificate({ spawner: certSpawner, certificate: response.iotKeys.certificatePem, privateKey: response.iotKeys.keyPair.PrivateKey, rootCa: response.iotKeys.rootCA }); }, [], `Write device credentials to ${outDir}` ); echo(`Created ${name}: device ID=${response.deviceUUID}`); return response.deviceUUID; } catch (error) { logger.error(stringifyError(error)); throw new CliTerseError( `There was an error with creating the device. ${PLEASE_REPORT_THIS_ERROR_MESSAGE}` ); } } async function generateDevice(deviceToAdd) { let response; await runWithSpinner( async () => { response = await addDevice(deviceToAdd, 'production'); }, [], 'Create new production device' ); return response; }