Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DRAFT] Network rules edit #76

Draft
wants to merge 10 commits into
base: master
Choose a base branch
from
44 changes: 26 additions & 18 deletions src/bin/www
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const debug = require('debug')('ztncui:server');
const http = require('http');
const https = require('https');
const fs = require('fs');
const storage = require('../controllers/storage');

/**
* Get ports from environment and store in Express.
Expand Down Expand Up @@ -36,33 +37,40 @@ app.set('https_host', https_host);
* HTTPS_HOST HTTPS HTTPS_HOST HTTPS_PORT
*/

const http_all_interfaces = process.env.HTTP_ALL_INTERFACES || null;
if (http_all_interfaces) {
console.log('Listening for HTTP requests on port ' + http_port + ' on all interfaces');
app.listen(http_port);
} else {
console.log('Listening for HTTP requests on port ' + http_port + ' on localhost');
app.listen(http_port, 'localhost');
}

const options = !https_port ? {} : {
cert: fs.readFileSync('etc/tls/fullchain.pem'),
key: fs.readFileSync('etc/tls/privkey.pem')
};

const server = https.createServer(options, app);
const https_server = https.createServer(options, app);

if (https_port) {
if (https_host) {
console.log('Listening for HTTPS requests on port ' + https_port + ' on address ' + https_host);
async function start() {
await storage.init();

const http_all_interfaces = process.env.HTTP_ALL_INTERFACES || null;
if (http_all_interfaces) {
console.log('Listening for HTTP requests on port ' + http_port + ' on all interfaces');
app.listen(http_port);
} else {
console.log('Listening for HTTPS requests on port ' + https_port + ' on all interfaces');
console.log('Listening for HTTP requests on port ' + http_port + ' on localhost');
app.listen(http_port, 'localhost');
}
server.listen(https_port, https_host);

if (https_port) {
if (https_host) {
console.log('Listening for HTTPS requests on port ' + https_port + ' on address ' + https_host);
} else {
console.log('Listening for HTTPS requests on port ' + https_port + ' on all interfaces');
}
https_server.listen(https_port, https_host);
}

https_server.on('error', onError);
https_server.on('listening', onListening);
}

server.on('error', onError);
server.on('listening', onListening);
start();


/**
* Normalize a port into a number, string, or false.
Expand Down Expand Up @@ -121,7 +129,7 @@ function onError(error) {
*/

function onListening() {
const addr = server.address();
const addr = https_server.address();
const bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
Expand Down
86 changes: 43 additions & 43 deletions src/controllers/networkController.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@

const fs = require('fs');
const ipaddr = require('ip-address');
const storage = require('node-persist');
const storage = require('./storage');
const zt = require('./zt');
const util = require('util');

storage.initSync({dir: 'etc/storage'});

async function get_network_with_members(nwid) {
const [network, peers, members] = await Promise.all([
Expand All @@ -22,11 +21,11 @@ async function get_network_with_members(nwid) {
Object.keys(member_ids)
.map(id => Promise.all([
zt.member_detail(nwid, id),
storage.getItem(id)
storage.get_member(id)
]))
)
).then(results => results.map(([member, name]) => {
member.name = name || '';
).then(results => results.map(([member, {name}]) => {
member.name = name;
return member;
}))
]);
Expand All @@ -37,13 +36,13 @@ async function get_network_with_members(nwid) {
}

async function get_network_member(nwid, memberid) {
const [network, member, peer, name] = await Promise.all([
const [network, member, peer, {name}] = await Promise.all([
zt.network_detail(nwid),
zt.member_detail(nwid, memberid),
zt.peer(memberid),
storage.getItem(memberid)
storage.get_member(memberid)
]);
member.name = name || '';
member.name = name;
member.peer = peer;
return {network, member};
}
Expand Down Expand Up @@ -184,7 +183,7 @@ exports.network_object = async function(req, res) {
try {
const network = await zt.network_detail(req.params.nwid);
navigate.whence = '/controller/network/' + network.nwid;
res.render(req.params.object, {title: req.params.object, navigate: navigate, network: network}, function(err, html) {
res.render('network_prop_' + req.params.object, {title: req.params.object, navigate: navigate, network: network}, function(err, html) {
if (err) {
if (err.message.indexOf('Failed to lookup view') !== -1 ) {
return res.render('not_implemented', {title: req.params.object, navigate: navigate, network: network});
Expand All @@ -194,7 +193,7 @@ exports.network_object = async function(req, res) {
res.send(html);
});
} catch (err) {
res.render(req.params.object, {title: req.params.object, navigate: navigate, error: 'Error resolving detail for network ' + req.params.nwid + ': ' + err});
res.render('error', {title: req.params.object, navigate: navigate, error: 'Error resolving detail for network ' + req.params.nwid + ': ' + err});
}
}

Expand Down Expand Up @@ -255,17 +254,17 @@ exports.ipAssignmentPools = async function(req, res) {
try {
const network = await zt.network_detail(req.params.nwid);
navigate.whence = '/controller/network/' + network.nwid;
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network, errors: errors});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network, errors: errors});
} catch (err) {
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error resolving network detail for network ' + req.params.nwid + ': ' + err});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error resolving network detail for network ' + req.params.nwid + ': ' + err});
}
} else {
try {
const network = await zt.ipAssignmentPools(req.params.nwid, ipAssignmentPool, 'add');
navigate.whence = '/controller/network/' + network.nwid;
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network});
} catch (err) {
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error applying IP Assignment Pools for network ' + req.params.nwid + ': ' + err});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error applying IP Assignment Pools for network ' + req.params.nwid + ': ' + err});
}
}
}
Expand Down Expand Up @@ -322,17 +321,17 @@ exports.routes = async function (req, res) {
try {
const network = await zt.network_detail(req.params.nwid);
navigate.whence = '/controller/network/' + network.nwid;
res.render('routes', {title: 'routes', navigate: navigate, route: route, network: network, errors: errors});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, route: route, network: network, errors: errors});
} catch (err) {
res.render('routes', {title: 'routes', navigate: navigate, error: 'Error resolving network detail'});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, error: 'Error resolving network detail'});
}
} else {
try {
const network = await zt.routes(req.params.nwid, route, 'add');
navigate.whence = '/controller/network/' + network.nwid;
res.render('routes', {title: 'routes', navigate: navigate, route: route, network: network});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, route: route, network: network});
} catch (err) {
res.render('routes', {title: 'routes', navigate: navigate, error: 'Error adding route for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, error: 'Error adding route for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -356,9 +355,9 @@ exports.route_delete = async function (req, res) {
try {
const network = await zt.routes(req.params.nwid, route, 'delete');
navigate.whence = '/controller/network/' + network.nwid;
res.render('routes', {title: 'routes', navigate: navigate, route: route, network: network});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, route: route, network: network});
} catch (err) {
res.render('routes', {title: 'routes', navigate: navigate, error: 'Error deleting route for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_routes', {title: 'routes', navigate: navigate, error: 'Error deleting route for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -380,9 +379,9 @@ exports.ipAssignmentPool_delete = async function (req, res) {
try {
const network = await zt.ipAssignmentPools(req.params.nwid, ipAssignmentPool, 'delete');
navigate.whence = '/controller/network/' + network.nwid;
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, ipAssignmentPool: ipAssignmentPool, network: network});
} catch (err) {
res.render('ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error deleting IP Assignment Pool for network ' + req.params.nwid + ': ' + err});
res.render('member_prop_ipAssignmentPools', {title: 'ipAssignmentPools', navigate: navigate, error: 'Error deleting IP Assignment Pool for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -402,9 +401,9 @@ exports.private = async function (req, res) {
try {
const network = await zt.network_object(req.params.nwid, private);
navigate.whence = '/controller/network/' + network.nwid;
res.render('private', {title: 'private', navigate: navigate, network: network});
res.render('network_prop_private', {title: 'private', navigate: navigate, network: network});
} catch (err) {
res.render('private', {title: 'private', navigate: navigate, error: 'Error applying private for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_private', {title: 'private', navigate: navigate, error: 'Error applying private for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -424,9 +423,9 @@ exports.v4AssignMode = async function (req, res) {
try {
const network = await zt.network_object(req.params.nwid, v4AssignMode);
navigate.whence = '/controller/network/' + network.nwid;
res.render('v4AssignMode', {title: 'v4AssignMode', navigate: navigate, network: network});
res.render('network_prop_v4AssignMode', {title: 'v4AssignMode', navigate: navigate, network: network});
} catch (err) {
res.render('v4AssignMode', {title: 'v4AssignMode', navigate: navigate, error: 'Error applying v4AssignMode for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_v4AssignMode', {title: 'v4AssignMode', navigate: navigate, error: 'Error applying v4AssignMode for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -451,9 +450,9 @@ exports.v6AssignMode = async function (req, res) {
try {
const network = await zt.network_object(req.params.nwid, v6AssignMode);
navigate.whence = '/controller/network/' + network.nwid;
res.render('v6AssignMode', {title: 'v6AssignMode', navigate: navigate, network: network});
res.render('network_prop_v6AssignMode', {title: 'v6AssignMode', navigate: navigate, network: network});
} catch (err) {
res.render('v6AssignMode', {title: 'v6AssignMode', navigate: navigate, error: 'Error applying v6AssignMode for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_v6AssignMode', {title: 'v6AssignMode', navigate: navigate, error: 'Error applying v6AssignMode for network ' + req.params.nwid + ': ' + err});
}
}

Expand All @@ -480,9 +479,9 @@ exports.dns = async function (req, res) {
try {
const network = await zt.network_object(req.params.nwid, dns);
navigate.whence = '/controller/network/' + network.nwid;
res.render('dns', {title: 'dns', navigate: navigate, network: network});
res.render('network_prop_dns', {title: 'dns', navigate: navigate, network: network});
} catch (err) {
res.render('dns', {title: 'dns', navigate: navigate, error: 'Error updating dns for network ' + req.params.nwid + ': ' + err});
res.render('network_prop_dns', {title: 'dns', navigate: navigate, error: 'Error updating dns for network ' + req.params.nwid + ': ' + err});
}
}

Expand Down Expand Up @@ -515,7 +514,7 @@ exports.member_object = async function(req, res) {
try {
const {network, member} = await get_network_member(req.params.nwid, req.params.id);
navigate.whence = '/controller/network/' + network.nwid + '#members';
res.render(req.params.object, {title: req.params.object, navigate: navigate, network: network, member: member}, function(err, html) {
res.render('network_prop_' + req.params.object, {title: req.params.object, navigate: navigate, network: network, member: member}, function(err, html) {
if (err) {
if (err.message.indexOf('Failed to lookup view') !== -1 ) {
return res.render('not_implemented', {title: req.params.object, navigate: navigate, network: network, member: member});
Expand All @@ -525,7 +524,7 @@ exports.member_object = async function(req, res) {
res.send(html);
});
} catch (err) {
res.render(req.params.object, {title: req.params.object, navigate: navigate, error: 'Error resolving detail for member ' + req.params.id + ' of network ' + req.params.nwid + ': ' + err});
res.render('error', {title: req.params.object, navigate: navigate, error: 'Error resolving detail for member ' + req.params.id + ' of network ' + req.params.nwid + ': ' + err});
}
}

Expand Down Expand Up @@ -677,7 +676,9 @@ exports.members = async function(req, res) {

if (!errors) {
try {
const ret = await storage.setItem(req.body.id, req.body.name);
const member = await storage.get_member(req.body.id);
member.name = req.body.name;
await storage.set_member(req.body.id, member);
} catch (err) {
throw err;
}
Expand All @@ -697,17 +698,16 @@ exports.member_delete = async function(req, res) {
try {
const network = await zt.network_detail(req.params.nwid);
let member = null;
let name = null;
let { name } = await storage.get_member(req.params.id);
if (req.method === 'POST') {
member = await zt.member_delete(req.params.nwid, req.params.id);
if (member.deleted) {
name = await storage.removeItem(member.id);
await storage.delete_member(member.id);
}
} else {
member = await zt.member_detail(req.params.nwid, req.params.id);
name = await storage.getItem(member.id);
}
member.name = name || '';
member.name = name;

navigate.whence = '/controller/network/' + network.nwid;
res.render('member_delete', {title: 'Delete member from ' + network.name,
Expand All @@ -731,17 +731,17 @@ exports.delete_ip = async function(req, res) {
const network = await zt.network_detail(req.params.nwid);
let member = await zt.member_detail(req.params.nwid, req.params.id);
navigate.whence = '/controller/network/' + network.nwid;
member.name = await storage.getItem(member.id) | '';
member.name = (await storage.get_member(member.id)).name;
if (req.params.index) {
member = await zt.ipAssignmentDelete(network.nwid, member.id,
req.params.index);
res.redirect('/controller/network/' + network.nwid + '/member/' +
member.id + '/ipAssignments');
}
res.render('ipAssignments', {title: 'ipAssignments ' + network.name,
res.render('member_prop_ipAssignments', {title: 'ipAssignments ' + network.name,
navigate: navigate, index: req.params.index, network: network, member: member});
} catch (err) {
res.render('ipAssignments', {title: 'ipAssignments', navigate: navigate,
res.render('member_prop_ipAssignments', {title: 'ipAssignments', navigate: navigate,
error: 'Error resolving detail for member ' + req.params.id
+ ' of network ' + req.params.nwid + ': ' + err});
}
Expand Down Expand Up @@ -795,13 +795,13 @@ exports.assign_ip = async function(req, res) {
member = await zt.ipAssignmentAdd(network.nwid, member.id, ipAssignment);
}

member.name = await storage.getItem(member.id) | '';
member.name = (await storage.get_member(member.id)).name;

res.render('ipAssignments', {title: 'ipAssignments', navigate: navigate,
res.render('member_prop_ipAssignments', {title: 'ipAssignments', navigate: navigate,
ipAssignment: ipAssignment, network: network, member: member,
errors: errors});
} catch (err) {
res.render('ipAssignments', {title: 'ipAssignments', navigate: navigate,
res.render('member_prop_ipAssignments', {title: 'ipAssignments', navigate: navigate,
error: 'Error resolving detail for member ' + req.params.id
+ ' of network ' + req.params.nwid + ': ' + err});
}
Expand Down
Loading