Browse Source

make Prettier

master
AJ ONeal 4 years ago
parent
commit
880da4d685
  1. 18
      .jshintrc
  2. 7
      .prettierrc
  3. 112
      dump/admin.html
  4. 137
      dump/client.html
  5. 21
      html/admin/404.html
  6. 21
      html/admin/css/main.css
  7. 83
      html/admin/index.html
  8. 109
      html/admin/js/app.js
  9. 32
      html/admin/js/plugins.js
  10. 145
      html/admin/js/vendor/filter.js
  11. 35
      html/admin/partials/servers.html
  12. 32
      html/admin/partials/status.html
  13. 4
      rvpn-docker/README.md

18
.jshintrc

@ -0,0 +1,18 @@
{ "node": true
, "browser": true
, "jquery": true
, "globals": { "angular": true, "Promise": true }
, "indent": 2
, "onevar": true
, "laxcomma": true
, "laxbreak": true
, "curly": true
, "nonbsp": true
, "eqeqeq": true
, "immed": true
, "undef": true
, "unused": true
, "latedef": true
}

7
.prettierrc

@ -0,0 +1,7 @@
{
"bracketSpacing": true,
"printWidth": 120,
"tabWidth": 4,
"trailingComma": "none",
"useTabs": false
}

112
dump/admin.html

