Initial commit
This commit is contained in:
197
lib/setup/setupVendor.js
Normal file
197
lib/setup/setupVendor.js
Normal file
@@ -0,0 +1,197 @@
|
||||
'use strict';
|
||||
function Vendor(options) {
|
||||
const fs = require('fs');
|
||||
const tools = require(__dirname + '/../tools.js');
|
||||
options = options || {};
|
||||
|
||||
let objects = options.objects;
|
||||
// read info from '/etc/iob_vendor.json' and executes instructions stored there
|
||||
this.checkVendor = (file, password) => {
|
||||
file = file || '/etc/iob-vendor.json';
|
||||
let data;
|
||||
if (fs.existsSync(file)) {
|
||||
try {
|
||||
data = JSON.parse(fs.readFileSync(file).toString('utf8'));
|
||||
} catch (e) {
|
||||
return Promise.reject(`cannot read or parse "${file}": ${JSON.stringify(e)}`);
|
||||
}
|
||||
} else {
|
||||
return Promise.reject(`"${file}" does not exist`);
|
||||
}
|
||||
|
||||
let promises = [];
|
||||
if (data.uuid) {
|
||||
const uuid = data.uuid;
|
||||
data.uuid = null;
|
||||
|
||||
// check UUID
|
||||
promises.push(objects.getObjectAsync('system.meta.uuid').then(obj => {
|
||||
if (obj && obj.native) {
|
||||
if (obj.native.uuid !== uuid) {
|
||||
obj.native.uuid = uuid;
|
||||
|
||||
console.log(`Update "system.meta.uuid:native.uuid" = "${obj.native.uuid}"`);
|
||||
|
||||
obj.nonEdit = obj.nonEdit || {};
|
||||
obj.nonEdit.password = password;
|
||||
return objects.setObjectAsync('system.meta.uuid', obj).then(() => {
|
||||
console.log('object system.meta.uuid updated: ' + uuid);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update system.meta.uuid: ${err}`);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
return objects.setObjectAsync('system.meta.uuid', {
|
||||
type: 'meta',
|
||||
common: {
|
||||
name: 'uuid',
|
||||
type: 'uuid'
|
||||
},
|
||||
ts: new Date().getTime(),
|
||||
from: 'system.host.' + tools.getHostName() + '.tools',
|
||||
native: {
|
||||
uuid: uuid
|
||||
}
|
||||
}).then(() => {
|
||||
console.log('object system.meta.uuid created: ' + uuid);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot create system.meta.uuid: ${err}`);
|
||||
});
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
if (data.model) {
|
||||
const model = data.model;
|
||||
data.model = null;
|
||||
const hostname = tools.getHostName();
|
||||
promises.push(objects.getObjectAsync('system.host.' + hostname).then(obj => {
|
||||
if (obj && obj.common) {
|
||||
if ((model.name && model.name !== 'JS controller' && obj.common.title === 'JS controller') ||
|
||||
(model.icon && !obj.common.icon) ||
|
||||
(model.color && !obj.common.color)) {
|
||||
obj.common.title = model.name;
|
||||
obj.common.icon = model.icon;
|
||||
obj.common.color = model.color;
|
||||
|
||||
obj.nonEdit = obj.nonEdit || {};
|
||||
obj.nonEdit.password = password;
|
||||
|
||||
console.log(`Update "system.host.${hostname}:common.title" = "${obj.common.title}"`);
|
||||
console.log(`Update "system.host.${hostname}:common.icon" = "${!!obj.common.icon}"`);
|
||||
console.log(`Update "system.host.${hostname}:common.color" = "${obj.common.color}"`);
|
||||
|
||||
return objects.setObjectAsync(obj._id, obj).then(() => {
|
||||
console.log(`object "system.host.${hostname}" updated`);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update "system.host.${hostname}": ${err}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
if (data.vendor) {
|
||||
const vendor = JSON.parse(JSON.stringify(data.vendor));
|
||||
data._vendor = JSON.parse(JSON.stringify(vendor));
|
||||
data.vendor = null;
|
||||
|
||||
// store vendor
|
||||
promises.push(objects.getObjectAsync('system.config').then(obj => {
|
||||
if (obj && obj.native) {
|
||||
if (JSON.stringify(obj.native.vendor) !== JSON.stringify(vendor)) {
|
||||
obj.native.vendor = vendor;
|
||||
obj.nonEdit = obj.nonEdit || {};
|
||||
obj.nonEdit.password = password;
|
||||
return objects.setObjectAsync(obj._id, obj).then(() => {
|
||||
console.log('object system.config updated');
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update system.config: ${err}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
return Promise.all(promises).then(() => {
|
||||
let _promises = [];
|
||||
// update all existing objects according to vendor
|
||||
if (data.objects) {
|
||||
for (let id in data.objects) {
|
||||
if (!data.objects.hasOwnProperty(id)) continue;
|
||||
if (id.indexOf('*') === -1) {
|
||||
((_id, _obj) => {
|
||||
_promises.push(objects.getObjectAsync(_id).then(obj => {
|
||||
if (obj) {
|
||||
obj.nonEdit = obj.nonEdit || {};
|
||||
const originalObj = JSON.stringify(obj);
|
||||
_obj.nonEdit = _obj.nonEdit || {};
|
||||
_obj.nonEdit.passHash = obj.nonEdit.passHash;
|
||||
// merge objects
|
||||
tools.copyAttributes(_obj, obj);
|
||||
|
||||
if (originalObj !== JSON.stringify(obj)) {
|
||||
delete obj.nonEdit.passHash;
|
||||
obj.nonEdit.password = password;
|
||||
console.log(`Update "${obj._id}"`);
|
||||
return objects.setObjectAsync(obj._id, obj).then(() => {
|
||||
console.log(`object "${obj._id}" updated`);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update "${obj._id}": ${err}`);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
return objects.setObjectAsync(_id, _obj).then(() => {
|
||||
console.log(`object "${obj._id}" updated`);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update "${obj._id}": ${err}`);
|
||||
});
|
||||
}
|
||||
}));
|
||||
})(id, data.objects[id]);
|
||||
} else {
|
||||
id = id.replace('*', '');
|
||||
((_id, _obj) => {
|
||||
_promises.push(objects.getObjectListAsync({
|
||||
startkey: _id,
|
||||
endkey: _id + '\u9999'
|
||||
}, {checked: true}).then(arr => {
|
||||
let tasks = [];
|
||||
if (arr && arr.rows && arr.rows.length) {
|
||||
for (let g = 0; g < arr.rows.length; g++) {
|
||||
let obj = arr.rows[g].value;
|
||||
if (obj) {
|
||||
obj.nonEdit = obj.nonEdit || {};
|
||||
const originalObj = JSON.stringify(obj);
|
||||
_obj.nonEdit = _obj.nonEdit || {};
|
||||
_obj.nonEdit.passHash = obj.nonEdit.passHash;
|
||||
// merge objects
|
||||
tools.copyAttributes(_obj, obj);
|
||||
if (originalObj !== JSON.stringify(obj)) {
|
||||
delete obj.nonEdit.passHash;
|
||||
obj.nonEdit.password = password;
|
||||
console.log(`Update "${obj._id}"`);
|
||||
tasks.push(objects.setObjectAsync(obj._id, obj).then(() => {
|
||||
console.log(`object "${obj._id}" updated`);
|
||||
}).catch(err => {
|
||||
console.error(`Cannot update "${obj._id}": ${err}`);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Promise.all(tasks);
|
||||
}));
|
||||
})(id, data.objects[id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.all(_promises);
|
||||
});
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
module.exports = Vendor;
|
||||
Reference in New Issue
Block a user