From 175065246ec68835111967c4174de526a6356406 Mon Sep 17 00:00:00 2001 From: Udo Walter Date: Sun, 14 Apr 2019 01:16:47 +0000 Subject: [ipranges] new webapp module and ip for ipranges --- server/api/ipranges.js | 74 ++++++++++ server/models/iprange.js | 2 +- webapp/src/components/DataTable.vue | 6 +- webapp/src/components/IprangeModule.vue | 236 ++++++++++++++++++++++++++++++++ webapp/src/components/SelectBox.vue | 6 +- webapp/src/config/dashboard.js | 2 + webapp/src/config/i18n.js | 6 +- 7 files changed, 325 insertions(+), 7 deletions(-) create mode 100644 server/api/ipranges.js create mode 100644 webapp/src/components/IprangeModule.vue diff --git a/server/api/ipranges.js b/server/api/ipranges.js new file mode 100644 index 0000000..16ea3e5 --- /dev/null +++ b/server/api/ipranges.js @@ -0,0 +1,74 @@ +/* global __appdir */ +var path = require('path') +var db = require(path.join(__appdir, 'lib', 'sequelize')) +var wol = require('node-wol') +var express = require('express') +const { decorateApp } = require('@awaitjs/express') +var router = decorateApp(express.Router()) +const HttpResponse = require(path.join(__appdir, 'lib', 'httpresponse')) +const iphelper = require(path.join(__appdir, 'lib', 'iphelper')) + +// ############################################################################ +// ########################### GET requests ################################# + +router.getAsync('', async (req, res) => { + const ipranges = await db.iprange.findAll({ include: ['group'] }) + ipranges.forEach(iprange => { + iprange.startIp = iphelper.toIPv4(iprange.startIp) + iprange.endIp = iphelper.toIPv4(iprange.endIp) + }) + res.send(ipranges) +}) + +router.getAsync('/:id', async (req, res) => { + if (!(req.params.id > 0)) return HttpResponse.invalidId().send(res) + const iprange = await db.iprange.findOne({ where: { id: req.params.id }, include: ['group'] }) + if (iprange) { + iprange.startIp = iphelper.toIPv4(iprange.startIp) + iprange.endIp = iphelper.toIPv4(iprange.endIp) + res.status(200).send(iprange) + } + else HttpResponse.notFound(req.params.id).send(res) +}) + +// ############################################################################ +// ########################## POST requests ################################# + +router.postAsync(['', '/:id'], async (req, res) => { + if (req.query.delete !== undefined && req.query.delete !== 'false') { + if (!Array.isArray(req.body.ids)) return HttpResponse.invalidBodyValue('ids', 'an array').send(res) + const count = await db.iprange.destroy({ where: { id: req.body.ids } }) + return HttpResponse.successBatch('deleted', 'client', count).send(res) + } + let iprange + let action = 'updated' + req.body.startIp = iphelper.toDecimal(req.body.startIp) + req.body.endIp = iphelper.toDecimal(req.body.endIp) + if (req.params.id === undefined) { + iprange = await db.iprange.create(req.body) + action = 'created' + } else if (req.params.id > 0) { + iprange = await db.iprange.findOne({ where: { id: req.params.id } }) + if (!iprange) return HttpResponse.notFound(req.params.id).send(res) + else await iprange.update(req.body) + } else { + return HttpResponse.invalidId().send(res) + } + HttpResponse.success(action, 'iprange', iprange.id).send(res) +}) + +// ############################################################################ +// ########################## DELETE requests ############################### + +router.delete('/:id', async (req, res) => { + if (!(req.params.id > 0)) return HttpResponse.invalidId().send(res) + const count = await db.iprange.destroy({ where: { id: req.params.id } }) + if (count) HttpResponse.success('deleted', 'iprange', req.params.id).send(res) + else HttpResponse.notFound(req.params.id).send(res) +}) + + +// ############################################################################ +// ############################################################################ + +module.exports.router = router diff --git a/server/models/iprange.js b/server/models/iprange.js index decb63a..146a745 100644 --- a/server/models/iprange.js +++ b/server/models/iprange.js @@ -13,7 +13,7 @@ module.exports = (sequelize, DataTypes) => { timestamps: false }) iprange.associate = function (models) { - iprange.belongsTo(models.group) + iprange.belongsTo(models.group, { as: 'group' }) } return iprange } diff --git a/webapp/src/components/DataTable.vue b/webapp/src/components/DataTable.vue index b3da534..36b44f3 100644 --- a/webapp/src/components/DataTable.vue +++ b/webapp/src/components/DataTable.vue @@ -176,7 +176,6 @@ v-model="copyDialog" scrollable :max-width="300" - :fullscreen="$vuetify.breakpoint.smAndDown" lazy > @@ -456,14 +455,15 @@ export default { }, copyToClipboard () { let result = '' - const keys = this.headersWithText.filter(h => h.includeInCopy).map(x => x.key) + const keys = this.headersWithText.filter(h => h.includeInCopy).map(x => x.copyKey || x.key) if (this.copyFormat === 0) { const topIndex = keys.length - 1 this.filteredRows.forEach(row => { let rowString = '' for (let i in keys) { let value = row.data[keys[i]] - if (typeof value === 'string' && value.indexOf(',') !== -1) value = '"' + value + '"' + if (typeof value === 'string' && (value.indexOf(',') !== -1 || value.indexOf('"') !== -1)) value = JSON.stringify(value) + else if (typeof value === 'object') value = JSON.stringify(JSON.stringify(value)) if (value) rowString += value if (i < topIndex) rowString += ',' } diff --git a/webapp/src/components/IprangeModule.vue b/webapp/src/components/IprangeModule.vue new file mode 100644 index 0000000..5c37f60 --- /dev/null +++ b/webapp/src/components/IprangeModule.vue @@ -0,0 +1,236 @@ + +{ + "en": { + "ipranges": "IP Ranges", + "deleteIpranges": "Delete one iprange | Delete {0} ipranges", + "createIprange": "Create IP range", + "id": "ID", + "startIp": "Start IP", + "endIp": "End IP", + "group": "Group", + "deleteTitle": "Delete this IP range? | Delete these {0} IP ranges?", + "createTitle": "Create IP Range", + "editTitle": "Edit IP Range", + "required": "Required.", + "invalidIp": "Invalid IP Address.", + "deleteSuccess": "Successfully deleted IP ranges.", + "updateSuccess": "Successfully updated IP range.", + "createSuccess": "Successfully created IP range." + }, + "de": { + "ipranges": "IP Bereiche", + "deleteIpranges": "Einen IP Bereich löschen | {0} IP Bereiche löschen", + "createIprange": "IP Bereich erstellen", + "id": "ID", + "startIp": "Start IP", + "endIp": "End IP", + "group": "Gruppe", + "deleteTitle": "Diesen IP Bereich löschen? | Diese {0} IP Bereiche löschen?", + "createTitle": "IP Bereich erstellen", + "editTitle": "IP Bereich bearbeiten", + "required": "Benötigt.", + "invalidIp": "Ungültige IP Adresse.", + "deleteSuccess": "IP Bereiche erfolgreich gelöscht.", + "updateSuccess": "IP Bereich erfolgreich aktualisiert.", + "createSuccess": "IP Bereich erfolgreich erstellen." + } +} + + + + + + + + diff --git a/webapp/src/components/SelectBox.vue b/webapp/src/components/SelectBox.vue index 900b604..d01429e 100644 --- a/webapp/src/components/SelectBox.vue +++ b/webapp/src/components/SelectBox.vue @@ -12,7 +12,7 @@