From e1d4375f741e5c67e0304c7fda36eda41df4b4c1 Mon Sep 17 00:00:00 2001 From: Jannik Schönartz Date: Mon, 16 Jul 2018 22:22:55 +0000 Subject: [external-backends] Added API and Frontend module external-backends. --- server/api/backends.js | 75 ++++++++++++++++++++++ .../external-backends/backends/another-backend.js | 9 +++ .../external-backends/backends/dummy-backend.js | 9 +++ .../external-backends/backends/template-backend.js | 9 +++ server/lib/external-backends/external-backends.js | 30 +++++++++ server/migrations/20180715193710-create-backend.js | 25 ++++++++ server/models/backend.js | 20 ++++++ server/router.js | 13 ++++ 8 files changed, 190 insertions(+) create mode 100644 server/api/backends.js create mode 100644 server/lib/external-backends/backends/another-backend.js create mode 100644 server/lib/external-backends/backends/dummy-backend.js create mode 100644 server/lib/external-backends/backends/template-backend.js create mode 100644 server/lib/external-backends/external-backends.js create mode 100644 server/migrations/20180715193710-create-backend.js create mode 100644 server/models/backend.js (limited to 'server') diff --git a/server/api/backends.js b/server/api/backends.js new file mode 100644 index 0000000..e3e6014 --- /dev/null +++ b/server/api/backends.js @@ -0,0 +1,75 @@ +/* global __appdir */ +const path = require('path'); +const ExternalBackends = require(path.join(__appdir, 'lib', 'external-backends', 'external-backends.js')); +var db = require(path.join(__appdir, 'lib', 'sequelize')); + +module.exports = { + getCredentialsByType: function(req, res) { + const backendType = req.query.type; + const b = new ExternalBackends(); + const instance = b.getInstance(backendType); + res.status(200).send(instance.getCredentials()); + }, + + getBackendInfoById: function(req, res) { + // TODO: Test (Not used for now) needed for edit // TODO: // TODO: + const backendId = req.query.id; + db.backend.findOne({ where: { id: backendId } }).then(backend => { + const b = { + backendId: backendId, + backendName: backend.name, + backendType: backend.type, + backendCredentials: backend.credentials + } + res.status(200).send(b); + }); + }, + + getBackendTypes: function(req, res) { + + const backends = new ExternalBackends(); + var files = backends.getBackends(); + + for (var i = 0; i < files.length; i++) { + + // Cut off -backends.js + files[i] = files[i].slice(0, -11); + } + + res.status(200).send(files); + }, + + getBackendList: function(req, res) { + db.backend.findAll({ + attributes: ['id', 'name', 'type'] + }).then(function (backends) { + res.status(200).send(backends); + }); + }, + + // POST REQUESTS + saveBackend: function(req, res) { + // Save credentials in the db. + const formData = req.body; + const credentialString = JSON.stringify(formData.backendCredentials); + + if (formData.backendId == 0) { + // Insert new backend in the db. + db.backend.create({ name: formData.backendName, type: formData.backendType, credentials: credentialString }); + } else { + // Update an existing backend in the db. + db.backend.update({ name: formData.backendName, type: formData.backendType, credentials: credentialString }, {where: {id: formData.backendId} }); + } + //db.backend.findOne({}) + + res.status(200).send('success'); + }, + + deleteBackendById: function(req, res) { + const backendId = req.body.id; + + db.backend.destroy({ where: { id: backendId } }).then(function() { + res.status(200).send('success'); + }); + } +} diff --git a/server/lib/external-backends/backends/another-backend.js b/server/lib/external-backends/backends/another-backend.js new file mode 100644 index 0000000..9458e1e --- /dev/null +++ b/server/lib/external-backends/backends/another-backend.js @@ -0,0 +1,9 @@ +var ExternalBackends = require('../external-backends.js'); + +class AnotherBackend extends ExternalBackends { + getCredentials() { + return [{ type: "text", name: "text 1" }, { type: "text", name: "text 2" }, { type: "password", name: "password 1", show: false}, { type: "password", name: "password 2", show: true}, { type: "password", name: "password 3", show: false}]; + } +} + +module.exports = AnotherBackend; \ No newline at end of file diff --git a/server/lib/external-backends/backends/dummy-backend.js b/server/lib/external-backends/backends/dummy-backend.js new file mode 100644 index 0000000..205eeb1 --- /dev/null +++ b/server/lib/external-backends/backends/dummy-backend.js @@ -0,0 +1,9 @@ +var ExternalBackends = require('../external-backends.js'); + +class DummyBackend extends ExternalBackends { + getCredentials() { + return [{ type: "switch", name: "switch 1", value: false }, { type: "switch", name: "switch 2", value: false }, { type: "switch", name: "switch 3", value: true }, { type: "select", name: "selection 1", items: ["wasd", "asdf", "qwertz"] }, { type: "select", name: "selection 2", items: ["1", "2", "3"] }]; + } +} + +module.exports = DummyBackend; \ No newline at end of file diff --git a/server/lib/external-backends/backends/template-backend.js b/server/lib/external-backends/backends/template-backend.js new file mode 100644 index 0000000..3271447 --- /dev/null +++ b/server/lib/external-backends/backends/template-backend.js @@ -0,0 +1,9 @@ +var ExternalBackends = require('../external-backends.js'); + +class TemplateBackend extends ExternalBackends { + getCredentials() { + return [{ type: "text", name: "text test" }, { type: "password", name: "password test", show: true}, { type: "password", name: "password test nr2", show: false}, { type: "switch", name: "bool test", value: false }, { type: "select", name: "selection test", items: ["wasd", "asdf", "qwertz"] }]; + } +} + +module.exports = TemplateBackend; \ No newline at end of file diff --git a/server/lib/external-backends/external-backends.js b/server/lib/external-backends/external-backends.js new file mode 100644 index 0000000..5ab2adf --- /dev/null +++ b/server/lib/external-backends/external-backends.js @@ -0,0 +1,30 @@ +/* global __appdir */ +const fs = require('fs'); +const path = require('path'); + +class ExternalBackends { + getBackends() { + var files = fs.readdirSync(path.join(__appdir, 'lib', 'external-backends', 'backends')); + return files; + } + + getCredentials() { + return "If this method gets called the backend class has NOT IMPLEMENTED the getCredentials method!"; + } + + 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; + } +} + +module.exports = ExternalBackends; diff --git a/server/migrations/20180715193710-create-backend.js b/server/migrations/20180715193710-create-backend.js new file mode 100644 index 0000000..3b1a730 --- /dev/null +++ b/server/migrations/20180715193710-create-backend.js @@ -0,0 +1,25 @@ +'use strict'; +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('backends', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + type: { + type: Sequelize.STRING + }, + credentials: { + type: Sequelize.STRING(2048) + } + }); + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('backends'); + } +}; \ No newline at end of file diff --git a/server/models/backend.js b/server/models/backend.js new file mode 100644 index 0000000..b8b0313 --- /dev/null +++ b/server/models/backend.js @@ -0,0 +1,20 @@ +'use strict'; +module.exports = (sequelize, DataTypes) => { + var backend = sequelize.define('backend', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: DataTypes.INTEGER + }, + name: DataTypes.STRING, + type: DataTypes.STRING, + credentials: DataTypes.STRING(2048) + }, { + timestamps: false + }); + backend.associate = function(models) { + // associations can be defined here + }; + return backend; +}; \ No newline at end of file diff --git a/server/router.js b/server/router.js index 6ae1316..263abed 100644 --- a/server/router.js +++ b/server/router.js @@ -37,4 +37,17 @@ router.get('/shell/buildipxe', shell.buildIPXE); var nodemailer = require(path.join(__dirname, 'lib', 'nodemailer')); router.get('/mail/send', nodemailer.sendMail); +// External backends API +var backends = require(path.join(__dirname, 'api', 'backends')); +router.get('/backends/getCredentialsByType', auth.verifyToken, backends.getCredentialsByType); +router.get('/backends/getBackendInfoById', auth.verifyToken, backends.getBackendInfoById); +router.get('/backends/getBackendList', auth.verifyToken, backends.getBackendList); +router.get('/backends/getBackendTypes', backends.getBackendTypes); +router.post('/backends/saveBackend', auth.verifyToken, backends.saveBackend); +router.post('/backends/deleteBackendById', auth.verifyToken, backends.deleteBackendById) + +// Load ipxe scipts API +var ipxeloader = require(path.join(__dirname, 'api', 'ipxe-loader')); +router.get('/ipxe-loader/load-script', ipxeloader.loadScript); + module.exports = router; \ No newline at end of file -- cgit v1.2.3-55-g7522