/* global __appdir */ const fs = require('fs') const path = require('path') class ExternalBackends { /* * Returns a list of all backends which have a .js file. */ getBackends () { var files = fs.readdirSync(path.join(__appdir, 'lib', 'external-backends', 'backends')) return files } /* * Returns the credential structure / fields, defined in the backends. * * If type === switch there can be child elements in the elements attribute. * Those elements are only shown, if the switch is set to true. * [{ type: 'text', id: 1, name: '', icon: '' }, * { type: 'password', id: 2, name: '', icon: '' }, * { type: 'switch', id: 3, name: '', icon: '' , elements: [ { type: ... } ] }, * { type: 'select', id: 4, name: '', icon: '' }, ...] */ getCredentials () { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a getCredentials method' } } /* * type: * * Returns the instance of a given backend type. */ getInstance (type) { const bList = this.getBackends() const bType = type + '-backend.js' // Check if it's a valid backend type. if (bList.indexOf(bType) === -1) { console.log(bType + ' is not a valid backend type.') return null } const backend = new (require(path.join(__appdir, 'lib', 'external-backends', 'backends', bType)))() return backend } /* * Returns an empty array [] if the backends doesn't have the function implemented. * * return: ['', ...] */ getSyncTypes () { return [] } /* * Get the client from the backend and returns their informationen. * credentials: * client: Information about the client (ip, mac, uuid) * * return: */ async getClient (credentials, client) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a getClient method' } } /* * credendtials: * * Returns a list of all objects in the backend. */ async getObjects (credentials) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a getObjects method' } } /* * credendtials: * oid: * * Call the API of the backend and returns the information to the object including a list of childs. */ async getObject (credentials, oid) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a getObject method' } } /* * credendtials: * objectIds: [, , ...] * * Deletes the objecs from the backend. * * if errors occour, they should be returned in the form: * [ * { error: '', message: '', id: }, * ... * ] */ async deleteObjects (credentials, objectIds) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a deleteObject method' } } /* * credentials: * objects: [{ eid: , gid: }, ...] * EXTERNAL_ID is the id of the objects in the external backend requestet. * * return: [{ gid: , childs: [{ id: , }, ...]}, ...] */ async getDataTree (credendtials, objects) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a getDataTree method' } } /* * Checks the connection of a given backend. * * return: { success: , status: '', error: '' } */ async checkConnection (backend) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a checkConnection method' } } /* Returns an empty array [] if the backends doesn't have such a function. * * return: [{id: , title: }, ...] */ async getObjectTypes (credentials) { return [] } /* * Adds the client to the backend. * * credentials: <BACKEND_CREDENTIALS> * The client parameters are all optional. If the client has an id the object is not created but the categories of the object. * client: { * id: <CLIENT_ID>, title: <CLIENT_TITLE>, parentId: <PARENT_ID>, uuid: <CLIENT_UUID>, * network: { mac: <MAC_ADDRESS>, ip: <IP_ADDRESS> }, * location: { assembly: <Horizontal/Vertical>, insertion: <Back/Front/Front and Back>, position: <RU 1 - 46> }, * system: { model: <SYSTEM_MODEL>, manufacturer: <SYSTEM_MANUFACTURER>, serialnumber: <SYSTEM_SERIALNUMBER> }, * formfactor: { formfactor: <e.g. 19">, rackunits: <integer> } * } */ async addClient (credentials, client) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have an addClient method' } } /* * Updates the client in the backend. * * credentials: <BACKEND_CREDENTIALS> * The client parameters are all optional. * client: { * id: <CLIENT_ID>, title: <CLIENT_TITLE>, parentId: <PARENT_ID>, uuid: <CLIENT_UUID>, type: <CLIENT/SERVER> * system: { model: <SYSTEM_MODEL>, manufacturer: <SYSTEM_MANUFACTURER>, serialnumber: <SYSTEM_SERIALNUMBER> }, * cpu: { model: <CPU_MODEL>, manufacturer: <CPU_MANUFACTURER>, type: <CPU_TYPE>, frequency: <CPU_FREQUENCY>, cores: <CPU_CORES> }, * ram: [{ model: <RAM_MODEL>, manufacturer: <RAM_MANUFACTURER>, type: <RAM_TYPE>, capacity: <RAM_CAPACITY>, unit: <RAM_UNIT> }, ...], * storage: {}, * network: { mac: <MAC_ADDRESS>, ip: <IP_ADDRESS> } * } */ async updateClient (credentials, client) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have an updateClient method' } } async uploadFiles (credentials, externalId, files) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have an uploadFiles method' } } async getFileList (credentials, externalId) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have an getFileList method' } } async getFile (credentials, externalId, filename) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have an getFile method' } } async checkDomain (credentials) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a checkDomain method' } } async checkIp (credentials, ipv4) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a checkIp method' } } async setIp (credentials, ipv4, mac) { return { error: 'NOT_IMPLEMENTED_EXCEPTION', message: 'The provided backend does not have a setIp method' } } /* * Only one dhcp backend should be configures or it causes problems in the registration. */ isDhcp () { return false } } module.exports = ExternalBackends