UNPKG

alwaysai

Version:

The alwaysAI command-line interface (CLI)

111 lines (107 loc) 4.14 kB
import { CliTerseError } from '@alwaysai/alwayscli'; import { join } from 'path'; import { PLEASE_REPORT_THIS_ERROR_MESSAGE } from '../../constants'; import { getTargetHardwareUuid } from '../../core/app'; import { DeviceCfgErrors, writeDeviceCfgFile, writeOrValidateDeviceCfgFile } from '../../core/device'; import { AaiDevice, RemoteAaiCfg, refreshDevice } from '../../infrastructure'; import { getDeviceConfigPath } from '../../infrastructure/device-paths'; import { REMOTE_AAI_CFG_DIR_LINUX } from '../../paths'; import { SshSpawner, logger, runWithSpinner, stringifyError } from '../../util'; export async function deviceCheckAndUpdateComponent(props: { yes: boolean; targetHostname: string; device: AaiDevice; isNewDevice: boolean; }) { const { targetHostname, device, isNewDevice } = props; const spawner = SshSpawner({ targetHostname, targetPath: join(REMOTE_AAI_CFG_DIR_LINUX, getDeviceConfigPath()) }); const CLEAR_OLD_CONF_MESSAGE = "To remove old configurations from the device run 'aai device clean', and then run 'aai app configure' again."; if (isNewDevice) { await runWithSpinner( async () => { try { const { accessToken, refreshToken, idToken } = await refreshDevice( device.uuid ); // Write systemId to {HOME}/.config/alwaysai/alwaysai.config.json const aaiConfigFile = new RemoteAaiCfg(targetHostname); logger.debug( 'Remote alwaysai configuration instance created, attempting to write aai configuration file.' ); await aaiConfigFile.writeAaiCfgFile(); // Then write tokens, device UUID and systemId to {HOME}/.config/alwaysai/device{getSystemId()/alwaysai.device.json await writeDeviceCfgFile({ spawner, deviceUuid: device.uuid, accessToken, refreshToken, idToken }); } catch (e) { logger.error(stringifyError(e)); if (e.code === DeviceCfgErrors.TARGET_DEVICE_CONFIGURED) { throw new CliTerseError( `The target device is already configured as an alwaysAI device! ${CLEAR_OLD_CONF_MESSAGE}` ); } else { logger.error(stringifyError(e)); throw new CliTerseError( `There was an error with configuring the device. ${PLEASE_REPORT_THIS_ERROR_MESSAGE}` ); } } }, [], 'Configure device' ); } else { await runWithSpinner( async () => { // NOTE: if hardwareId passes, write the new configuration files (assume it is the correct device) const hardwareId = await getTargetHardwareUuid(spawner); if (hardwareId !== device.hardware_ids) { throw new CliTerseError( `The target device does not match the selected device! ${CLEAR_OLD_CONF_MESSAGE}` ); } const { accessToken, refreshToken, idToken } = await refreshDevice( device.uuid ); try { // Write systemId to {HOME}/.config/alwaysai/alwaysai.config.json const aaiConfigFile = new RemoteAaiCfg(targetHostname); await aaiConfigFile.writeAaiCfgFile(); // Then write tokens, device UUID and systemId to {HOME}/.config/alwaysai/{device folder}/alwaysai.device.json await writeOrValidateDeviceCfgFile({ spawner, deviceUuid: device.uuid, accessToken, idToken, refreshToken }); } catch (e) { if (e.code === DeviceCfgErrors.TARGET_DEVICE_MISMATCH) { throw new CliTerseError( `The target device does not match the selected device! ${CLEAR_OLD_CONF_MESSAGE}` ); } else { logger.error(stringifyError(e)); throw new CliTerseError( `There was an error with updating the device configuration. ${PLEASE_REPORT_THIS_ERROR_MESSAGE}` ); } } }, [], 'Check and update device configuration and tokens' ); } }