@itentialopensource/adapter-meraki 0.7.2 → 0.8.1
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/AUTH.md +40 -0
- package/CALLS.md +100 -0
- package/CHANGELOG.md +24 -0
- package/ENHANCE.md +69 -0
- package/PROPERTIES.md +247 -0
- package/README.md +113 -470
- package/SUMMARY.md +9 -0
- package/SYSTEMINFO.md +11 -0
- package/TROUBLESHOOT.md +46 -0
- package/adapter.js +911 -64
- package/adapterBase.js +294 -271
- package/entities/.generic/action.json +5 -5
- package/error.json +12 -0
- package/package.json +18 -13
- package/pronghorn.json +289 -104
- package/propertiesSchema.json +238 -0
- package/refs?service=git-upload-pack +0 -0
- package/report/updateReport1642739939352.json +95 -0
- package/sampleProperties.json +4 -1
- package/test/integration/adapterTestBasicGet.js +1 -1
- package/test/integration/adapterTestIntegration.js +11 -2
- package/test/unit/adapterBaseTestUnit.js +27 -26
- package/test/unit/adapterTestUnit.js +632 -11
- package/utils/addAuth.js +94 -0
- package/utils/basicGet.js +1 -14
- package/utils/entitiesToDB.js +224 -0
- package/utils/modify.js +1 -1
- package/utils/packModificationScript.js +1 -1
- package/utils/patches2bundledDeps.js +90 -0
- package/utils/removeHooks.js +20 -0
- package/utils/tbScript.js +14 -8
- package/utils/tbUtils.js +98 -19
- package/utils/troubleshootingAdapter.js +2 -26
package/adapter.js
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
/* eslint import/no-dynamic-require: warn */
|
4
4
|
/* eslint object-curly-newline: warn */
|
5
|
-
/* eslint no-underscore-dangle: warn */
|
6
|
-
/* eslint camelcase: warn */
|
7
5
|
|
8
6
|
// Set globals
|
9
7
|
/* global log */
|
@@ -82,10 +80,10 @@ class Meraki extends AdapterBaseCl {
|
|
82
80
|
}
|
83
81
|
|
84
82
|
/**
|
85
|
-
* @
|
83
|
+
* @iapGetAdapterWorkflowFunctions
|
86
84
|
*/
|
87
|
-
|
88
|
-
let myIgnore = [];
|
85
|
+
iapGetAdapterWorkflowFunctions(inIgnore) {
|
86
|
+
let myIgnore = ['hasEntities', 'hasDevices'];
|
89
87
|
if (!inIgnore && Array.isArray(inIgnore)) {
|
90
88
|
myIgnore = inIgnore;
|
91
89
|
} else if (!inIgnore && typeof inIgnore === 'string') {
|
@@ -96,15 +94,15 @@ class Meraki extends AdapterBaseCl {
|
|
96
94
|
// you can add specific methods that you do not want to be workflow functions to ignore like below
|
97
95
|
// myIgnore.push('myMethodNotInWorkflow');
|
98
96
|
|
99
|
-
return super.
|
97
|
+
return super.iapGetAdapterWorkflowFunctions(myIgnore);
|
100
98
|
}
|
101
99
|
|
102
100
|
/**
|
103
|
-
*
|
101
|
+
* iapUpdateAdapterConfiguration is used to update any of the adapter configuration files. This
|
104
102
|
* allows customers to make changes to adapter configuration without having to be on the
|
105
103
|
* file system.
|
106
104
|
*
|
107
|
-
* @function
|
105
|
+
* @function iapUpdateAdapterConfiguration
|
108
106
|
* @param {string} configFile - the name of the file being updated (required)
|
109
107
|
* @param {Object} changes - an object containing all of the changes = formatted like the configuration file (required)
|
110
108
|
* @param {string} entity - the entity to be changed, if an action, schema or mock data file (optional)
|
@@ -112,36 +110,36 @@ class Meraki extends AdapterBaseCl {
|
|
112
110
|
* @param {string} action - the action to be changed, if an action, schema or mock data file (optional)
|
113
111
|
* @param {Callback} callback - The results of the call
|
114
112
|
*/
|
115
|
-
|
116
|
-
const origin = `${this.id}-adapter-
|
113
|
+
iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, callback) {
|
114
|
+
const origin = `${this.id}-adapter-iapUpdateAdapterConfiguration`;
|
117
115
|
log.trace(origin);
|
118
|
-
super.
|
116
|
+
super.iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, callback);
|
119
117
|
}
|
120
118
|
|
121
119
|
/**
|
122
120
|
* See if the API path provided is found in this adapter
|
123
121
|
*
|
124
|
-
* @function
|
122
|
+
* @function iapFindAdapterPath
|
125
123
|
* @param {string} apiPath - the api path to check on
|
126
124
|
* @param {Callback} callback - The results of the call
|
127
125
|
*/
|
128
|
-
|
129
|
-
const origin = `${this.id}-adapter-
|
126
|
+
iapFindAdapterPath(apiPath, callback) {
|
127
|
+
const origin = `${this.id}-adapter-iapFindAdapterPath`;
|
130
128
|
log.trace(origin);
|
131
|
-
super.
|
129
|
+
super.iapFindAdapterPath(apiPath, callback);
|
132
130
|
}
|
133
131
|
|
134
132
|
/**
|
135
133
|
* @summary Suspends adapter
|
136
134
|
*
|
137
|
-
* @function
|
135
|
+
* @function iapSuspendAdapter
|
138
136
|
* @param {Callback} callback - callback function
|
139
137
|
*/
|
140
|
-
|
141
|
-
const origin = `${this.id}-adapter-
|
138
|
+
iapSuspendAdapter(mode, callback) {
|
139
|
+
const origin = `${this.id}-adapter-iapSuspendAdapter`;
|
142
140
|
log.trace(origin);
|
143
141
|
try {
|
144
|
-
return super.
|
142
|
+
return super.iapSuspendAdapter(mode, callback);
|
145
143
|
} catch (error) {
|
146
144
|
log.error(`${origin}: ${error}`);
|
147
145
|
return callback(null, error);
|
@@ -151,14 +149,14 @@ class Meraki extends AdapterBaseCl {
|
|
151
149
|
/**
|
152
150
|
* @summary Unsuspends adapter
|
153
151
|
*
|
154
|
-
* @function
|
152
|
+
* @function iapUnsuspendAdapter
|
155
153
|
* @param {Callback} callback - callback function
|
156
154
|
*/
|
157
|
-
|
158
|
-
const origin = `${this.id}-adapter-
|
155
|
+
iapUnsuspendAdapter(callback) {
|
156
|
+
const origin = `${this.id}-adapter-iapUnsuspendAdapter`;
|
159
157
|
log.trace(origin);
|
160
158
|
try {
|
161
|
-
return super.
|
159
|
+
return super.iapUnsuspendAdapter(callback);
|
162
160
|
} catch (error) {
|
163
161
|
log.error(`${origin}: ${error}`);
|
164
162
|
return callback(null, error);
|
@@ -168,29 +166,29 @@ class Meraki extends AdapterBaseCl {
|
|
168
166
|
/**
|
169
167
|
* @summary Get the Adaoter Queue
|
170
168
|
*
|
171
|
-
* @function
|
169
|
+
* @function iapGetAdapterQueue
|
172
170
|
* @param {Callback} callback - callback function
|
173
171
|
*/
|
174
|
-
|
175
|
-
const origin = `${this.id}-adapter-
|
172
|
+
iapGetAdapterQueue(callback) {
|
173
|
+
const origin = `${this.id}-adapter-iapGetAdapterQueue`;
|
176
174
|
log.trace(origin);
|
177
|
-
return super.
|
175
|
+
return super.iapGetAdapterQueue(callback);
|
178
176
|
}
|
179
177
|
|
180
178
|
/**
|
181
179
|
* @summary Runs troubleshoot scripts for adapter
|
182
180
|
*
|
183
|
-
* @function
|
181
|
+
* @function iapTroubleshootAdapter
|
184
182
|
* @param {Object} props - the connection, healthcheck and authentication properties
|
185
183
|
*
|
186
184
|
* @param {boolean} persistFlag - whether the adapter properties should be updated
|
187
185
|
* @param {Callback} callback - The results of the call
|
188
186
|
*/
|
189
|
-
|
190
|
-
const origin = `${this.id}-adapter-
|
187
|
+
iapTroubleshootAdapter(props, persistFlag, callback) {
|
188
|
+
const origin = `${this.id}-adapter-iapTroubleshootAdapter`;
|
191
189
|
log.trace(origin);
|
192
190
|
try {
|
193
|
-
return super.
|
191
|
+
return super.iapTroubleshootAdapter(props, persistFlag, this, callback);
|
194
192
|
} catch (error) {
|
195
193
|
log.error(`${origin}: ${error}`);
|
196
194
|
return callback(null, error);
|
@@ -200,15 +198,15 @@ class Meraki extends AdapterBaseCl {
|
|
200
198
|
/**
|
201
199
|
* @summary runs healthcheck script for adapter
|
202
200
|
*
|
203
|
-
* @function
|
201
|
+
* @function iapRunAdapterHealthcheck
|
204
202
|
* @param {Adapter} adapter - adapter instance to troubleshoot
|
205
203
|
* @param {Callback} callback - callback function
|
206
204
|
*/
|
207
|
-
|
208
|
-
const origin = `${this.id}-adapter-
|
205
|
+
iapRunAdapterHealthcheck(callback) {
|
206
|
+
const origin = `${this.id}-adapter-iapRunAdapterHealthcheck`;
|
209
207
|
log.trace(origin);
|
210
208
|
try {
|
211
|
-
return super.
|
209
|
+
return super.iapRunAdapterHealthcheck(this, callback);
|
212
210
|
} catch (error) {
|
213
211
|
log.error(`${origin}: ${error}`);
|
214
212
|
return callback(null, error);
|
@@ -218,14 +216,14 @@ class Meraki extends AdapterBaseCl {
|
|
218
216
|
/**
|
219
217
|
* @summary runs connectivity check script for adapter
|
220
218
|
*
|
221
|
-
* @function
|
219
|
+
* @function iapRunAdapterConnectivity
|
222
220
|
* @param {Callback} callback - callback function
|
223
221
|
*/
|
224
|
-
|
225
|
-
const origin = `${this.id}-adapter-
|
222
|
+
iapRunAdapterConnectivity(callback) {
|
223
|
+
const origin = `${this.id}-adapter-iapRunAdapterConnectivity`;
|
226
224
|
log.trace(origin);
|
227
225
|
try {
|
228
|
-
return super.
|
226
|
+
return super.iapRunAdapterConnectivity(callback);
|
229
227
|
} catch (error) {
|
230
228
|
log.error(`${origin}: ${error}`);
|
231
229
|
return callback(null, error);
|
@@ -235,44 +233,63 @@ class Meraki extends AdapterBaseCl {
|
|
235
233
|
/**
|
236
234
|
* @summary runs basicGet script for adapter
|
237
235
|
*
|
238
|
-
* @function
|
236
|
+
* @function iapRunAdapterBasicGet
|
239
237
|
* @param {Callback} callback - callback function
|
240
238
|
*/
|
241
|
-
|
242
|
-
const origin = `${this.id}-adapter-
|
239
|
+
iapRunAdapterBasicGet(callback) {
|
240
|
+
const origin = `${this.id}-adapter-iapRunAdapterBasicGet`;
|
243
241
|
log.trace(origin);
|
244
242
|
try {
|
245
|
-
return super.
|
243
|
+
return super.iapRunAdapterBasicGet(callback);
|
246
244
|
} catch (error) {
|
247
245
|
log.error(`${origin}: ${error}`);
|
248
246
|
return callback(null, error);
|
249
247
|
}
|
250
248
|
}
|
251
249
|
|
250
|
+
/**
|
251
|
+
* @summary moves entites into Mongo DB
|
252
|
+
*
|
253
|
+
* @function iapMoveAdapterEntitiesToDB
|
254
|
+
* @param {getCallback} callback - a callback function to return the result (Generics)
|
255
|
+
* or the error
|
256
|
+
*/
|
257
|
+
iapMoveAdapterEntitiesToDB(callback) {
|
258
|
+
const origin = `${this.id}-adapter-iapMoveAdapterEntitiesToDB`;
|
259
|
+
log.trace(origin);
|
260
|
+
try {
|
261
|
+
return super.iapMoveAdapterEntitiesToDB(callback);
|
262
|
+
} catch (err) {
|
263
|
+
log.error(`${origin}: ${err}`);
|
264
|
+
return callback(null, err);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
/* BROKER CALLS */
|
252
269
|
/**
|
253
270
|
* @summary Determines if this adapter supports the specific entity
|
254
271
|
*
|
255
|
-
* @function
|
272
|
+
* @function iapHasAdapterEntity
|
256
273
|
* @param {String} entityType - the entity type to check for
|
257
274
|
* @param {String/Array} entityId - the specific entity we are looking for
|
258
275
|
*
|
259
276
|
* @param {Callback} callback - An array of whether the adapter can has the
|
260
277
|
* desired capability or an error
|
261
278
|
*/
|
262
|
-
|
263
|
-
const origin = `${this.id}-adapter-
|
279
|
+
iapHasAdapterEntity(entityType, entityId, callback) {
|
280
|
+
const origin = `${this.id}-adapter-iapHasAdapterEntity`;
|
264
281
|
log.trace(origin);
|
265
282
|
|
266
283
|
// Make the call -
|
267
|
-
//
|
268
|
-
return this.
|
284
|
+
// iapVerifyAdapterCapability(entityType, actionType, entityId, callback)
|
285
|
+
return this.iapVerifyAdapterCapability(entityType, null, entityId, callback);
|
269
286
|
}
|
270
287
|
|
271
288
|
/**
|
272
289
|
* @summary Provides a way for the adapter to tell north bound integrations
|
273
290
|
* whether the adapter supports type, action and specific entity
|
274
291
|
*
|
275
|
-
* @function
|
292
|
+
* @function iapVerifyAdapterCapability
|
276
293
|
* @param {String} entityType - the entity type to check for
|
277
294
|
* @param {String} actionType - the action type to check for
|
278
295
|
* @param {String/Array} entityId - the specific entity we are looking for
|
@@ -280,15 +297,15 @@ class Meraki extends AdapterBaseCl {
|
|
280
297
|
* @param {Callback} callback - An array of whether the adapter can has the
|
281
298
|
* desired capability or an error
|
282
299
|
*/
|
283
|
-
|
284
|
-
const meth = 'adapterBase-
|
300
|
+
iapVerifyAdapterCapability(entityType, actionType, entityId, callback) {
|
301
|
+
const meth = 'adapterBase-iapVerifyAdapterCapability';
|
285
302
|
const origin = `${this.id}-${meth}`;
|
286
303
|
log.trace(origin);
|
287
304
|
|
288
305
|
// if caching
|
289
306
|
if (this.caching) {
|
290
|
-
// Make the call -
|
291
|
-
return this.requestHandlerInst.
|
307
|
+
// Make the call - iapVerifyAdapterCapability(entityType, actionType, entityId, callback)
|
308
|
+
return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, entityId, (results, error) => {
|
292
309
|
if (error) {
|
293
310
|
return callback(null, error);
|
294
311
|
}
|
@@ -306,7 +323,7 @@ class Meraki extends AdapterBaseCl {
|
|
306
323
|
}
|
307
324
|
|
308
325
|
// need to check the cache again since it has been updated
|
309
|
-
return this.requestHandlerInst.
|
326
|
+
return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, entityId, (vcapable, verror) => {
|
310
327
|
if (verror) {
|
311
328
|
return callback(null, verror);
|
312
329
|
}
|
@@ -339,7 +356,7 @@ class Meraki extends AdapterBaseCl {
|
|
339
356
|
// if no entity id
|
340
357
|
if (!entityId) {
|
341
358
|
// need to check the cache again since it has been updated
|
342
|
-
return this.requestHandlerInst.
|
359
|
+
return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, null, (vcapable, verror) => {
|
343
360
|
if (verror) {
|
344
361
|
return callback(null, verror);
|
345
362
|
}
|
@@ -360,7 +377,7 @@ class Meraki extends AdapterBaseCl {
|
|
360
377
|
}
|
361
378
|
|
362
379
|
// need to check the cache again since it has been updated
|
363
|
-
return this.requestHandlerInst.
|
380
|
+
return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, null, (vcapable, verror) => {
|
364
381
|
if (verror) {
|
365
382
|
return callback(null, verror);
|
366
383
|
}
|
@@ -401,11 +418,11 @@ class Meraki extends AdapterBaseCl {
|
|
401
418
|
/**
|
402
419
|
* @summary Updates the cache for all entities by call the get All entity method
|
403
420
|
*
|
404
|
-
* @function
|
421
|
+
* @function iapUpdateAdapterEntityCache
|
405
422
|
*
|
406
423
|
*/
|
407
|
-
|
408
|
-
const origin = `${this.id}-adapter-
|
424
|
+
iapUpdateAdapterEntityCache() {
|
425
|
+
const origin = `${this.id}-adapter-iapUpdateAdapterEntityCache`;
|
409
426
|
log.trace(origin);
|
410
427
|
|
411
428
|
if (this.caching) {
|
@@ -418,6 +435,836 @@ class Meraki extends AdapterBaseCl {
|
|
418
435
|
}
|
419
436
|
}
|
420
437
|
|
438
|
+
/**
|
439
|
+
* @summary Determines if this adapter supports any in a list of entities
|
440
|
+
*
|
441
|
+
* @function hasEntities
|
442
|
+
* @param {String} entityType - the entity type to check for
|
443
|
+
* @param {Array} entityList - the list of entities we are looking for
|
444
|
+
*
|
445
|
+
* @param {Callback} callback - A map where the entity is the key and the
|
446
|
+
* value is true or false
|
447
|
+
*/
|
448
|
+
hasEntities(entityType, entityList, callback) {
|
449
|
+
const origin = `${this.id}-adapter-hasEntities`;
|
450
|
+
log.trace(origin);
|
451
|
+
|
452
|
+
switch (entityType) {
|
453
|
+
case 'Device':
|
454
|
+
return this.hasDevices(entityList, callback);
|
455
|
+
default:
|
456
|
+
return callback(null, `${this.id} does not support entity ${entityType}`);
|
457
|
+
}
|
458
|
+
}
|
459
|
+
|
460
|
+
/**
|
461
|
+
* @summary Helper method for hasEntities for the specific device case
|
462
|
+
*
|
463
|
+
* @param {Array} deviceList - array of unique device identifiers
|
464
|
+
* @param {Callback} callback - A map where the device is the key and the
|
465
|
+
* value is true or false
|
466
|
+
*/
|
467
|
+
hasDevices(deviceList, callback) {
|
468
|
+
const origin = `${this.id}-adapter-hasDevices`;
|
469
|
+
log.trace(origin);
|
470
|
+
|
471
|
+
const findings = deviceList.reduce((map, device) => {
|
472
|
+
// eslint-disable-next-line no-param-reassign
|
473
|
+
map[device] = false;
|
474
|
+
log.debug(`In reduce: ${JSON.stringify(map)}`);
|
475
|
+
return map;
|
476
|
+
}, {});
|
477
|
+
const apiCalls = deviceList.map((device) => new Promise((resolve) => {
|
478
|
+
this.getDevice(device, (result, error) => {
|
479
|
+
if (error) {
|
480
|
+
log.debug(`In map error: ${JSON.stringify(device)}`);
|
481
|
+
return resolve({ name: device, found: false });
|
482
|
+
}
|
483
|
+
log.debug(`In map: ${JSON.stringify(device)}`);
|
484
|
+
return resolve({ name: device, found: true });
|
485
|
+
});
|
486
|
+
}));
|
487
|
+
Promise.all(apiCalls).then((results) => {
|
488
|
+
results.forEach((device) => {
|
489
|
+
findings[device.name] = device.found;
|
490
|
+
});
|
491
|
+
log.debug(`FINDINGS: ${JSON.stringify(findings)}`);
|
492
|
+
return callback(findings);
|
493
|
+
}).catch((errors) => {
|
494
|
+
log.error('Unable to do device lookup.');
|
495
|
+
return callback(null, { code: 503, message: 'Unable to do device lookup.', error: errors });
|
496
|
+
});
|
497
|
+
}
|
498
|
+
|
499
|
+
/**
|
500
|
+
* @summary Get Appliance that match the deviceName
|
501
|
+
*
|
502
|
+
* @function getDevice
|
503
|
+
* @param {String} deviceName - the deviceName to find (required)
|
504
|
+
*
|
505
|
+
* @param {getCallback} callback - a callback function to return the result
|
506
|
+
* (appliance) or the error
|
507
|
+
*/
|
508
|
+
getDevice(deviceName, callback) {
|
509
|
+
const meth = 'adapter-getDevice';
|
510
|
+
const origin = `${this.id}-${meth}`;
|
511
|
+
log.trace(origin);
|
512
|
+
|
513
|
+
// make sure we are set up for device broker getDevice
|
514
|
+
if (!this.props.devicebroker || !this.props.devicebroker.getDevice || !this.props.devicebroker.getDevice.path) {
|
515
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getDevice.path'], null, null, null);
|
516
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
517
|
+
return callback(null, errorObj);
|
518
|
+
}
|
519
|
+
|
520
|
+
/* HERE IS WHERE YOU VALIDATE DATA */
|
521
|
+
if (deviceName === undefined || deviceName === null || deviceName === '' || deviceName.length === 0) {
|
522
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['deviceName'], null, null, null);
|
523
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
524
|
+
return callback(null, errorObj);
|
525
|
+
}
|
526
|
+
|
527
|
+
try {
|
528
|
+
// need to get the device so we can convert the deviceName to an id
|
529
|
+
// !! if we can do a lookup by name the getDevicesFiltered may not be necessary
|
530
|
+
const opts = {
|
531
|
+
filter: {
|
532
|
+
name: deviceName
|
533
|
+
}
|
534
|
+
};
|
535
|
+
return this.getDevicesFiltered(opts, (devs, ferr) => {
|
536
|
+
// if we received an error or their is no response on the results return an error
|
537
|
+
if (ferr) {
|
538
|
+
return callback(null, ferr);
|
539
|
+
}
|
540
|
+
if (devs.list.length < 1) {
|
541
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, `Did Not Find Device ${deviceName}`, [], null, null, null);
|
542
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
543
|
+
return callback(null, errorObj);
|
544
|
+
}
|
545
|
+
// get the uuid from the device
|
546
|
+
const { uuid } = devs.list[0];
|
547
|
+
|
548
|
+
// !! using Generic makes it easier on the Adapter Builder (just need to change the path)
|
549
|
+
// !! you can also replace with a specific call if that is easier
|
550
|
+
let uriPath = '';
|
551
|
+
let uriMethod = 'GET';
|
552
|
+
let callQuery = {};
|
553
|
+
let callBody = {};
|
554
|
+
let callHeaders = {};
|
555
|
+
let nameField = 'name';
|
556
|
+
let nameArray = ['name'];
|
557
|
+
let ostypeField = 'ostype';
|
558
|
+
let ostypeArray = ['ostype'];
|
559
|
+
let ostypePrefix = '';
|
560
|
+
let portField = 'port';
|
561
|
+
let portArray = ['port'];
|
562
|
+
let ipField = 'ipaddress';
|
563
|
+
let ipArray = ['ipaddress'];
|
564
|
+
if (this.props.devicebroker.getDevice.path) {
|
565
|
+
uriPath = `${this.props.devicebroker.getDevice.path}`;
|
566
|
+
uriPath = uriPath.replace('{deviceid}', uuid);
|
567
|
+
}
|
568
|
+
if (this.props.devicebroker.getDevice.method) {
|
569
|
+
uriMethod = this.props.devicebroker.getDevice.method;
|
570
|
+
}
|
571
|
+
if (this.props.devicebroker.getDevice.query) {
|
572
|
+
try {
|
573
|
+
callQuery = JSON.parse(this.props.devicebroker.getDevice.query);
|
574
|
+
} catch (e) {
|
575
|
+
log.warn('Could not parse query parameter for getDevice call');
|
576
|
+
}
|
577
|
+
}
|
578
|
+
if (this.props.devicebroker.getDevice.body) {
|
579
|
+
try {
|
580
|
+
callBody = this.props.devicebroker.getDevice.body;
|
581
|
+
} catch (e) {
|
582
|
+
log.warn('Could not parse body for getDevice call');
|
583
|
+
}
|
584
|
+
}
|
585
|
+
if (this.props.devicebroker.getDevice.headers) {
|
586
|
+
try {
|
587
|
+
callHeaders = this.props.devicebroker.getDevice.headers;
|
588
|
+
} catch (e) {
|
589
|
+
log.warn('Could not parse headers for getDevice call');
|
590
|
+
}
|
591
|
+
}
|
592
|
+
if (this.props.devicebroker.getDevice.name_field) {
|
593
|
+
nameField = this.props.devicebroker.getDevice.name_field;
|
594
|
+
nameArray = nameField.split('.');
|
595
|
+
}
|
596
|
+
if (this.props.devicebroker.getDevice.ostype_field) {
|
597
|
+
ostypeField = this.props.devicebroker.getDevice.ostype_field;
|
598
|
+
ostypeArray = ostypeField.split('.');
|
599
|
+
}
|
600
|
+
if (this.props.devicebroker.getDevice.ostype_prefix) {
|
601
|
+
ostypePrefix = this.props.devicebroker.getDevice.ostype_prefix;
|
602
|
+
}
|
603
|
+
if (this.props.devicebroker.getDevice.port_field) {
|
604
|
+
portField = this.props.devicebroker.getDevice.port_field;
|
605
|
+
portArray = portField.split('.');
|
606
|
+
}
|
607
|
+
if (this.props.devicebroker.getDevice.ip_field) {
|
608
|
+
ipField = this.props.devicebroker.getDevice.ip_field;
|
609
|
+
ipArray = ipField.split('.');
|
610
|
+
}
|
611
|
+
|
612
|
+
return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
|
613
|
+
// if we received an error or their is no response on the results return an error
|
614
|
+
if (error) {
|
615
|
+
return callback(null, error);
|
616
|
+
}
|
617
|
+
if (!result.response) {
|
618
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevice'], null, null, null);
|
619
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
620
|
+
return callback(null, errorObj);
|
621
|
+
}
|
622
|
+
|
623
|
+
// return the response
|
624
|
+
// !! format the data we send back
|
625
|
+
// !! these fields are config manager fields you need to map to the data we receive
|
626
|
+
const thisDevice = result.response;
|
627
|
+
let thisName = thisDevice;
|
628
|
+
for (let i = 0; i < nameArray.length; i += 1) {
|
629
|
+
if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
|
630
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
631
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
632
|
+
return callback(null, errorObj);
|
633
|
+
}
|
634
|
+
thisName = thisName[nameArray[i]];
|
635
|
+
}
|
636
|
+
thisDevice.name = thisName;
|
637
|
+
let thisOstype = thisDevice;
|
638
|
+
for (let i = 0; i < ostypeArray.length; i += 1) {
|
639
|
+
if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
|
640
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
641
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
642
|
+
return callback(null, errorObj);
|
643
|
+
}
|
644
|
+
thisOstype = thisOstype[ostypeArray[i]];
|
645
|
+
}
|
646
|
+
thisDevice.ostype = ostypePrefix + thisOstype;
|
647
|
+
let thisPort = thisDevice;
|
648
|
+
for (let i = 0; i < portArray.length; i += 1) {
|
649
|
+
if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
|
650
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
651
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
652
|
+
return callback(null, errorObj);
|
653
|
+
}
|
654
|
+
thisPort = thisPort[portArray[i]];
|
655
|
+
}
|
656
|
+
thisDevice.port = thisPort;
|
657
|
+
let thisIp = thisDevice;
|
658
|
+
for (let i = 0; i < ipArray.length; i += 1) {
|
659
|
+
if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
|
660
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
661
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
662
|
+
return callback(null, errorObj);
|
663
|
+
}
|
664
|
+
thisIp = thisIp[ipArray[i]];
|
665
|
+
}
|
666
|
+
thisDevice.ipaddress = thisIp;
|
667
|
+
return callback(thisDevice);
|
668
|
+
});
|
669
|
+
});
|
670
|
+
} catch (ex) {
|
671
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
|
672
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
673
|
+
return callback(null, errorObj);
|
674
|
+
}
|
675
|
+
}
|
676
|
+
|
677
|
+
/**
|
678
|
+
* @summary Get Appliances that match the filter
|
679
|
+
*
|
680
|
+
* @function getDevicesFiltered
|
681
|
+
* @param {Object} options - the data to use to filter the appliances (optional)
|
682
|
+
*
|
683
|
+
* @param {getCallback} callback - a callback function to return the result
|
684
|
+
* (appliances) or the error
|
685
|
+
*/
|
686
|
+
getDevicesFiltered(options, callback) {
|
687
|
+
const meth = 'adapter-getDevicesFiltered';
|
688
|
+
const origin = `${this.id}-${meth}`;
|
689
|
+
log.trace(origin);
|
690
|
+
|
691
|
+
// make sure we are set up for device broker getDevicesFiltered
|
692
|
+
if (!this.props.devicebroker || !this.props.devicebroker.getDevicesFiltered || !this.props.devicebroker.getDevicesFiltered.path) {
|
693
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getDevicesFiltered.path'], null, null, null);
|
694
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
695
|
+
return callback(null, errorObj);
|
696
|
+
}
|
697
|
+
|
698
|
+
// verify the required fields have been provided
|
699
|
+
if (options === undefined || options === null || options === '' || options.length === 0) {
|
700
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['options'], null, null, null);
|
701
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
702
|
+
return callback(null, errorObj);
|
703
|
+
}
|
704
|
+
log.debug(`Device Filter Options: ${JSON.stringify(options)}`);
|
705
|
+
|
706
|
+
// TODO - get pagination working
|
707
|
+
// const nextToken = options.start;
|
708
|
+
// const maxResults = options.limit;
|
709
|
+
|
710
|
+
// set up the filter of Device Names
|
711
|
+
let filterName = [];
|
712
|
+
if (options && options.filter && options.filter.name) {
|
713
|
+
// when this hack is removed, remove the lint ignore above
|
714
|
+
if (Array.isArray(options.filter.name)) {
|
715
|
+
// eslint-disable-next-line prefer-destructuring
|
716
|
+
filterName = options.filter.name;
|
717
|
+
} else {
|
718
|
+
filterName = [options.filter.name];
|
719
|
+
}
|
720
|
+
}
|
721
|
+
|
722
|
+
// TODO - get sort and order working
|
723
|
+
/*
|
724
|
+
if (options && options.sort) {
|
725
|
+
reqObj.uriOptions.sort = JSON.stringify(options.sort);
|
726
|
+
}
|
727
|
+
if (options && options.order) {
|
728
|
+
reqObj.uriOptions.order = options.order;
|
729
|
+
}
|
730
|
+
*/
|
731
|
+
try {
|
732
|
+
// !! using Generic makes it easier on the Adapter Builder (just need to change the path)
|
733
|
+
// !! you can also replace with a specific call if that is easier
|
734
|
+
let uriPath = '';
|
735
|
+
let uriMethod = 'GET';
|
736
|
+
let callQuery = {};
|
737
|
+
let callBody = {};
|
738
|
+
let callHeaders = {};
|
739
|
+
let nameField = 'name';
|
740
|
+
let nameArray = ['name'];
|
741
|
+
let ostypeField = 'ostype';
|
742
|
+
let ostypeArray = ['ostype'];
|
743
|
+
let ostypePrefix = '';
|
744
|
+
let portField = 'port';
|
745
|
+
let portArray = ['port'];
|
746
|
+
let ipField = 'ipaddress';
|
747
|
+
let ipArray = ['ipaddress'];
|
748
|
+
if (this.props.devicebroker.getDevicesFiltered.path) {
|
749
|
+
uriPath = this.props.devicebroker.getDevicesFiltered.path;
|
750
|
+
}
|
751
|
+
if (this.props.devicebroker.getDevicesFiltered.method) {
|
752
|
+
uriMethod = this.props.devicebroker.getDevicesFiltered.method;
|
753
|
+
}
|
754
|
+
if (this.props.devicebroker.getDevicesFiltered.query) {
|
755
|
+
try {
|
756
|
+
callQuery = this.props.devicebroker.getDevicesFiltered.query;
|
757
|
+
} catch (e) {
|
758
|
+
log.warn('Could not parse query parameter for getDevicesFiltered call');
|
759
|
+
}
|
760
|
+
}
|
761
|
+
if (this.props.devicebroker.getDevicesFiltered.body) {
|
762
|
+
try {
|
763
|
+
callBody = this.props.devicebroker.getDevicesFiltered.body;
|
764
|
+
} catch (e) {
|
765
|
+
log.warn('Could not parse body for getDevicesFiltered call');
|
766
|
+
}
|
767
|
+
}
|
768
|
+
if (this.props.devicebroker.getDevicesFiltered.headers) {
|
769
|
+
try {
|
770
|
+
callHeaders = this.props.devicebroker.getDevicesFiltered.headers;
|
771
|
+
} catch (e) {
|
772
|
+
log.warn('Could not parse headers for getDevicesFiltered call');
|
773
|
+
}
|
774
|
+
}
|
775
|
+
if (this.props.devicebroker.getDevicesFiltered.name_field) {
|
776
|
+
nameField = this.props.devicebroker.getDevicesFiltered.name_field;
|
777
|
+
nameArray = nameField.split('.');
|
778
|
+
}
|
779
|
+
if (this.props.devicebroker.getDevicesFiltered.ostype_field) {
|
780
|
+
ostypeField = this.props.devicebroker.getDevicesFiltered.ostype_field;
|
781
|
+
ostypeArray = ostypeField.split('.');
|
782
|
+
}
|
783
|
+
if (this.props.devicebroker.getDevicesFiltered.ostype_prefix) {
|
784
|
+
ostypePrefix = this.props.devicebroker.getDevicesFiltered.ostype_prefix;
|
785
|
+
}
|
786
|
+
if (this.props.devicebroker.getDevicesFiltered.port_field) {
|
787
|
+
portField = this.props.devicebroker.getDevicesFiltered.port_field;
|
788
|
+
portArray = portField.split('.');
|
789
|
+
}
|
790
|
+
if (this.props.devicebroker.getDevicesFiltered.ip_field) {
|
791
|
+
ipField = this.props.devicebroker.getDevicesFiltered.ip_field;
|
792
|
+
ipArray = ipField.split('.');
|
793
|
+
}
|
794
|
+
|
795
|
+
return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
|
796
|
+
// if we received an error or their is no response on the results return an error
|
797
|
+
if (error) {
|
798
|
+
return callback(null, error);
|
799
|
+
}
|
800
|
+
if (!result.response) {
|
801
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
802
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
803
|
+
return callback(null, errorObj);
|
804
|
+
}
|
805
|
+
|
806
|
+
// !! go through the response - may have to look for sub object
|
807
|
+
// handle an array of devices
|
808
|
+
if (Array.isArray(result.response)) {
|
809
|
+
const myDevices = [];
|
810
|
+
|
811
|
+
for (let d = 0; d < result.response.length; d += 1) {
|
812
|
+
// !! format the data we send back
|
813
|
+
// !! these fields are config manager fields you need to map to the data we receive
|
814
|
+
const thisDevice = result.response;
|
815
|
+
let thisName = thisDevice;
|
816
|
+
for (let i = 0; i < nameArray.length; i += 1) {
|
817
|
+
if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
|
818
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
819
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
820
|
+
return callback(null, errorObj);
|
821
|
+
}
|
822
|
+
thisName = thisName[nameArray[i]];
|
823
|
+
}
|
824
|
+
thisDevice.name = thisName;
|
825
|
+
let thisOstype = thisDevice;
|
826
|
+
for (let i = 0; i < ostypeArray.length; i += 1) {
|
827
|
+
if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
|
828
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
829
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
830
|
+
return callback(null, errorObj);
|
831
|
+
}
|
832
|
+
thisOstype = thisOstype[ostypeArray[i]];
|
833
|
+
}
|
834
|
+
thisDevice.ostype = ostypePrefix + thisOstype;
|
835
|
+
let thisPort = thisDevice;
|
836
|
+
for (let i = 0; i < portArray.length; i += 1) {
|
837
|
+
if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
|
838
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
839
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
840
|
+
return callback(null, errorObj);
|
841
|
+
}
|
842
|
+
thisPort = thisPort[portArray[i]];
|
843
|
+
}
|
844
|
+
thisDevice.port = thisPort;
|
845
|
+
let thisIp = thisDevice;
|
846
|
+
for (let i = 0; i < ipArray.length; i += 1) {
|
847
|
+
if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
|
848
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
849
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
850
|
+
return callback(null, errorObj);
|
851
|
+
}
|
852
|
+
thisIp = thisIp[ipArray[i]];
|
853
|
+
}
|
854
|
+
thisDevice.ipaddress = thisIp;
|
855
|
+
|
856
|
+
// if there is no filter - return the device
|
857
|
+
if (filterName.length === 0) {
|
858
|
+
myDevices.push(thisDevice);
|
859
|
+
} else {
|
860
|
+
// if we have to match a filter
|
861
|
+
let found = false;
|
862
|
+
for (let f = 0; f < filterName.length; f += 1) {
|
863
|
+
if (thisDevice.name.indexOf(filterName[f]) >= 0) {
|
864
|
+
found = true;
|
865
|
+
break;
|
866
|
+
}
|
867
|
+
}
|
868
|
+
// matching device
|
869
|
+
if (found) {
|
870
|
+
myDevices.push(thisDevice);
|
871
|
+
}
|
872
|
+
}
|
873
|
+
}
|
874
|
+
log.debug(`${origin}: Found #${myDevices.length} devices.`);
|
875
|
+
log.debug(`Devices: ${JSON.stringify(myDevices)}`);
|
876
|
+
return callback({ total: myDevices.length, list: myDevices });
|
877
|
+
}
|
878
|
+
// handle a single device response
|
879
|
+
// !! format the data we send back
|
880
|
+
// !! these fields are config manager fields you need to map to the data we receive
|
881
|
+
const thisDevice = result.response;
|
882
|
+
let thisName = thisDevice;
|
883
|
+
for (let i = 0; i < nameArray.length; i += 1) {
|
884
|
+
if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
|
885
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
886
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
887
|
+
return callback(null, errorObj);
|
888
|
+
}
|
889
|
+
thisName = thisName[nameArray[i]];
|
890
|
+
}
|
891
|
+
thisDevice.name = thisName;
|
892
|
+
let thisOstype = thisDevice;
|
893
|
+
for (let i = 0; i < ostypeArray.length; i += 1) {
|
894
|
+
if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
|
895
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
896
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
897
|
+
return callback(null, errorObj);
|
898
|
+
}
|
899
|
+
thisOstype = thisOstype[ostypeArray[i]];
|
900
|
+
}
|
901
|
+
thisDevice.ostype = ostypePrefix + thisOstype;
|
902
|
+
let thisPort = thisDevice;
|
903
|
+
for (let i = 0; i < portArray.length; i += 1) {
|
904
|
+
if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
|
905
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
906
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
907
|
+
return callback(null, errorObj);
|
908
|
+
}
|
909
|
+
thisPort = thisPort[portArray[i]];
|
910
|
+
}
|
911
|
+
thisDevice.port = thisPort;
|
912
|
+
let thisIp = thisDevice;
|
913
|
+
for (let i = 0; i < ipArray.length; i += 1) {
|
914
|
+
if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
|
915
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
|
916
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
917
|
+
return callback(null, errorObj);
|
918
|
+
}
|
919
|
+
thisIp = thisIp[ipArray[i]];
|
920
|
+
}
|
921
|
+
thisDevice.ipaddress = thisIp;
|
922
|
+
|
923
|
+
// if there is no filter - return the device
|
924
|
+
if (filterName.length === 0) {
|
925
|
+
log.debug(`${origin}: Found #1 device.`);
|
926
|
+
log.debug(`Device: ${JSON.stringify(thisDevice)}`);
|
927
|
+
return callback({ total: 1, list: [thisDevice] });
|
928
|
+
}
|
929
|
+
|
930
|
+
// if there is a filter need to check for matching device
|
931
|
+
let found = false;
|
932
|
+
for (let f = 0; f < filterName.length; f += 1) {
|
933
|
+
if (thisDevice.name.indexOf(filterName[f]) >= 0) {
|
934
|
+
found = true;
|
935
|
+
break;
|
936
|
+
}
|
937
|
+
}
|
938
|
+
// matching device
|
939
|
+
if (found) {
|
940
|
+
log.debug(`${origin}: Found #1 device.`);
|
941
|
+
log.debug(`Device Found: ${JSON.stringify(thisDevice)}`);
|
942
|
+
return callback({ total: 1, list: [thisDevice] });
|
943
|
+
}
|
944
|
+
// not a matching device
|
945
|
+
log.debug(`${origin}: No matching device found.`);
|
946
|
+
return callback({ total: 0, list: [] });
|
947
|
+
});
|
948
|
+
} catch (ex) {
|
949
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
|
950
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
951
|
+
return callback(null, errorObj);
|
952
|
+
}
|
953
|
+
}
|
954
|
+
|
955
|
+
/**
|
956
|
+
* @summary Gets the status for the provided appliance
|
957
|
+
*
|
958
|
+
* @function isAlive
|
959
|
+
* @param {String} deviceName - the deviceName of the appliance. (required)
|
960
|
+
*
|
961
|
+
* @param {configCallback} callback - callback function to return the result
|
962
|
+
* (appliance isAlive) or the error
|
963
|
+
*/
|
964
|
+
isAlive(deviceName, callback) {
|
965
|
+
const meth = 'adapter-isAlive';
|
966
|
+
const origin = `${this.id}-${meth}`;
|
967
|
+
log.trace(origin);
|
968
|
+
|
969
|
+
// make sure we are set up for device broker isAlive
|
970
|
+
if (!this.props.devicebroker || !this.props.devicebroker.isAlive || !this.props.devicebroker.isAlive.path) {
|
971
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.isAlive.path'], null, null, null);
|
972
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
973
|
+
return callback(null, errorObj);
|
974
|
+
}
|
975
|
+
|
976
|
+
// verify the required fields have been provided
|
977
|
+
if (deviceName === undefined || deviceName === null || deviceName === '' || deviceName.length === 0) {
|
978
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['deviceName'], null, null, null);
|
979
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
980
|
+
return callback(null, errorObj);
|
981
|
+
}
|
982
|
+
|
983
|
+
try {
|
984
|
+
// need to get the device so we can convert the deviceName to an id
|
985
|
+
// !! if we can do a lookup by name the getDevicesFiltered may not be necessary
|
986
|
+
const opts = {
|
987
|
+
filter: {
|
988
|
+
name: deviceName
|
989
|
+
}
|
990
|
+
};
|
991
|
+
return this.getDevicesFiltered(opts, (devs, ferr) => {
|
992
|
+
// if we received an error or their is no response on the results return an error
|
993
|
+
if (ferr) {
|
994
|
+
return callback(null, ferr);
|
995
|
+
}
|
996
|
+
if (devs.list.length < 1) {
|
997
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, `Did Not Find Device ${deviceName}`, [], null, null, null);
|
998
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
999
|
+
return callback(null, errorObj);
|
1000
|
+
}
|
1001
|
+
// get the uuid from the device
|
1002
|
+
const { uuid } = devs.list[0];
|
1003
|
+
|
1004
|
+
// !! using Generic makes it easier on the Adapter Builder (just need to change the path)
|
1005
|
+
// !! you can also replace with a specific call if that is easier
|
1006
|
+
let uriPath = '';
|
1007
|
+
let uriMethod = 'GET';
|
1008
|
+
let callQuery = {};
|
1009
|
+
let callBody = {};
|
1010
|
+
let callHeaders = {};
|
1011
|
+
let statusField = 'status';
|
1012
|
+
let statusArray = ['status'];
|
1013
|
+
let statusValue = 'true';
|
1014
|
+
if (this.props.devicebroker.isAlive.path) {
|
1015
|
+
uriPath = `${this.props.devicebroker.isAlive.path}`;
|
1016
|
+
uriPath = uriPath.replace('{deviceid}', uuid);
|
1017
|
+
}
|
1018
|
+
if (this.props.devicebroker.isAlive.method) {
|
1019
|
+
uriMethod = this.props.devicebroker.isAlive.method;
|
1020
|
+
}
|
1021
|
+
if (this.props.devicebroker.isAlive.query) {
|
1022
|
+
try {
|
1023
|
+
callQuery = this.props.devicebroker.isAlive.query;
|
1024
|
+
} catch (e) {
|
1025
|
+
log.warn('Could not parse query parameter for isAlive call');
|
1026
|
+
}
|
1027
|
+
}
|
1028
|
+
if (this.props.devicebroker.isAlive.body) {
|
1029
|
+
try {
|
1030
|
+
callBody = this.props.devicebroker.isAlive.body;
|
1031
|
+
} catch (e) {
|
1032
|
+
log.warn('Could not parse body for isAlive call');
|
1033
|
+
}
|
1034
|
+
}
|
1035
|
+
if (this.props.devicebroker.isAlive.headers) {
|
1036
|
+
try {
|
1037
|
+
callHeaders = this.props.devicebroker.isAlive.headers;
|
1038
|
+
} catch (e) {
|
1039
|
+
log.warn('Could not parse headers for isAlive call');
|
1040
|
+
}
|
1041
|
+
}
|
1042
|
+
if (this.props.devicebroker.isAlive.response && this.props.devicebroker.isAlive.status_field) {
|
1043
|
+
statusField = this.props.devicebroker.isAlive.status_field;
|
1044
|
+
statusArray = statusField.split('.');
|
1045
|
+
}
|
1046
|
+
if (this.props.devicebroker.isAlive.response && this.props.devicebroker.isAlive.status_value) {
|
1047
|
+
statusValue = this.props.devicebroker.isAlive.response.status_value;
|
1048
|
+
}
|
1049
|
+
|
1050
|
+
return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
|
1051
|
+
// if we received an error or their is no response on the results return an error
|
1052
|
+
if (error) {
|
1053
|
+
return callback(null, error);
|
1054
|
+
}
|
1055
|
+
|
1056
|
+
// !! should update this to make sure we are checking for the appropriate object/field
|
1057
|
+
if (!result.response || !result.response.returnObj) {
|
1058
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['isAlive'], null, null, null);
|
1059
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1060
|
+
return callback(null, errorObj);
|
1061
|
+
}
|
1062
|
+
let thisObj = result.response.returnObj;
|
1063
|
+
for (let i = 0; i < statusArray.length; i += 1) {
|
1064
|
+
if (!Object.hasOwnProperty.call(thisObj, statusArray[i])) {
|
1065
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['isAlive'], null, null, null);
|
1066
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1067
|
+
return callback(null, errorObj);
|
1068
|
+
}
|
1069
|
+
thisObj = thisObj[statusArray[i]];
|
1070
|
+
}
|
1071
|
+
|
1072
|
+
// !! return the response - Update to the appropriate object/field
|
1073
|
+
let response = true;
|
1074
|
+
if (thisObj.toString() !== statusValue) {
|
1075
|
+
response = false;
|
1076
|
+
}
|
1077
|
+
return callback(response);
|
1078
|
+
});
|
1079
|
+
});
|
1080
|
+
} catch (ex) {
|
1081
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
|
1082
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1083
|
+
return callback(null, errorObj);
|
1084
|
+
}
|
1085
|
+
}
|
1086
|
+
|
1087
|
+
/**
|
1088
|
+
* @summary Gets a config for the provided Appliance
|
1089
|
+
*
|
1090
|
+
* @function getConfig
|
1091
|
+
* @param {String} deviceName - the deviceName of the appliance. (required)
|
1092
|
+
* @param {String} format - the desired format of the config. (optional)
|
1093
|
+
*
|
1094
|
+
* @param {configCallback} callback - callback function to return the result
|
1095
|
+
* (appliance config) or the error
|
1096
|
+
*/
|
1097
|
+
getConfig(deviceName, format, callback) {
|
1098
|
+
const meth = 'adapter-getConfig';
|
1099
|
+
const origin = `${this.id}-${meth}`;
|
1100
|
+
log.trace(origin);
|
1101
|
+
|
1102
|
+
// make sure we are set up for device broker getConfig
|
1103
|
+
if (!this.props.devicebroker || !this.props.devicebroker.getConfig || !this.props.devicebroker.getConfig.path) {
|
1104
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getConfig.path'], null, null, null);
|
1105
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1106
|
+
return callback(null, errorObj);
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
// verify the required fields have been provided
|
1110
|
+
if (deviceName === undefined || deviceName === null || deviceName === '' || deviceName.length === 0) {
|
1111
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['deviceName'], null, null, null);
|
1112
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1113
|
+
return callback(null, errorObj);
|
1114
|
+
}
|
1115
|
+
|
1116
|
+
try {
|
1117
|
+
// need to get the device so we can convert the deviceName to an id
|
1118
|
+
// !! if we can do a lookup by name the getDevicesFiltered may not be necessary
|
1119
|
+
const opts = {
|
1120
|
+
filter: {
|
1121
|
+
name: deviceName
|
1122
|
+
}
|
1123
|
+
};
|
1124
|
+
return this.getDevicesFiltered(opts, (devs, ferr) => {
|
1125
|
+
// if we received an error or their is no response on the results return an error
|
1126
|
+
if (ferr) {
|
1127
|
+
return callback(null, ferr);
|
1128
|
+
}
|
1129
|
+
if (devs.list.length < 1) {
|
1130
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, `Did Not Find Device ${deviceName}`, [], null, null, null);
|
1131
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1132
|
+
return callback(null, errorObj);
|
1133
|
+
}
|
1134
|
+
// get the uuid from the device
|
1135
|
+
const { uuid } = devs.list[0];
|
1136
|
+
|
1137
|
+
// !! using Generic makes it easier on the Adapter Builder (just need to change the path)
|
1138
|
+
// !! you can also replace with a specific call if that is easier
|
1139
|
+
let uriPath = '';
|
1140
|
+
let uriMethod = 'GET';
|
1141
|
+
let callQuery = {};
|
1142
|
+
let callBody = {};
|
1143
|
+
let callHeaders = {};
|
1144
|
+
if (this.props.devicebroker.getConfig.path) {
|
1145
|
+
uriPath = `${this.props.devicebroker.getConfig.path}`;
|
1146
|
+
uriPath = uriPath.replace('{deviceid}', uuid);
|
1147
|
+
}
|
1148
|
+
if (this.props.devicebroker.getConfig.method) {
|
1149
|
+
uriMethod = this.props.devicebroker.getConfig.method;
|
1150
|
+
}
|
1151
|
+
if (this.props.devicebroker.getConfig.query) {
|
1152
|
+
try {
|
1153
|
+
callQuery = this.props.devicebroker.getConfig.query;
|
1154
|
+
} catch (e) {
|
1155
|
+
log.warn('Could not parse query parameter for getConfig call');
|
1156
|
+
}
|
1157
|
+
}
|
1158
|
+
if (this.props.devicebroker.getConfig.body) {
|
1159
|
+
try {
|
1160
|
+
callBody = this.props.devicebroker.getConfig.body;
|
1161
|
+
} catch (e) {
|
1162
|
+
log.warn('Could not parse body for getConfig call');
|
1163
|
+
}
|
1164
|
+
}
|
1165
|
+
if (this.props.devicebroker.getConfig.headers) {
|
1166
|
+
try {
|
1167
|
+
callHeaders = this.props.devicebroker.getConfig.headers;
|
1168
|
+
} catch (e) {
|
1169
|
+
log.warn('Could not parse headers for getConfig call');
|
1170
|
+
}
|
1171
|
+
}
|
1172
|
+
|
1173
|
+
return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
|
1174
|
+
// if we received an error or their is no response on the results return an error
|
1175
|
+
if (error) {
|
1176
|
+
return callback(null, error);
|
1177
|
+
}
|
1178
|
+
|
1179
|
+
// return the result
|
1180
|
+
const newResponse = {
|
1181
|
+
response: JSON.stringify(result.response, null, 2)
|
1182
|
+
};
|
1183
|
+
return callback(newResponse);
|
1184
|
+
});
|
1185
|
+
});
|
1186
|
+
} catch (ex) {
|
1187
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
|
1188
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1189
|
+
return callback(null, errorObj);
|
1190
|
+
}
|
1191
|
+
}
|
1192
|
+
|
1193
|
+
/**
|
1194
|
+
* @summary Gets the device count from the system
|
1195
|
+
*
|
1196
|
+
* @function iapGetDeviceCount
|
1197
|
+
*
|
1198
|
+
* @param {getCallback} callback - callback function to return the result
|
1199
|
+
* (count) or the error
|
1200
|
+
*/
|
1201
|
+
iapGetDeviceCount(callback) {
|
1202
|
+
const meth = 'adapter-iapGetDeviceCount';
|
1203
|
+
const origin = `${this.id}-${meth}`;
|
1204
|
+
log.trace(origin);
|
1205
|
+
|
1206
|
+
// make sure we are set up for device broker getCount
|
1207
|
+
if (!this.props.devicebroker || !this.props.devicebroker.getCount || !this.props.devicebroker.getCount.path) {
|
1208
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getCount.path'], null, null, null);
|
1209
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1210
|
+
return callback(null, errorObj);
|
1211
|
+
}
|
1212
|
+
|
1213
|
+
// verify the required fields have been provided
|
1214
|
+
|
1215
|
+
try {
|
1216
|
+
// !! using Generic makes it easier on the Adapter Builder (just need to set the path or call in properties)
|
1217
|
+
// !! you can also replace with a specific call if that is easier
|
1218
|
+
let uriPath = '';
|
1219
|
+
let uriMethod = 'GET';
|
1220
|
+
let callQuery = {};
|
1221
|
+
let callBody = {};
|
1222
|
+
let callHeaders = {};
|
1223
|
+
if (this.props.devicebroker.getCount.path) {
|
1224
|
+
uriPath = this.props.devicebroker.getCount.path;
|
1225
|
+
}
|
1226
|
+
if (this.props.devicebroker.getCount.method) {
|
1227
|
+
uriMethod = this.props.devicebroker.getCount.method;
|
1228
|
+
}
|
1229
|
+
if (this.props.devicebroker.getCount.query) {
|
1230
|
+
try {
|
1231
|
+
callQuery = this.props.devicebroker.getCount.query;
|
1232
|
+
} catch (e) {
|
1233
|
+
log.warn('Could not parse query parameter for getCount call');
|
1234
|
+
}
|
1235
|
+
}
|
1236
|
+
if (this.props.devicebroker.getCount.body) {
|
1237
|
+
try {
|
1238
|
+
callBody = this.props.devicebroker.getCount.body;
|
1239
|
+
} catch (e) {
|
1240
|
+
log.warn('Could not parse body for getCount call');
|
1241
|
+
}
|
1242
|
+
}
|
1243
|
+
if (this.props.devicebroker.getCount.headers) {
|
1244
|
+
try {
|
1245
|
+
callHeaders = this.props.devicebroker.getCount.headers;
|
1246
|
+
} catch (e) {
|
1247
|
+
log.warn('Could not parse headers for getCount call');
|
1248
|
+
}
|
1249
|
+
}
|
1250
|
+
|
1251
|
+
return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
|
1252
|
+
// if we received an error or their is no response on the results return an error
|
1253
|
+
if (error) {
|
1254
|
+
return callback(null, error);
|
1255
|
+
}
|
1256
|
+
|
1257
|
+
// return the result
|
1258
|
+
return callback({ count: result.response });
|
1259
|
+
});
|
1260
|
+
} catch (ex) {
|
1261
|
+
const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
|
1262
|
+
log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
|
1263
|
+
return callback(null, errorObj);
|
1264
|
+
}
|
1265
|
+
}
|
1266
|
+
|
1267
|
+
/* GENERIC ADAPTER REQUEST - allows extension of adapter without new calls being added */
|
421
1268
|
/**
|
422
1269
|
* Makes the requested generic call
|
423
1270
|
*
|
@@ -22405,7 +23252,7 @@ class Meraki extends AdapterBaseCl {
|
|
22405
23252
|
const queryParamsAvailable = {};
|
22406
23253
|
const queryParams = {};
|
22407
23254
|
const pathVars = [organizationId, licenseId];
|
22408
|
-
const bodyVars =
|
23255
|
+
const bodyVars = body;
|
22409
23256
|
|
22410
23257
|
// loop in template. long callback arg name to avoid identifier conflicts
|
22411
23258
|
Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
|
@@ -22480,7 +23327,7 @@ class Meraki extends AdapterBaseCl {
|
|
22480
23327
|
const queryParamsAvailable = {};
|
22481
23328
|
const queryParams = {};
|
22482
23329
|
const pathVars = [organizationId];
|
22483
|
-
const bodyVars =
|
23330
|
+
const bodyVars = body;
|
22484
23331
|
|
22485
23332
|
// loop in template. long callback arg name to avoid identifier conflicts
|
22486
23333
|
Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
|
@@ -22555,7 +23402,7 @@ class Meraki extends AdapterBaseCl {
|
|
22555
23402
|
const queryParamsAvailable = {};
|
22556
23403
|
const queryParams = {};
|
22557
23404
|
const pathVars = [organizationId];
|
22558
|
-
const bodyVars =
|
23405
|
+
const bodyVars = body;
|
22559
23406
|
|
22560
23407
|
// loop in template. long callback arg name to avoid identifier conflicts
|
22561
23408
|
Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
|
@@ -22630,7 +23477,7 @@ class Meraki extends AdapterBaseCl {
|
|
22630
23477
|
const queryParamsAvailable = {};
|
22631
23478
|
const queryParams = {};
|
22632
23479
|
const pathVars = [organizationId];
|
22633
|
-
const bodyVars =
|
23480
|
+
const bodyVars = body;
|
22634
23481
|
|
22635
23482
|
// loop in template. long callback arg name to avoid identifier conflicts
|
22636
23483
|
Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
|
@@ -22705,7 +23552,7 @@ class Meraki extends AdapterBaseCl {
|
|
22705
23552
|
const queryParamsAvailable = {};
|
22706
23553
|
const queryParams = {};
|
22707
23554
|
const pathVars = [organizationId];
|
22708
|
-
const bodyVars =
|
23555
|
+
const bodyVars = body;
|
22709
23556
|
|
22710
23557
|
// loop in template. long callback arg name to avoid identifier conflicts
|
22711
23558
|
Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
|