@ -1,31 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Websock VPN Instrumentation</title>
</head>
<body ng-app="vpnAdmin" ng-controller="vpnInstrumentationController">
<head>
<title>Websock VPN Instrumentation</title>
</head>
<body ng-app="vpnAdmin" ng-controller="vpnInstrumentationController">
<div class="panel panel-default panel-primary">
<div class="panel-heading">VPN Instrumentation</div>
<div class="panel-body">
<div class="panel panel-default panel-info">
<div class="panel-heading ">Control Plane</div>
<div class="panel-heading">Control Plane</div>
<div class="panel-body">
<div class="row"> <!-- Auth -->
<div class="row">
<!-- Auth -->
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" type="button" ng-click="startWebSocket()">Start WebSocket</button>
<button class="btn btn-default" type="button" ng-click="startWebSocket()">
Start WebSocket
</button>
</span>
<button class="btn btn-default" type="button" ng-class="conn == false && 'btn-danger' || 'btn-success'">
<button
class="btn btn-default"
type="button"
ng-class="conn == false && 'btn-danger' || 'btn-success'"
>
{[{ conn == false && 'False' || 'True' }]}
</button>
</div>
</div>
</div>
<br>
<br />
<div class="row">
<div class="col-lg-6">
@ -33,7 +38,7 @@
<span class="input-group-btn">
<button class="btn btn-default" type="button">Auth</button>
</span>
<input type="text" class="form-control" placeholder="Enter auth data here">
<input type="text" class="form-control" placeholder="Enter auth data here" />
</div>
</div>
</div>
@ -47,64 +52,73 @@
</div>
</div>
</div>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<script type="text/javascript">
console.log("startup");
var vpnAdmin = angular.module('vpnAdmin',[]);
vpnAdmin.config(function($interpolateProvider) {
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
crossorigin="anonymous"
/>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"
></script>
<script type="text/javascript">
console.log("startup");
var vpnAdmin = angular.module("vpnAdmin", []);
vpnAdmin.config(function ($interpolateProvider) {
console.log("vpnTest Config");
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
vpnAdmin.controller('vpnInstrumentationController', function ($scope) {
$interpolateProvider.startSymbol("{[{");
$interpolateProvider.endSymbol("}]}");
});
vpnAdmin.controller("vpnInstrumentationController", function ($scope) {
console.log("vpnInstrumentationController startup");
$scope.log_elements = [];
$scope.auth_key = "";
$scope.conn = false;
$scope.webSocketStatus = function() {
$scope.webSocketStatus = function () {
if ($scope.conn == false) {
return ""
}
return "";
}
};
$scope.startWebSocket = function() {
$scope.startWebSocket = function () {
console.log("Start webSocket {{$}}");
if (window["WebSocket"]) {
$scope.conn = new WebSocket("wss://{{$}}/ws/admin");
$scope.append_log("Websocket opened");
$scope.conn.onclose = function (evt) {
$scope.append_log("Connection closed.");
}
};
$scope.conn.onmessage = function (evt) {
$scope.append_log(evt.data)
}
}
else {
appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"))
$scope.append_log(evt.data);
};
} else {
appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"));
}
};
$scope.auth_click = function() {
$scope.append_log($scope.auth_key)
$scope.auth_click = function () {
$scope.append_log($scope.auth_key);
};
$scope.append_log = function(txt) {
$scope.log_elements.push(txt)
$scope.append_log = function (txt) {
$scope.log_elements.push(txt);
};
});
</script>
});
</script>
</html>

137
dump/client.html

@ -1,31 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Websock VPN Test Client</title>
</head>
<body ng-app="vpnTest" ng-controller="vpnTestController">
<head>
<title>Websock VPN Test Client</title>
</head>
<body ng-app="vpnTest" ng-controller="vpnTestController">
<div class="panel panel-default panel-primary">
<div class="panel-heading">WebSocket Client Test</div>
<div class="panel-body">
<div class="panel panel-default panel-info">
<div class="panel-heading ">Control Plane</div>
<div class="panel-heading">Control Plane</div>
<div class="panel-body">
<div class="row"> <!-- Auth -->
<div class="row">
<!-- Auth -->
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" type="button" ng-click="startWebSocket()">Start WebSocket</button>
<button class="btn btn-default" type="button" ng-click="startWebSocket()">
Start WebSocket
</button>
</span>
<button class="btn btn-default" type="button" ng-class="conn == false && 'btn-danger' || 'btn-success'">
<button
class="btn btn-default"
type="button"
ng-class="conn == false && 'btn-danger' || 'btn-success'"
>
{[{ conn == false && 'False' || 'True' }]}
</button>
</div>
</div>
</div>
<br>
<br />
<div class="row">
<div class="col-lg-6">
@ -33,25 +38,30 @@
<span class="input-group-btn">
<button class="btn btn-default" type="button">Auth</button>
</span>
<input type="text" class="form-control" placeholder="Enter auth data here">
<input type="text" class="form-control" placeholder="Enter auth data here" />
</div>
</div>
</div>
<br>
<br />
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" ng-click="send_click()" type="button">Send</button>
<button class="btn btn-default" ng-click="send_click()" type="button">
Send
</button>
</span>
<input ng-model="send_data" type="text" class="form-control" placeholder="Enter send data here">
<input
ng-model="send_data"
type="text"
class="form-control"
placeholder="Enter send data here"
/>
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default panel-danger">
@ -62,71 +72,80 @@
</div>
</div>
</div>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<script type="text/javascript">
console.log("startup");
var vpnTest = angular.module('vpnTest',[]);
vpnTest.config(function($interpolateProvider) {
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
crossorigin="anonymous"
/>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"
></script>
<script type="text/javascript">
console.log("startup");
var vpnTest = angular.module("vpnTest", []);
vpnTest.config(function ($interpolateProvider) {
console.log("vpnTest Config");
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
vpnTest.controller('vpnTestController', function ($scope) {
$interpolateProvider.startSymbol("{[{");
$interpolateProvider.endSymbol("}]}");
});
vpnTest.controller("vpnTestController", function ($scope) {
console.log("vpnTestController startup");
$scope.log_elements = [];
$scope.auth_key = "";
$scope.conn = false;
$scope.send_data = ""
$scope.send_data = "";
$scope.webSocketStatus = function() {
$scope.webSocketStatus = function () {
if ($scope.conn == false) {
return ""
}
return "";
}
};
$scope.startWebSocket = function() {
$scope.startWebSocket = function () {
console.log("Start webSocket {{$}}");
if (window["WebSocket"]) {
$scope.conn = new WebSocket("wss://{{$}}/ws/client");
$scope.append_log("Websocket opened");
$scope.conn.onclose = function (evt) {
$scope.append_log("Connection closed.");
}
};
$scope.conn.onmessage = function (evt) {
console.log(evt.data)
$scope.append_log(evt.data)
}
}
else {
appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"))
console.log(evt.data);
$scope.append_log(evt.data);
};
} else {
appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"));
}
};
$scope.auth_click = function() {
$scope.append_log($scope.auth_key)
$scope.auth_click = function () {
$scope.append_log($scope.auth_key);
};
$scope.send_click = function() {
console.log("send_click")
$scope.conn.send($scope.send_data)
$scope.send_click = function () {
console.log("send_click");
$scope.conn.send($scope.send_data);
};
$scope.append_log = function(txt) {
$scope.log_elements.push(txt)
$scope.append_log = function (txt) {
$scope.log_elements.push(txt);
};
});
</script>
});
</script>
</html>

21
html/admin/404.html

@ -1,11 +1,10 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<head>
<meta charset="utf-8" />
<title>Page Not Found</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
* {
line-height: 1.2;
margin: 0;
@ -38,8 +37,8 @@
}
@media only screen and (max-width: 280px) {
body, p {
body,
p {
width: 95%;
}
@ -47,14 +46,12 @@
font-size: 1.5em;
margin: 0 0 0.3em;
}
}
</style>
</head>
<body>
</head>
<body>
<h1>Page Not Found</h1>
<p>Sorry, but the page you were trying to view does not exist.</p>
</body>
</body>
</html>
<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx -->

21
html/admin/css/main.css

@ -95,22 +95,6 @@ textarea {
Author's custom styles
========================================================================== */
/* ==========================================================================
Helper classes
========================================================================== */
@ -195,10 +179,7 @@ textarea {
/* Style adjustments for viewports that meet the condition */
}
@media print,
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 1.25dppx),
(min-resolution: 120dpi) {
@media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 1.25dppx), (min-resolution: 120dpi) {
/* Style adjustments for high resolution devices */
}

83
html/admin/index.html

@ -1,23 +1,26 @@
<!doctype html>
<!DOCTYPE html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="apple-touch-icon" href="apple-touch-icon.png" />
<!-- Place favicon.ico in the root directory -->
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/normalize.css" />
<link rel="stylesheet" href="css/main.css" />
<script src="js/vendor/modernizr-2.8.3.min.js"></script>
<base href="/">
<base href="/" />
</head>
<body ng-app="rvpnApp">
<!--[if lt IE 8]>
<p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<p class="browserupgrade">
You are using an <strong>outdated</strong> browser. Please
<a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.
</p>
<![endif]-->
<!-- Admin GUI Begins Here -->
@ -28,49 +31,67 @@
</div>
<nav class="collapse navbar-collapse" id="bs-navbar">
<ul class="nav navbar-nav">
<li> <a href="/admin/status">Status</a> </li>
<li> <a href="/admin/servers">Servers</a> </li>
<li> <a href="/admin/#domains">Domains</a> </li>
<li> <a href="/admin/#connections">Connections</a> </li>
<li><a href="/admin/status">Status</a></li>
<li><a href="/admin/servers">Servers</a></li>
<li><a href="/admin/#domains">Domains</a></li>
<li><a href="/admin/#connections">Connections</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Help</a></li>
<li><a href="#">Login</a></li>
</ul>
</nav>
</div>
</header>
<div ng-view> </div>
<div ng-view></div>
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
<script>window.jQuery || document.write('<script src="admin/js/vendor/jquery-1.12.0.min.js"><\/script>')</script>
<script>
window.jQuery || document.write('<script src="admin/js/vendor/jquery-1.12.0.min.js"><\/script>');
</script>
<script src="admin/js/plugins.js"></script>
<script src="admin/js/main.js"></script>
<!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
<script>
(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
e=o.createElement(i);r=o.getElementsByTagName(i)[0];
e.src='https://www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
ga('create','UA-XXXXX-X','auto');ga('send','pageview');
(function (b, o, i, l, e, r) {
b.GoogleAnalyticsObject = l;
b[l] ||
(b[l] = function () {
(b[l].q = b[l].q || []).push(arguments);
});
b[l].l = +new Date();
e = o.createElement(i);
r = o.getElementsByTagName(i)[0];
e.src = "https://www.google-analytics.com/analytics.js";
r.parentNode.insertBefore(e, r);
})(window, document, "script", "ga");
ga("create", "UA-XXXXX-X", "auto");
ga("send", "pageview");
</script>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-route.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
crossorigin="anonymous"
/>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"
></script>
<script src="/admin/js/vendor/filter.js"></script>
<script src="/admin/js/app.js"></script>
</html>

109
html/admin/js/app.js

@ -1,132 +1,129 @@
console.log("app.sh startup")
console.log("app.sh startup");
var app = angular.module("rvpnApp", ["ngRoute", "angular-duration-format"]);
app.config(function($routeProvider, $locationProvider) {
app.config(function ($routeProvider, $locationProvider) {
$routeProvider
.when("/admin/status/", {
templateUrl : "admin/partials/status.html"
templateUrl: "admin/partials/status.html"
})
.when("/admin/index.html", {
templateUrl : "admin/partials/servers.html"
templateUrl: "admin/partials/servers.html"
})
.when("/admin/servers/", {
templateUrl : "admin/partials/servers.html"
templateUrl: "admin/partials/servers.html"
})
.when("/admin/#domains", {
templateUrl : "green.htm"
templateUrl: "green.htm"
})
.when("/blue", {
templateUrl : "blue.htm"
templateUrl: "blue.htm"
});
$locationProvider.html5Mode(true);
});
app.filter('bytes', function() {
return function(bytes, precision) {
if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-';
if (typeof precision === 'undefined') precision = 1;
var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'],
app.filter("bytes", function () {
return function (bytes, precision) {
if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return "-";
if (typeof precision === "undefined") precision = 1;
var units = ["bytes", "kB", "MB", "GB", "TB", "PB"],
number = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number];
}
return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + " " + units[number];
};
});
app.filter('hfcduration', function() {
return function(duration, precision) {
remain = duration
duration_day = 24*60*60
duration_hour = 60*60
duration_minute = 60
duration_str = ""
app.filter("hfcduration", function () {
return function (duration, precision) {
remain = duration;
duration_day = 24 * 60 * 60;
duration_hour = 60 * 60;
duration_minute = 60;
duration_str = "";
days = Math.floor(remain / duration_day)
days = Math.floor(remain / duration_day);
if (days > 0) {
remain = remain - (days * duration_day)
duration_str = duration_str + days + 'd'
remain = remain - days * duration_day;
duration_str = duration_str + days + "d";
}
hours = Math.floor(remain / duration_hour)
hours = Math.floor(remain / duration_hour);
if (hours > 0) {
remain = remain - (hours * duration_hour)
duration_str = duration_str + hours + 'h'
remain = remain - hours * duration_hour;
duration_str = duration_str + hours + "h";
}
mins = Math.floor(remain / duration_minute)
mins = Math.floor(remain / duration_minute);
if (mins > 0) {
remain = remain - (mins * duration_minute)
duration_str = duration_str + mins + 'm'
remain = remain - mins * duration_minute;
duration_str = duration_str + mins + "m";
}
secs = Math.floor(remain)
duration_str = duration_str + secs + 's'
secs = Math.floor(remain);
duration_str = duration_str + secs + "s";
return (duration_str);
}
return duration_str;
};
});
app.controller('statusController', function ($scope, $http) {
app.controller("statusController", function ($scope, $http) {
console.log("statusController");
$scope.status_search = "";
var api = '/api/org.rootprojects.tunnel/status'
var api = "/api/org.rootprojects.tunnel/status";
$scope.updateView = function() {
$http.get(api).then(function(response) {
$scope.updateView = function () {
$http.get(api).then(function (response) {
console.log(response);
data = response.data;
if (data.error == 'ok' ){
if (data.error == "ok") {
$scope.status = data.result;
}
});
}
$scope.updateView()
};
$scope.updateView();
});
app.controller('serverController', function ($scope, $http) {
app.controller("serverController", function ($scope, $http) {
$scope.servers = [];
$scope.servers_search = "";
$scope.servers_trigger_details = [];
$scope.filtered
$scope.filtered;
var api = '/api/org.rootprojects.tunnel/servers'
var api = "/api/org.rootprojects.tunnel/servers";
$scope.updateView = function() {
$http.get(api).then(function(response) {
$scope.updateView = function () {
$http.get(api).then(function (response) {
//console.log(response);
data = response.data;
if (data.error == 'ok' ){
if (data.error == "ok") {
$scope.servers = data.result.servers;
}
});
}
};
$scope.triggerDetail = function(id) {
$scope.triggerDetail = function (id) {
//console.log("triggerDetail ", id, $scope.servers_trigger_details[id])
if ($scope.servers_trigger_details[id] == true) {
$scope.servers_trigger_details[id] = false;
} else {
$scope.servers_trigger_details[id] = true
$scope.servers_trigger_details[id] = true;
}
};
$scope.checkDetail = function(id) {
$scope.checkDetail = function (id) {
//console.log("checkDetail ", id, $scope.servers_trigger_details[id])
if ($scope.servers_trigger_details[id] == true) {
return false;
} else {
return true
return true;
}
};
$scope.updateView()
$scope.updateView();
});

32
html/admin/js/plugins.js

@ -1,12 +1,32 @@
// Avoid `console` errors in browsers that lack a console.
(function() {
(function () {
var method;
var noop = function () {};
var methods = [
'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn'
"assert",
"clear",
"count",
"debug",
"dir",
"dirxml",
"error",
"exception",
"group",
"groupCollapsed",
"groupEnd",
"info",
"log",
"markTimeline",
"profile",
"profileEnd",
"table",
"time",
"timeEnd",
"timeline",
"timelineEnd",
"timeStamp",
"trace",
"warn"
];
var length = methods.length;
var console = (window.console = window.console || {});
@ -19,6 +39,6 @@
console[method] = noop;
}
}
}());
})();
// Place any jQuery/helper plugins in here.

145
html/admin/js/vendor/filter.js

@ -1,59 +1,67 @@
// ### filter.js >>
angular
.module('angular-duration-format.filter', [ ])
.filter('duration', function() {
angular.module("angular-duration-format.filter", []).filter("duration", function () {
var DURATION_FORMATS_SPLIT = /((?:[^ydhms']+)|(?:'(?:[^']|'')*')|(?:y+|d+|h+|m+|s+))(.*)/;
var DURATION_FORMATS = {
y: { // years
y: {
// years
// "longer" years are not supported
value: 365 * 24 * 60 * 60 * 1000,
value: 365 * 24 * 60 * 60 * 1000
},
yy: {
value: 'y',
pad: 2,
value: "y",
pad: 2
},
d: { // days
value: 24 * 60 * 60 * 1000,
d: {
// days
value: 24 * 60 * 60 * 1000
},
dd: {
value: 'd',
pad: 2,
value: "d",
pad: 2
},
h: { // hours
value: 60 * 60 * 1000,
h: {
// hours
value: 60 * 60 * 1000
},
hh: { // padded hours
value: 'h',
pad: 2,
hh: {
// padded hours
value: "h",
pad: 2
},
m: { // minutes
value: 60 * 1000,
m: {
// minutes
value: 60 * 1000
},
mm: { // padded minutes
value: 'm',
pad: 2,
mm: {
// padded minutes
value: "m",
pad: 2
},
s: { // seconds
value: 1000,
s: {
// seconds
value: 1000
},
ss: { // padded seconds
value: 's',
pad: 2,
ss: {
// padded seconds
value: "s",
pad: 2
},
sss: { // milliseconds
value: 1,
},
ssss: { // padded milliseconds
value: 'sss',
pad: 4,
sss: {
// milliseconds
value: 1
},
ssss: {
// padded milliseconds
value: "sss",
pad: 4
}
};
function _parseFormat(string) {
// @inspiration AngularJS date filter
var parts = [];
var format = string ? string.toString() : '';
var format = string ? string.toString() : "";
while (format) {
var match = DURATION_FORMATS_SPLIT.exec(format);
@ -73,42 +81,59 @@ angular
}
function _formatDuration(timestamp, format) {
var text = '';
var values = { };
var text = "";
var values = {};
format.filter(function(format) { // filter only value parts of format
format
.filter(function (format) {
// filter only value parts of format
return DURATION_FORMATS.hasOwnProperty(format);
}).map(function(format) { // get formats with values only
})
.map(function (format) {
// get formats with values only
var config = DURATION_FORMATS[format];
if (config.hasOwnProperty('pad')) {
if (config.hasOwnProperty("pad")) {
return config.value;
} else {
return format;
}
}).filter(function(format, index, arr) { // remove duplicates
return (arr.indexOf(format) === index);
}).map(function(format) { // get format configurations with values
return angular.extend({
name: format,
}, DURATION_FORMATS[format]);
}).sort(function(a, b) { // sort formats descending by value
})
.filter(function (format, index, arr) {
// remove duplicates
return arr.indexOf(format) === index;
})
.map(function (format) {
// get format configurations with values
return angular.extend(
{
name: format
},
DURATION_FORMATS[format]
);
})
.sort(function (a, b) {
// sort formats descending by value
return b.value - a.value;
}).forEach(function(format) { // create values for format parts
var value = values[format.name] = Math.floor(timestamp / format.value);
})
.forEach(function (format) {
// create values for format parts
var value = (values[format.name] = Math.floor(timestamp / format.value));
timestamp = timestamp - (value * format.value);
timestamp = timestamp - value * format.value;
});
format.forEach(function(part) {
format.forEach(function (part) {
var format = DURATION_FORMATS[part];
if (format) {
var value = values[format.value];
text += (format.hasOwnProperty('pad') ? _padNumber(value, Math.max(format.pad, value.toString().length)) : values[part]);
text += format.hasOwnProperty("pad")
? _padNumber(value, Math.max(format.pad, value.toString().length))
: values[part];
} else {
text += part.replace(/(^'|'$)/g, '').replace(/''/g, '\'');
text += part.replace(/(^'|'$)/g, "").replace(/''/g, "'");
}
});
@ -116,33 +141,25 @@ angular
}
function _padNumber(number, len) {
return ((new Array(len + 1)).join('0') + number).slice(-len);
return (new Array(len + 1).join("0") + number).slice(-len);
}
return function(value, format) {
return function (value, format) {
var parsedValue = parseFloat(value, 10);
var parsedFormat = _parseFormat(format);
if (isNaN(parsedValue) || (parsedFormat.length === 0)) {
if (isNaN(parsedValue) || parsedFormat.length === 0) {
return value;
} else {
return _formatDuration(parsedValue, parsedFormat);
}
};
});
});
// ### << filter.js
// ### main.js >>
angular
.module('angular-duration-format', [
'angular-duration-format.filter',
]);
angular.module("angular-duration-format", ["angular-duration-format.filter"]);
// ### << main.js

35
html/admin/partials/servers.html

@ -9,10 +9,15 @@
<form class="form-inline pull-right">
<div class="form-group">
<label for="search">Search:</label>
<input type="text" class="form-control" id="search" data-ng-model="servers_search">
<input type="text" class="form-control" id="search" data-ng-model="servers_search" />
</div>
<button type="button" title="Refresh" class="btn btn-default" aria-label="Refresh">
<span class="glyphicon glyphicon-refresh" title="Refresh" aria-hidden="false" ng-click="updateView()"></span>
<span
class="glyphicon glyphicon-refresh"
title="Refresh"
aria-hidden="false"
ng-click="updateView()"
></span>
</button>
</form>
</div>
@ -30,8 +35,9 @@
<th width="5%">Duration</th>
<th width="5%">State</th>
<th width="5%">Idle</th>
<th width="1%"><center><span class="glyphicon glyphicon-option-vertical" aria-hidden="true"></span></center></th>
<th width="1%">
<center><span class="glyphicon glyphicon-option-vertical" aria-hidden="true"></span></center>
</th>
<tr ng-repeat="s in servers | filter:servers_search | orderBy:'server_id'">
<td>{{ s.server_id }}</td>
@ -68,22 +74,25 @@
<td>{{ s.server_state }}</td>
<td>{{ s.idle | hfcduration }}</td>
<td>
<span class="glyphicon glyphicon-zoom-in" title="Detail" aria-hidden="false" ng-click="triggerDetail(s.server_id)"></span>
<span
class="glyphicon glyphicon-zoom-in"
title="Detail"
aria-hidden="false"
ng-click="triggerDetail(s.server_id)"
></span>
<div ng-hide="checkDetail(s.server_id)">
&nbsp
<div ng-repeat="d in s.domains | orderBy:'domain_name'">
<span class="glyphicon glyphicon-zoom-in" title="Detail" aria-hidden="false" ng-click="triggerDetail(s.server_id+d.domain_name)"></span>
<span
class="glyphicon glyphicon-zoom-in"
title="Detail"
aria-hidden="false"
ng-click="triggerDetail(s.server_id+d.domain_name)"
></span>
</div>
</div>
</td>
</tr>
</table>
</div>
</div>

32
html/admin/partials/status.html

@ -9,10 +9,15 @@
<form class="form-inline pull-right">
<div class="form-group">
<label for="search">Search:</label>
<input type="text" class="form-control" id="search" data-ng-model="servers_search">
<input type="text" class="form-control" id="search" data-ng-model="servers_search" />
</div>
<button type="button" title="Refresh" class="btn btn-default" aria-label="Refresh">
<span class="glyphicon glyphicon-refresh" title="Refresh" aria-hidden="false" ng-click="updateView()"></span>
<span
class="glyphicon glyphicon-refresh"
title="Refresh"
aria-hidden="false"
ng-click="updateView()"
></span>
</button>
</form>
</div>
@ -21,26 +26,27 @@
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-4"> </div>
<div class="col-md-4"></div>
<div class="col-md-8">Server Name: {{ status.name }} (Uptime: {{ status.uptime | hfcduration }}</div>
</div>
<div class="row">
<div class="col-md-4"> </div>
<div class="col-md-8">Administrative Domain: {{ status.admin_domain }} </div>
<div class="col-md-4"></div>
<div class="col-md-8">Administrative Domain: {{ status.admin_domain }}</div>
</div>
<div class="row">
<div class="col-md-4"> </div>
<div class="col-md-8">Server Domain: {{ status.wss_domain }} </div>
<div class="col-md-4"></div>
<div class="col-md-8">Server Domain: {{ status.wss_domain }}</div>
</div>
<div class="row">
<div class="col-md-4"> </div>
<div class="col-md-8">Default LB Method: {{ status.loadbalance_default_method }} </div>
<div class="col-md-4"></div>
<div class="col-md-8">Default LB Method: {{ status.loadbalance_default_method }}</div>
</div>
<div class="row">
<div class="col-md-4"> </div>
<div class="col-md-8">Deadtime: dwell:{{ status.dead_time.dwell}} idle:{{ status.dead_time.idle}} cancel:{{ status.dead_time.cancel_check}}</div>
<div class="col-md-4"></div>
<div class="col-md-8">
Deadtime: dwell:{{ status.dead_time.dwell}} idle:{{ status.dead_time.idle}} cancel:{{
status.dead_time.cancel_check}}
</div>
</div>
</div>
</div>

4
rvpn-docker/README.md

@ -10,6 +10,7 @@ docker-compose version 1.11.2, build dfed245
hcamacho@Hanks-MBP:rvpn-docker $ docker --version
Docker version 17.03.0-ce, build 60ccb22
```
- checkout code into gopath
```bash
@ -87,6 +88,3 @@ rvpn_1 | INFO: genericlistener: 2017/03/04 18:13:02.270281 connection.go:242: W
```
The line "Connection Registration Accepted indicates a client WSS registered, was authenticated and registered its domains with the RVPN

Loading…
Cancel
Save