UNPKG

@autocodingsystems/gateway-client

Version:

Library and commandline utility to control the acs gateway - device drivers for the most common industrial production line devices

107 lines (89 loc) 3.99 kB
var api = require('../api'); const {promisify} = require('util'); const fs = require('fs'); const readfile = promisify(fs.readFile); const stripJsonComments = require('strip-json-comments'); var globToRegExp = require('glob-to-regexp'); async function update_command(argv, conf, options) { var target = require('../parameters/target')(argv); var name = require('../parameters/namenodefault')(argv); var jobfile = require('../parameters/jobfile')(argv); var datafile = require('../parameters/datafile')(argv); var nowait = require('../parameters/nowait')(argv); var jobjson = require('../parameters/jobjson')(argv); var datajson = require('../parameters/datajson')(argv); var timeout = require('../parameters/timeout')(argv); var raw = require('../parameters/raw')(argv); if (!target.value || !name.value || (!jobfile.value && !jobjson.value)) { usage(); return; } var filter = globToRegExp(name.value, {extended: true}); try { var jobtext = jobjson.value; if (jobfile.value) { jobtext = await readfile(jobfile.value, 'utf8'); } var jobdatatext = datajson.value; if (datafile.value) { jobdatatext = await readfile(datafile.value, 'utf8'); } var job = JSON.parse(stripJsonComments(jobtext)); var jobdata = jobdatatext ? JSON.parse(stripJsonComments(jobdatatext)) : []; // Apply the data to the job (we could get more clever here, but for now, just append the default data to the specific data) api(target.value).applyDataToJob(job, jobdata); var devices = await api(target.value).raw.getDevices(); devices = devices.filter(d => filter.test(d.Name)); var applyResults = await Promise.all(devices.map(async d => { var result = Object.assign({}, d, {Applied: false, Success: false, ValidationErrors: null, Message: 'Request not sent'}); try { await api(target.value).raw.applyDeviceJob(d.Id, job); result.Applied = true; result.Message = 'Did not wait for result'; if (!nowait.value) { var jobstatus = await api(target.value).waitForJobStatusChange(d.Id, 'Updating', timeout.value); if (jobstatus.Status !== 'Updated') { result.Message = jobstatus.Message; } else { result.Success = true; result.Message = ''; } } return result; } catch (e) { result.Success = false; try { result.ValidationErrors = JSON.parse(e.Message).Errors; result.Message = 'Job validation failed'; } catch (e2) { result.Message = e.Message; } } return result; })); applyResults.forEach(ar => { if (raw.value) { console.log(JSON.stringify(ar)); } else if (ar.Success || nowait.value) { console.log(`Applied Job To ${ar.Id}: ${ar.Name}`); } else { console.log(`Apply Job Failed For ${ar.Id}: ${ar.Name}, ${ar.Message}`); } }); } catch (e) { throw e; } function usage() { console.log('update: apply a job to a device on a target gateway: '); console.log(' ' + target.description); console.log(' ' + name.description); console.log(' ' + jobfile.description); console.log(' ' + datafile.description); console.log(' ' + nowait.description); console.log(' ' + jobjson.description); console.log(' ' + datajson.description); console.log(' ' + timeout.description); console.log(' ' + raw.description); } } module.exports = update_command;