mirror of
https://github.com/key-networks/ztncui.git
synced 2024-08-31 04:28:00 +00:00
Initial commit
This commit is contained in:
31
views/authorized.pug
Normal file
31
views/authorized.pug
Normal file
@@ -0,0 +1,31 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
|
||||
h4 for member
|
||||
a(href='../' + member.address) #{member.address}
|
||||
|
||||
form(method='POST' action='')
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='authorized' value='true' checked=member.authorized)
|
||||
| Yes
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='authorized' value='false' checked=!member.authorized)
|
||||
| No
|
||||
|
||||
.form-group(style='padding-top: 10px')
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='../' + member.address name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
36
views/controller_layout.pug
Normal file
36
views/controller_layout.pug
Normal file
@@ -0,0 +1,36 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends head_layout
|
||||
|
||||
block body_content
|
||||
nav.navbar.navbar-inverse.navbar-fixed-top
|
||||
.container-fluid
|
||||
.navbar-header
|
||||
button.navbar-toggle(type='button' data-toggle='collapse' data-target='#BarNav')
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
a.navbar-brand(href='https://key-networks.com' target='_blank') Key Networks
|
||||
.collapse.navbar-collapse(id='BarNav')
|
||||
ul.nav.navbar-nav
|
||||
li(class=(page === 'controller_home'? 'active' : ''))
|
||||
a(href='/controller') Home
|
||||
li(class=(page === 'users'? 'active' : ''))
|
||||
a(href='/users') Users
|
||||
li(class=(page === 'networks'? 'active' : ''))
|
||||
a(href='/controller/networks') Networks
|
||||
li(class=(page === 'add_network'? 'active' : ''))
|
||||
a(href='/controller/network/create') Add network
|
||||
ul.nav.navbar-nav.navbar-right
|
||||
li
|
||||
a(href='/logout')
|
||||
span.glyphicon.glyphicon-log-out
|
||||
| Logout
|
||||
|
||||
.container(style='margin-top:50px')
|
||||
.row
|
||||
.col-sm-12
|
||||
block content
|
||||
6
views/error.pug
Normal file
6
views/error.pug
Normal file
@@ -0,0 +1,6 @@
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
h1= message
|
||||
h2= error.status
|
||||
pre #{error.stack}
|
||||
13
views/front_door.pug
Normal file
13
views/front_door.pug
Normal file
@@ -0,0 +1,13 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends login_layout
|
||||
|
||||
block login_content
|
||||
h1!= title
|
||||
|
||||
h2
|
||||
a(href='https://zerotier.com' target='_blank') ZeroTier
|
||||
| network controller UI
|
||||
17
views/head_layout.pug
Normal file
17
views/head_layout.pug
Normal file
@@ -0,0 +1,17 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
doctype html
|
||||
html(lang='en')
|
||||
head
|
||||
title= title
|
||||
meta(charset='utf-8')
|
||||
meta(name='viewport', content='width=device-width, initial-scale=1')
|
||||
link(rel='stylesheet', href='/bscss/bootstrap.min.css')
|
||||
link(rel='stylesheet', href='/stylesheets/style.css')
|
||||
script(src='/jqjs/jquery.min.js')
|
||||
script(src='/bsjs/bootstrap.min.js')
|
||||
body
|
||||
block body_content
|
||||
22
views/index.pug
Normal file
22
views/index.pug
Normal file
@@ -0,0 +1,22 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
h1!= title
|
||||
|
||||
h2
|
||||
a(href='https://zerotier.com' target='_blank') ZeroTier
|
||||
| network controller UI
|
||||
|
||||
h3 Network controller details
|
||||
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
p This network controller has a ZeroTier address of <b>#{zt_address}</b>
|
||||
|
||||
a(href='/controller/networks') List all networks on this network controller
|
||||
52
views/ipAssignmentPools.pug
Normal file
52
views/ipAssignmentPools.pug
Normal file
@@ -0,0 +1,52 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
.row
|
||||
.col-sm-12
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
tr
|
||||
th
|
||||
th IP range start
|
||||
th IP range end
|
||||
each ipAssignmentPool in network.ipAssignmentPools
|
||||
tr
|
||||
td(width='3%')
|
||||
a(href='/controller/network/' + network.nwid + '/ipAssignmentPools/' + ipAssignmentPool.ipRangeStart + '/' + ipAssignmentPool.ipRangeEnd + '/delete')
|
||||
i.glyphicon.glyphicon-trash
|
||||
td= ipAssignmentPool.ipRangeStart
|
||||
td= ipAssignmentPool.ipRangeEnd
|
||||
|
||||
.row
|
||||
.col-sm-12
|
||||
h3 Add new IP Assignment Pool:
|
||||
|
||||
form(method='POST' action='/controller/network/' + network.nwid + '/ipAssignmentPools')
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='ipRangeStart') IP range start:
|
||||
.col-sm-12
|
||||
input#ipRangeStart.form-control(type='text' name='ipRangeStart' placeholder='IP range start' value=(undefined===ipAssignmentPool? '' : ipAssignmentPool.ipRangeStart))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='ipRangeEnd') IP range end:
|
||||
.col-sm-12
|
||||
input#ipRangeEnd.form-control(type='text' name='ipRangeEnd' placeholder='IP range end' value=(undefined===ipAssignmentPool? '' : ipAssignmentPool.ipRangeEnd))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/network/' + network.nwid name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
.row
|
||||
.col-sm-12
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
44
views/login.pug
Normal file
44
views/login.pug
Normal file
@@ -0,0 +1,44 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends login_layout
|
||||
|
||||
block login_content
|
||||
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
.row
|
||||
.col-sm-12
|
||||
h1= title
|
||||
|
||||
if message
|
||||
.alert.alert-info
|
||||
strong= message
|
||||
|
||||
form.form-horizontal(method='POST' action='')
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label.control-label(for='username') Username:
|
||||
.col-sm-10
|
||||
.input-group
|
||||
span.input-group-addon
|
||||
i.glyphicon.glyphicon-user
|
||||
input#username.form-control(type='text' name='username' placeholder='Enter your username')
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label.control-label(for='password') Password:
|
||||
.col-sm-10
|
||||
.input-group
|
||||
span.input-group-addon
|
||||
i.glyphicon.glyphicon-lock
|
||||
input#password.form-control(type='password' name='password' placeholder='Enter your password')
|
||||
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
button.btn.btn-primary(type='submit') Login
|
||||
= ' '
|
||||
a.btn.btn-default(href='/' name='cancel' role='button') Cancel
|
||||
27
views/login_layout.pug
Normal file
27
views/login_layout.pug
Normal file
@@ -0,0 +1,27 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends head_layout
|
||||
|
||||
block body_content
|
||||
nav.navbar.navbar-inverse.navbar-fixed-top
|
||||
.container-fluid
|
||||
.navbar-header
|
||||
button.navbar-toggle(type='button' data-toggle='collapse' data-target='#BarNav')
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
a.navbar-brand(href='https://key-networks.com' target='_blank') Key Networks
|
||||
.collapse.navbar-collapse(id='BarNav')
|
||||
ul.nav.navbar-nav.navbar-right
|
||||
li
|
||||
a(href='/login')
|
||||
span.glyphicon.glyphicon-log-in
|
||||
| Login
|
||||
|
||||
.container(style='margin-top:50px')
|
||||
.row
|
||||
.col-sm-12
|
||||
block login_content
|
||||
28
views/member_delete.pug
Normal file
28
views/member_delete.pug
Normal file
@@ -0,0 +1,28 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
if member.deleted
|
||||
.alert.alert-success
|
||||
strong #{member.name} (#{member.id}) was deleted
|
||||
a.btn.btn-default(href='../../members' name='networks' role='button') Members
|
||||
|
||||
else
|
||||
.alert.alert-info
|
||||
strong.
|
||||
Note: To undo a member deletion, just get the member to
|
||||
join the network again
|
||||
form(method='POST' action='')
|
||||
button.btn.btn-primary(type='submit', name='delete') Delete #{member.name} (#{member.id})
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/network/' + network.nwid + '/members',
|
||||
name='cancel', role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
33
views/member_detail.pug
Normal file
33
views/member_detail.pug
Normal file
@@ -0,0 +1,33 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
h4 for member
|
||||
a(href= member.address) #{member.address}
|
||||
|
||||
each value, key in member
|
||||
.row
|
||||
.col-sm-2
|
||||
a(href= member.address + '/' + key) #{key}:
|
||||
.col-sm-10
|
||||
- if ((!!value ) && (value.constructor == Object))
|
||||
p {
|
||||
each v2, k2 in value
|
||||
p #{k2}: #{v2},
|
||||
p }
|
||||
- else if ((!!value ) && (value.constructor == Array))
|
||||
p [
|
||||
each elem in value
|
||||
p {
|
||||
each v2, k2 in elem
|
||||
p #{k2}: #{v2},
|
||||
p }
|
||||
p ]
|
||||
- else
|
||||
| #{value}
|
||||
|
||||
a.btn.btn-default(href='../members' name='networks' role='button') Members
|
||||
64
views/members.pug
Normal file
64
views/members.pug
Normal file
@@ -0,0 +1,64 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
script.
|
||||
$(function() {
|
||||
$('.checkbox').on('click', function() {
|
||||
$.post('', {id: this.value, auth: this.checked});
|
||||
});
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('.text').on('change', function() {
|
||||
$.post('', {id: this.name, name: this.value});
|
||||
});
|
||||
});
|
||||
|
||||
form(method='POST' action='')
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
tr
|
||||
td(width='3%')
|
||||
= ''
|
||||
td(width='20%')
|
||||
| Member name
|
||||
td(width='10%')
|
||||
| Member ID
|
||||
td(width='10%')
|
||||
| Authorized
|
||||
td(width='57%')
|
||||
| IP assignment
|
||||
each member in members
|
||||
tr
|
||||
- let url = '/controller/network/' + network.nwid + '/member/' + member.id
|
||||
td
|
||||
a(href=url + '/delete')
|
||||
i.glyphicon.glyphicon-trash
|
||||
td
|
||||
input.form-control.text(type='text' name=member.id value=member.name)
|
||||
td
|
||||
a(href=url) #{member.id}
|
||||
td
|
||||
input.checkbox(type='checkbox' name='authCheckBox' value=member.id checked=(member.authorized? true : false))
|
||||
td
|
||||
each ipAssignment in member.ipAssignments
|
||||
each digit in ipAssignment
|
||||
= digit
|
||||
= ' '
|
||||
|
||||
else
|
||||
.alert.alert-info
|
||||
strong There are no members on this network - invite users to join #{network.nwid}
|
||||
|
||||
a.btn.btn-default(href='/controller/networks' name='networks' role='button') Networks
|
||||
= ' '
|
||||
a.btn.btn-default(href='' name='refresh' role='button') Refresh
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
28
views/name.pug
Normal file
28
views/name.pug
Normal file
@@ -0,0 +1,28 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
form(method='POST' action='')
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='name') Network name:
|
||||
.col-sm-10
|
||||
input#name.form-control(type='text' name='name' placeholder='New network name' value=(undefined===network.name? '' : network.name))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/networks' name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
.row
|
||||
.col-sm-12
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
33
views/network_create.pug
Normal file
33
views/network_create.pug
Normal file
@@ -0,0 +1,33 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
.row
|
||||
.col-sm-12
|
||||
h1= title
|
||||
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
|
||||
form(method='POST' action='')
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='name') Network name:
|
||||
.col-sm-10
|
||||
input#name.form-control(type='text' name='name' placeholder='Enter new network name' value=(undefined===name ? '' : name.name))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
button.btn.btn-primary(type='submit') Create Network
|
||||
|
||||
if errors
|
||||
.row
|
||||
.col-sm-12
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
24
views/network_delete.pug
Normal file
24
views/network_delete.pug
Normal file
@@ -0,0 +1,24 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
if network.deleted
|
||||
.alert.alert-success
|
||||
strong #{network.name} (#{network.nwid}) was deleted
|
||||
|
||||
else
|
||||
.alert.alert-danger
|
||||
strong Warning! Deleting a network cannot be undone
|
||||
form(method='POST' action='')
|
||||
button.btn.btn-danger(type='submit', name='delete') Delete #{network.name} (#{network.nwid})
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/networks', name='cancel', role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
47
views/network_detail.pug
Normal file
47
views/network_detail.pug
Normal file
@@ -0,0 +1,47 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
h2
|
||||
a(href= network.nwid + '/name') #{network.name}
|
||||
| (#{network.nwid}):
|
||||
|
||||
- if (members !== undefined)
|
||||
h3 Members
|
||||
each value, key in members
|
||||
.row
|
||||
.col-sm-2
|
||||
a(href= network.nwid + '/member/' + key) #{key}
|
||||
.col-sm-10
|
||||
| revision: #{value}
|
||||
|
||||
h3= title
|
||||
each value, key in network
|
||||
.row
|
||||
.col-sm-2
|
||||
a(href= network.nwid + '/' + key) #{key}:
|
||||
.col-sm-10
|
||||
- if ((!!value ) && (value.constructor == Object))
|
||||
p {
|
||||
each v2, k2 in value
|
||||
p #{k2}: #{v2},
|
||||
p }
|
||||
- else if ((!!value ) && (value.constructor == Array))
|
||||
p [
|
||||
each elem in value
|
||||
p {
|
||||
each v2, k2 in elem
|
||||
p #{k2}: #{v2},
|
||||
p },
|
||||
p ]
|
||||
- else
|
||||
| #{value}
|
||||
|
||||
a.btn.btn-default(href='/controller/networks' name='networks' role='button') Networks
|
||||
88
views/network_easy.pug
Normal file
88
views/network_easy.pug
Normal file
@@ -0,0 +1,88 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
script.
|
||||
function randomOctet() {
|
||||
return Math.floor(Math.random() * 255);
|
||||
}
|
||||
|
||||
function randomIPv4() {
|
||||
const networkCIDR = document.getElementById('networkCIDR');
|
||||
const CIDR = '10.' + randomOctet() + '.' + randomOctet() + '.0/24';
|
||||
networkCIDR.value = CIDR;
|
||||
CIDRtoPool(CIDR);
|
||||
}
|
||||
|
||||
function int32toIPv4String(int32) {
|
||||
let ipv4 = '';
|
||||
ipv4 = ((int32 & 0xff000000)>>>24).toString();
|
||||
ipv4 += '.' + ((int32 & 0x00ff0000)>>>16).toString();
|
||||
ipv4 += '.' + ((int32 & 0x0000ff00)>>>8).toString();
|
||||
ipv4 += '.' + (int32 & 0x000000ff).toString();
|
||||
return ipv4;
|
||||
}
|
||||
|
||||
function CIDRtoPool(CIDR) {
|
||||
const [start, prefix] = CIDR.split('/');
|
||||
if (undefined !== start && undefined !== prefix &&
|
||||
prefix > 0 && prefix < 33 &&
|
||||
/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(start)
|
||||
){
|
||||
const host32 = ((1 << (32 - parseInt(prefix))) - 1) >>> 0;
|
||||
const net = start.split('.').map(oct => {return parseInt(oct)});
|
||||
let net32 = 0 >>> 0;
|
||||
net32 = (net[0]<<24) + (net[1]<<16) + (net[2]<<8) + (net[3]);
|
||||
net32 &= ~host32;
|
||||
bcast32 = net32 + host32;
|
||||
const networkCIDR = document.getElementById('networkCIDR');
|
||||
const poolStart = document.getElementById('poolStart');
|
||||
const poolEnd = document.getElementById('poolEnd');
|
||||
networkCIDR.value = int32toIPv4String(net32) + '/' + prefix;
|
||||
poolStart.value = int32toIPv4String(net32 + 1);
|
||||
poolEnd.value = int32toIPv4String(bcast32 - 1);
|
||||
} else {
|
||||
poolStart.value = 'Invalid network CIDR';
|
||||
poolEnd.value = 'Invalid network CIDR';
|
||||
}
|
||||
}
|
||||
|
||||
if message
|
||||
.alert.alert-info
|
||||
strong= message
|
||||
|
||||
form(method='POST' action='')
|
||||
.form-group
|
||||
button.btn.btn-link.float-right(type='button' data-toggle='collapse' data-target='#help') Help
|
||||
.collapse(id='help')
|
||||
p Please note that this utility only supports IPv4 at this stage.
|
||||
p Use the following button to automatically generate a random network address, otherwise fill in the network address CIDR manually and the IP assignment pool will be automatically calculated for you. You can manually alter these calculated values.
|
||||
|
||||
.form-group
|
||||
button.btn.btn-primary(id='genIPv4' type='button' onclick='randomIPv4()') Generate network address
|
||||
|
||||
.form-group
|
||||
label(for='networkCIDR') Network address in CIDR notation
|
||||
input#networkCIDR.form-control(type='text' name='networkCIDR' onchange='CIDRtoPool(this.value)' placeholder='e.g. 10.11.12.0/24' value=(undefined===network.routes[0]? '' : network.routes[0].target))
|
||||
|
||||
.form-group
|
||||
label(for='poolStart') Start of IP assignment pool
|
||||
input#poolStart.form-control(type='text' name='poolStart' placeholder='e.g. 10.11.12.1' value=(undefined===network.ipAssignmentPools[0]? '' : network.ipAssignmentPools[0].ipRangeStart))
|
||||
|
||||
.form-group
|
||||
label(for='poolEnd') End of IP assignment pool
|
||||
input#poolEnd.form-control(type='text' name='poolEnd' placeholder='e.g. 10.11.12.254' value=(undefined===network.ipAssignmentPools[0]? '' : network.ipAssignmentPools[0].ipRangeEnd))
|
||||
|
||||
.form-group(style='padding-top: 10px')
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/networks' name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
19
views/network_layout.pug
Normal file
19
views/network_layout.pug
Normal file
@@ -0,0 +1,19 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
.row
|
||||
.col-sm-12
|
||||
h2
|
||||
a(href='/controller/network/' + network.nwid) #{network.name}
|
||||
| (#{network.nwid}):
|
||||
h3= title
|
||||
|
||||
block net_content
|
||||
47
views/networks.pug
Normal file
47
views/networks.pug
Normal file
@@ -0,0 +1,47 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends controller_layout
|
||||
|
||||
block content
|
||||
h1= title
|
||||
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
tr
|
||||
td(width='3%')
|
||||
= ''
|
||||
td(width='20%')
|
||||
| Network name
|
||||
td(width='10%')
|
||||
| Network ID
|
||||
td(width='7%')
|
||||
= ''
|
||||
td(width='10%')
|
||||
= ''
|
||||
td(width='50%')
|
||||
= ''
|
||||
each network in networks
|
||||
tr
|
||||
td
|
||||
a(href='/controller/network/' + network.nwid + '/delete')
|
||||
i.glyphicon.glyphicon-trash
|
||||
td
|
||||
a(href='/controller/network/' + network.nwid + '/name') #{network.name}
|
||||
td
|
||||
= network.nwid
|
||||
td
|
||||
a(href='/controller/network/' + network.nwid) detail
|
||||
td
|
||||
a(href='/controller/network/' + network.nwid + '/easy') easy setup
|
||||
td
|
||||
a(href='/controller/network/' + network.nwid + '/members') members
|
||||
|
||||
else
|
||||
tr
|
||||
td There are no networks on this network controller
|
||||
14
views/not_implemented.pug
Normal file
14
views/not_implemented.pug
Normal file
@@ -0,0 +1,14 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
- if (member !== undefined)
|
||||
h4 for member
|
||||
a(href='../' + member.address) #{member.address}
|
||||
h4 Editing of
|
||||
b #{title}
|
||||
| has not been implemented
|
||||
60
views/password.pug
Normal file
60
views/password.pug
Normal file
@@ -0,0 +1,60 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends users_layout
|
||||
|
||||
block users_content
|
||||
if message
|
||||
.row
|
||||
.col-sm-12
|
||||
.alert.alert-info
|
||||
strong= message
|
||||
|
||||
form.form-horizontal(method='POST' action='')
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='username') Username:
|
||||
.col-sm-10
|
||||
.input-group
|
||||
span.input-group-addon
|
||||
i.glyphicon.glyphicon-user
|
||||
input#username.form-control(type='text' name='username' placeholder='Enter username' value=user.name readonly=readonly)
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='password1') Enter new password:
|
||||
.col-sm-10
|
||||
.input-group
|
||||
span.input-group-addon
|
||||
i.glyphicon.glyphicon-lock
|
||||
input#password1.form-control(type='password' name='password1' placeholder='Enter new password' value=(undefined===user.password1? '' : user.password1))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='password2') Re-enter password:
|
||||
.col-sm-10
|
||||
.input-group
|
||||
span.input-group-addon
|
||||
i.glyphicon.glyphicon-lock
|
||||
input#password2.form-control(type='password' name='password2' placeholder='Re-enter password' value=(undefined===user.password2? '' : user.password2))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='pass_set') Change password on next login:
|
||||
.col-sm-10
|
||||
input#pass_set(type='checkbox' name='pass_set' value='check')
|
||||
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
button.btn.btn-primary(type='submit') Set password
|
||||
= ' '
|
||||
a.btn.btn-default(href='/users' name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
.form-group.row
|
||||
.col-sm-12
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
52
views/routes.pug
Normal file
52
views/routes.pug
Normal file
@@ -0,0 +1,52 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
.row
|
||||
.col-sm-12
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
tr
|
||||
th
|
||||
th Target
|
||||
th Gateway
|
||||
each route in network.routes
|
||||
tr
|
||||
td(width='3%')
|
||||
a(href='/controller/network/' + network.nwid + '/routes/' + route.target + '/delete')
|
||||
i.glyphicon.glyphicon-trash
|
||||
td= route.target
|
||||
td= route.via
|
||||
|
||||
.row
|
||||
.col-sm-12
|
||||
h3 Add new route:
|
||||
|
||||
form(method='POST' action='/controller/network/' + network.nwid + '/routes')
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='target') Target:
|
||||
.col-sm-12
|
||||
input#target.form-control(type='text' name='target' placeholder='e.g. 10.11.12.0/24' value=(undefined===route? '' : route.target))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
label(for='via') Gateway:
|
||||
.col-sm-12
|
||||
input#via.form-control(type='text' name='via' placeholder='e.g. 172.16.2.1 or leave blank if the target is the ZT network' value=(undefined===route? '' : route.via))
|
||||
|
||||
.form-group.row
|
||||
.col-sm-2
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/network/' + network.nwid name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
.row
|
||||
.col-sm-12
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
32
views/user_delete.pug
Normal file
32
views/user_delete.pug
Normal file
@@ -0,0 +1,32 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends users_layout
|
||||
|
||||
block users_content
|
||||
if user === null
|
||||
.alert.alert-warning
|
||||
strong No such user
|
||||
|
||||
else if self_delete === true
|
||||
.alert.alert-danger
|
||||
strong You may not delete yourself
|
||||
|
||||
else if deleted
|
||||
.alert.alert-success
|
||||
strong #{user.name} was deleted
|
||||
|
||||
else
|
||||
.alert.alert-danger
|
||||
strong Warning! Deleting a user cannot be undone
|
||||
form(method='POST' action='')
|
||||
button.btn.btn-danger(type='submit', name='delete' value='delete') Delete #{user.name}
|
||||
= ' '
|
||||
a.btn.btn-default(href='/users', name='cancel', role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
22
views/users.pug
Normal file
22
views/users.pug
Normal file
@@ -0,0 +1,22 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends users_layout
|
||||
|
||||
block users_content
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
each user in users
|
||||
tr
|
||||
td(width='3%')
|
||||
a(href='/users/' + user.name + '/delete')
|
||||
i.glyphicon.glyphicon-trash
|
||||
td(width='15%')
|
||||
a(href='/users/' + user.name + '/password') #{user.name}
|
||||
td(width='82%')
|
||||
a(href='/users/' + user.name + '/password') set password
|
||||
|
||||
else
|
||||
tr
|
||||
td There are no users on this system
|
||||
38
views/users_layout.pug
Normal file
38
views/users_layout.pug
Normal file
@@ -0,0 +1,38 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends head_layout
|
||||
|
||||
block body_content
|
||||
nav.navbar.navbar-inverse.navbar-fixed-top
|
||||
.container-fluid
|
||||
.navbar-header
|
||||
button.navbar-toggle(type='button' data-toggle='collapse' data-target='#BarNav')
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
span.icon-bar
|
||||
a.navbar-brand(href='https://key-networks.com' target='_blank') Key Networks
|
||||
.collapse.navbar-collapse(id='BarNav')
|
||||
ul.nav.navbar-nav
|
||||
li(class=(page === 'home'? 'active' : ''))
|
||||
a(href='/controller') Home
|
||||
li(class=(page === 'users'? 'active' : ''))
|
||||
a(href='/users') Users
|
||||
li(class=(page === 'create_user'? 'active' : ''))
|
||||
a(href='/users/create') Create user
|
||||
ul.nav.navbar-nav.navbar-right
|
||||
li
|
||||
a(href='/logout')
|
||||
span.glyphicon.glyphicon-log-out
|
||||
| Logout
|
||||
|
||||
.container(style='margin-top:50px')
|
||||
.row
|
||||
.col-sm-12
|
||||
if error
|
||||
b #{error}
|
||||
else
|
||||
h1= title
|
||||
block users_content
|
||||
29
views/v4AssignMode.pug
Normal file
29
views/v4AssignMode.pug
Normal file
@@ -0,0 +1,29 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
p Let ZT assign IPv4 addresses?
|
||||
|
||||
form(method='POST' action='')
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='zt' value='true' checked=network.v4AssignMode.zt)
|
||||
| Yes
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='zt' value='false' checked=!network.v4AssignMode.zt)
|
||||
| No
|
||||
|
||||
.form-group(style='padding-top: 10px')
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/network/' + network.nwid name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
54
views/v6AssignMode.pug
Normal file
54
views/v6AssignMode.pug
Normal file
@@ -0,0 +1,54 @@
|
||||
//-
|
||||
ztncui - ZeroTier network controller UI
|
||||
Copyright (C) 2017 Key Networks (https://key-networks.com)
|
||||
Licensed under GPLv3 - see LICENSE for details.
|
||||
|
||||
extends network_layout
|
||||
|
||||
block net_content
|
||||
form(method='POST' action='')
|
||||
table.table.table-responsive.table-striped.table-hover
|
||||
tr
|
||||
th(width='25%')
|
||||
th(width='2%') Yes
|
||||
th(width='73%') No
|
||||
tr
|
||||
td ZT 6plane (/80 routable for each device)
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='6plane' value='true' checked=network.v6AssignMode['6plane'])
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='6plane' value='false' checked=!network.v6AssignMode['6plane'])
|
||||
tr
|
||||
td ZT rfc4193 (/128 for each device)
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='rfc4193' value='true' checked=network.v6AssignMode.rfc4193)
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='rfc4193' value='false' checked=!network.v6AssignMode.rfc4193)
|
||||
tr
|
||||
td Auto-assign from IP Assignment Pool
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='zt' value='true' checked=network.v6AssignMode.zt)
|
||||
td
|
||||
.radio
|
||||
label
|
||||
input(type='radio' name='zt' value='false' checked=!network.v6AssignMode.zt)
|
||||
|
||||
.form-group(style='padding-top: 10px')
|
||||
button.btn.btn-primary(type='submit') Submit
|
||||
= ' '
|
||||
a.btn.btn-default(href='/controller/network/' + network.nwid name='cancel' role='button') Cancel
|
||||
|
||||
if errors
|
||||
ul
|
||||
for err in errors
|
||||
li!= err.msg
|
||||
Reference in New Issue
Block a user