rearrange a few things

This commit is contained in:
AJ ONeal 2018-11-01 02:19:07 -06:00
parent 34bcf79d98
commit 535c9732c6
3 changed files with 178 additions and 93 deletions

View File

@ -637,7 +637,7 @@ function handleApi(req, res) {
, active: !!myRemote , active: !!myRemote
, initialized: (state.config.relay && state.config.token && state.config.agreeTos) ? true : false , initialized: (state.config.relay && state.config.token && state.config.agreeTos) ? true : false
, connected: isConnected , connected: isConnected
, proctime: Math.round(process.uptime() * 1000) //, proctime: Math.round(process.uptime() * 1000)
, uptime: now - startTime , uptime: now - startTime
, runtime: isConnected && connectTimes.length && (now - connectTimes[0]) || 0 , runtime: isConnected && connectTimes.length && (now - connectTimes[0]) || 0
, reconnects: connectTimes.length , reconnects: connectTimes.length

View File

@ -115,74 +115,95 @@
</section> </section>
<section v-if="views.section.status"> <section v-if="views.section.status">
<button v-if="!status.enabled" v-on:click="enable">Enable Traffic</button>
<button v-if="status.enabled" v-on:click="disable">Disable Traffic</button>
<br>
<br>
http://localhost:{{ status.port }} http://localhost:{{ status.port }}
<br> <br>
<br> <br>
SSH: <section v-if="views.section.status_chooser">
<span v-if="status.ssh">{{ status.ssh }} <button v-on:click.prevent.stop="changeState('status/share')">Share Files &amp; Folders</button>
<button v-on:click="ssh(-1)">Disable SSH</button></span> <button v-on:click.prevent.stop="changeState('status/host')">Host a Website or Webapp</button>
<span v-if="!status.ssh"><input type="text" v-model="state.ssh" placeholder="22"> <button v-on:click.prevent.stop="changeState('status/access')">Remote Access via SSH</button>
<button v-on:click="ssh(state.ssh)">Enable SSH</button></span> </section>
<br>
<br>
Path Hosting: <section v-if="views.section.status_access">
<ul> SSH:
<li v-for="domain in status.pathHosting"> <span v-if="status.ssh">{{ status.ssh }}
{{ domain.name }} <button v-on:click="ssh(-1)">Disable SSH</button></span>
<input type="text" v-model="domain.path" v-bind:placeholder="domain.handler"> <span v-if="!status.ssh"><input type="text" v-model="state.ssh" placeholder="22">
<button <button v-on:click="ssh(state.ssh)">Enable SSH</button></span>
v-if="domain.handler == domain.path" <br>
v-on:click="changePathHost(domain, domain.path)">Save</button> <br>
<button v-on:click="deletePathHost(domain)">X</button> <div v-if="state.ssh_active">SSH is currently running</div>
</li> <div v-if="!state.ssh_active">SSH is not currently running</div>
</ul> <br>
<form v-on:submit="createHttp(newHttp.name, newHttp.handler)"> <div v-if="state.ssh_insecure">Password Authentication is NOT disabled.
<input v-model="newHttp.sub" type="text" placeholder="subdomain (ex: api)"> Please consider updating your <code>sshd_config</code> and restarting ssh.
<select v-model="newHttp.name"> <pre><code>{{ status }}</code></pre>
<option v-for="w in status.wildDomains" v-bind:value="w.name">{{ w.name }}</option> </div>
</select> <div v-if="!state.ssh_insecure">Key-Only Authentication is enabled :)</div>
<input v-model="newHttp.handler" type="text" placeholder="path (ex: ~/Public)" required> <br>
<button>Add</button> </section>
</form>
<br>
Port Forwarding: <section v-if="views.section.status_share">
<ul> Path Hosting:
<li v-for="domain in status.portForwards"> <ul>
{{ domain.name }} <li v-for="domain in status.pathHosting">
<input type="text" v-model="domain._port" v-bind:placeholder="domain.handler"> {{ domain.name }}
<button <input type="text" v-model="domain.path" v-bind:placeholder="domain.handler">
v-if="domain.handler == domain._port" <button
v-on:click="changePortForward(domain, domain._port)">Save</button> v-if="domain.handler == domain.path"
<button v-on:click="deletePortForward(domain)">X</button> v-on:click="changePathHost(domain, domain.path)">Save</button>
</li> <button v-on:click="deletePathHost(domain)">X</button>
</ul> </li>
<form v-on:submit="createHttp(newHttp.name, newHttp.handler)"> </ul>
<input v-model="newHttp.sub" type="text" placeholder="subdomain (ex: api)"> <form v-on:submit="createHttp(newHttp.name, newHttp.handler)">
<select v-model="newHttp.name"> <input v-model="newHttp.sub" type="text" placeholder="subdomain (ex: api)">
<option v-for="w in status.wildDomains" v-bind:value="w.name">{{ w.name }}</option> <select v-model="newHttp.name">
</select> <option v-for="w in status.wildDomains" v-bind:value="w.name">{{ w.name }}</option>
<input v-model="newHttp.handler" type="number" placeholder="port (ex: 3000)" required> </select>
<button>Add</button> <input v-model="newHttp.handler" type="text" placeholder="path (ex: ~/Public)" required>
</form> <button>Add</button>
</form>
<br>
</section>
<section v-if="views.section.status_host">
Port Forwarding:
<ul>
<li v-for="domain in status.portForwards">
{{ domain.name }}
<input type="text" v-model="domain._port" v-bind:placeholder="domain.handler">
<button
v-if="domain.handler == domain._port"
v-on:click="changePortForward(domain, domain._port)">Save</button>
<button v-on:click="deletePortForward(domain)">X</button>
</li>
</ul>
<form v-on:submit="createHttp(newHttp.name, newHttp.handler)">
<input v-model="newHttp.sub" type="text" placeholder="subdomain (ex: api)">
<select v-model="newHttp.name">
<option v-for="w in status.wildDomains" v-bind:value="w.name">{{ w.name }}</option>
</select>
<input v-model="newHttp.handler" type="number" placeholder="port (ex: 3000)" required>
<button>Add</button>
</form>
</section>
<br>
Proctime: {{ statusProctime }}
<br> <br>
Uptime: {{ statusUptime }} Uptime: {{ statusUptime }}
<br> <br>
Runtime: {{ statusRuntime }} Runtime: {{ statusRuntime }}
<br> <br>
Reconnects: {{ status.reconnects }} Reconnects: {{ status.reconnects }}
<details><summary><small>Advanced</small></summary>
<button v-if="!status.enabled" v-on:click="enable">Enable Traffic</button>
<button v-if="status.enabled" v-on:click="disable">Disable Traffic</button>
<br> <br>
<br>
<pre><code>{{ status }}</code></pre> <pre><code>{{ status }}</code></pre>
</details>
</section> </section>
</div> </div>

