@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
JavaScript
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;