8
0
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:
Key Networks
2017-12-13 22:05:07 +08:00
commit c7e7dcaf72
45 changed files with 6724 additions and 0 deletions

31
views/authorized.pug Normal file
View 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

View 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
View 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
View 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
View 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
View 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

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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