View File

@ -247,6 +247,7 @@ var appMethods = {
, deletePathHost: function (domain) { , deletePathHost: function (domain) {
api.http(domain.name, 'none'); api.http(domain.name, 'none');
} }
, changeState: changeState
}; };
var appStates = { var appStates = {
setup: function () { setup: function () {
@ -263,51 +264,113 @@ var appStates = {
clearInterval(tok); clearInterval(tok);
} }
function updateStatus() {
return api.status().then(function (status) {
if (status.error) {
appData.views.flash.error = status.error.message || JSON.stringify(status.error, null, 2);
}
var wilddomains = [];
var rootdomains = [];
var subdomains = [];
var directories = [];
var portforwards = [];
var free = [];
appData.status = status;
Object.keys(appData.status.servernames).forEach(function (k) {
var s = appData.status.servernames[k];
s.name = k;
if (s.wildcard) { wilddomains.push(s); }
if (!s.sub && !s.wildcard) { rootdomains.push(s); }
if (s.sub) { subdomains.push(s); }
if (s.handler) {
if (s.handler.toString() === parseInt(s.handler, 10).toString()) {
s._port = s.handler;
portforwards.push(s);
} else {
s.path = s.handler;
directories.push(s);
}
} else {
free.push(s);
}
});
appData.status.portForwards = portforwards;
appData.status.pathHosting = directories;
appData.status.wildDomains = wilddomains;
appData.newHttp.name = (appData.status.wildDomains[0] || {}).name;
appData.state.ssh = (appData.status.ssh > 0) && appData.status.ssh || undefined;
});
}
var tok = setInterval(updateStatus, 2000); var tok = setInterval(updateStatus, 2000);
return updateStatus().then(function () { return updateStatus().then(function () {
appData.views.section = { status: true }; appData.views.section = { status: true, status_chooser: true };
return exitState; return exitState;
}); });
} }
}; };
appStates.status.share = function () {
function exitState() {
clearInterval(tok);
}
var tok = setInterval(updateStatus, 2000);
appData.views.section = { status: true, status_share: true };
return updateStatus().then(function () {
return exitState;
});
};
appStates.status.host = function () {
function exitState() {
clearInterval(tok);
}
var tok = setInterval(updateStatus, 2000);
appData.views.section = { status: true, status_host: true };
return updateStatus().then(function () {
return exitState;
});
};
appStates.status.access = function () {
function exitState() {
clearInterval(tok);
}
var tok = setInterval(updateStatus, 2000);
appData.views.section = { status: true, status_access: true };
return updateStatus().then(function () {
return exitState;
});
};
function updateStatus() {
return api.status().then(function (status) {
if (status.error) {
appData.views.flash.error = status.error.message || JSON.stringify(status.error, null, 2);
}
var wilddomains = [];
var rootdomains = [];
var subdomains = [];
var directories = [];
var portforwards = [];
var free = [];
appData.status = status;
if ('maybe' === status.ssh_requests_password) {
appData.status.ssh_active = false;
} else {
appData.status.ssh_active = true;
if ('yes' === status.ssh_requests_password) {
appData.status.ssh_insecure = true;
}
}
if ('yes' === status.ssh_password_authentication) {
appData.status.ssh_insecure = true;
}
if ('yes' === status.ssh_permit_root_login) {
appData.status.ssh_insecure = true;
}
// only update what's changed
if (appData.state.ssh !== appData.status.ssh) {
appData.state.ssh = appData.status.ssh;
}
if (appData.state.ssh_insecure !== appData.status.ssh_insecure) {
appData.state.ssh_insecure = appData.status.ssh_insecure;
}
if (appData.state.ssh_active !== appData.status.ssh_active) {
appData.state.ssh_active = appData.status.ssh_active;
}
Object.keys(appData.status.servernames).forEach(function (k) {
var s = appData.status.servernames[k];
s.name = k;
if (s.wildcard) { wilddomains.push(s); }
if (!s.sub && !s.wildcard) { rootdomains.push(s); }
if (s.sub) { subdomains.push(s); }
if (s.handler) {
if (s.handler.toString() === parseInt(s.handler, 10).toString()) {
s._port = s.handler;
portforwards.push(s);
} else {
s.path = s.handler;
directories.push(s);
}
} else {
free.push(s);
}
});
appData.status.portForwards = portforwards;
appData.status.pathHosting = directories;
appData.status.wildDomains = wilddomains;
appData.newHttp.name = (appData.status.wildDomains[0] || {}).name;
appData.state.ssh = (appData.status.ssh > 0) && appData.status.ssh || undefined;
});
}
function changeState(newstate) { function changeState(newstate) {
var newhash = '#/' + newstate + '/'; var newhash = '#/' + newstate + '/';
@ -325,13 +388,14 @@ function setState(/*ev*/) {
//ev.oldURL //ev.oldURL
//ev.newURL //ev.newURL
if (appData.exit) { if (appData.exit) {
console.log('previous state exiting');
appData.exit.then(function (exit) { appData.exit.then(function (exit) {
if ('function' === typeof appData.exit) { if ('function' === typeof appData.exit) {
exit(); exit();
} }
}); });
} }
var parts = location.hash.substr(1).replace(/^\//, '').replace(/\/$/, '').split('/'); var parts = location.hash.substr(1).replace(/^\//, '').replace(/\/$/, '').split('/').filter(Boolean);
var fn = appStates; var fn = appStates;
parts.forEach(function (s) { parts.forEach(function (s) {
console.log("state:", s); console.log("state:", s);