mirror of
				https://git.coolaj86.com/coolaj86/telebit.js.git
				synced 2025-11-03 10:12:46 +00:00 
			
		
		
		
	updates to status page
This commit is contained in:
		
							parent
							
								
									c5e7811028
								
							
						
					
					
						commit
						ce20b058e6
					
				@ -27,6 +27,7 @@ var snakeCopy = recase.snakeCopy.bind(recase);
 | 
			
		||||
var TPLS = TOML.parse(fs.readFileSync(path.join(__dirname, "../lib/en-us.toml"), 'utf8'));
 | 
			
		||||
var startTime = Date.now();
 | 
			
		||||
var connectTimes = [];
 | 
			
		||||
var isConnected = false;
 | 
			
		||||
 | 
			
		||||
var TelebitRemote = require('../lib/daemon/index.js').TelebitRemote;
 | 
			
		||||
 | 
			
		||||
@ -628,17 +629,17 @@ function handleApi(req, res) {
 | 
			
		||||
    res.setHeader('Content-Type', 'application/json');
 | 
			
		||||
    res.end(JSON.stringify(
 | 
			
		||||
      { module: 'status'
 | 
			
		||||
      , port: (state.config.ipc && state.config.ipc.port || state._ipc.port || undefined)
 | 
			
		||||
      , status: (state.config.disable ? 'disabled' : 'enabled')
 | 
			
		||||
      , ready: ((state.config.relay && (state.config.token || state.config.agreeTos)) ? true : false)
 | 
			
		||||
      , active: !!myRemote
 | 
			
		||||
      , connected: 'maybe (todo)'
 | 
			
		||||
      , version: pkg.version
 | 
			
		||||
      , servernames: state.servernames
 | 
			
		||||
      , port: (state.config.ipc && state.config.ipc.port || state._ipc.port || undefined)
 | 
			
		||||
      , enabled: !state.config.disable
 | 
			
		||||
      , active: !!myRemote
 | 
			
		||||
      , initialized: (state.config.relay && state.config.token && state.config.agreeTos) ? true : false
 | 
			
		||||
      , connected: isConnected
 | 
			
		||||
      , proctime: Math.round(process.uptime() * 1000)
 | 
			
		||||
      , uptime: now - startTime
 | 
			
		||||
      , runtime: connectTimes.length && (now - connectTimes[0]) || 0
 | 
			
		||||
      , runtime: isConnected && connectTimes.length && (now - connectTimes[0]) || 0
 | 
			
		||||
      , reconnects: connectTimes.length
 | 
			
		||||
      , servernames: state.servernames
 | 
			
		||||
      }
 | 
			
		||||
    ));
 | 
			
		||||
  }
 | 
			
		||||
@ -707,7 +708,8 @@ function handleApi(req, res) {
 | 
			
		||||
    res.end(JSON.stringify({"error":{"message":"unrecognized rpc"}}));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!req.headers['content-length'] && !req.headers['content-type']) {
 | 
			
		||||
  var hasLength = req.headers['content-length'] > 0;
 | 
			
		||||
  if (!hasLength && !req.headers['content-type']) {
 | 
			
		||||
    route();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
@ -1042,6 +1044,7 @@ function rawStartTelebitRemote(keepAlive) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function onConnect() {
 | 
			
		||||
          isConnected = true;
 | 
			
		||||
          connectTimes.unshift(Date.now());
 | 
			
		||||
          console.info('[connect] relay established');
 | 
			
		||||
          myRemote.removeListener('error', onConnectError);
 | 
			
		||||
@ -1060,6 +1063,7 @@ function rawStartTelebitRemote(keepAlive) {
 | 
			
		||||
 | 
			
		||||
        function onConnectError(err) {
 | 
			
		||||
          myRemote = null;
 | 
			
		||||
          isConnected = false;
 | 
			
		||||
          if (handleError(err, 'onConnectError')) {
 | 
			
		||||
            if (!keepAlive.state) {
 | 
			
		||||
              reject(err);
 | 
			
		||||
@ -1075,6 +1079,7 @@ function rawStartTelebitRemote(keepAlive) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function retryLoop() {
 | 
			
		||||
          isConnected = false;
 | 
			
		||||
          console.warn('[Warn] disconnected. Will retry?', keepAlive.state);
 | 
			
		||||
          if (keepAlive.state) {
 | 
			
		||||
            safeReload(10 * 1000).then(resolve).catch(reject);
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
  <script>document.body.hidden = true;</script>
 | 
			
		||||
 | 
			
		||||
  <div class="v-app">
 | 
			
		||||
    <h1>Telebit (Remote) Setup</h1>
 | 
			
		||||
    <h1>Telebit (Remote) Setup v{{ config.version }}</h1>
 | 
			
		||||
 | 
			
		||||
    <section v-if="views.flash.error">
 | 
			
		||||
      {{ views.flash.error }}
 | 
			
		||||
@ -115,6 +115,19 @@
 | 
			
		||||
    </section>
 | 
			
		||||
 | 
			
		||||
    <section v-if="views.section.status">
 | 
			
		||||
      <button v-if="!status.enabled" v-on:click="enable">Enable</button>
 | 
			
		||||
      <button v-if="status.enabled" v-on:click="disable">Disable</button>
 | 
			
		||||
      <br>
 | 
			
		||||
      http://localhost:{{ status.port }}
 | 
			
		||||
      <br>
 | 
			
		||||
      Proctime: {{ statusProctime }}
 | 
			
		||||
      <br>
 | 
			
		||||
      Uptime: {{ statusUptime }}
 | 
			
		||||
      <br>
 | 
			
		||||
      Runtime: {{ statusRuntime }}
 | 
			
		||||
      <br>
 | 
			
		||||
      Reconnects: {{ status.reconnects }}
 | 
			
		||||
      <br>
 | 
			
		||||
      <pre><code>{{ status }}</code></pre>
 | 
			
		||||
    </section>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -37,14 +37,26 @@ api.status = function apiStatus() {
 | 
			
		||||
    return json;
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
api.initialize = function apiInitialize() {
 | 
			
		||||
api.enable = function apiEnable() {
 | 
			
		||||
  var opts = {
 | 
			
		||||
    url: "/api/xxinitxx"
 | 
			
		||||
    url: "/api/enable"
 | 
			
		||||
  , method: "POST"
 | 
			
		||||
  , headers: {
 | 
			
		||||
      'Content-Type': 'application/json'
 | 
			
		||||
    }
 | 
			
		||||
  , body: JSON.stringify(telebitState.config)
 | 
			
		||||
  //, headers: { 'Content-Type': 'application/json' }
 | 
			
		||||
  };
 | 
			
		||||
  return Telebit.reqLocalAsync(opts).then(function (resp) {
 | 
			
		||||
    var json = resp.body;
 | 
			
		||||
    appData.initResult = json;
 | 
			
		||||
    window.alert("Error: [success] " + JSON.stringify(json, null, 2));
 | 
			
		||||
    return json;
 | 
			
		||||
  }).catch(function (err) {
 | 
			
		||||
    window.alert("Error: [init] " + (err.message || JSON.stringify(err, null, 2)));
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
api.disable = function apiDisable() {
 | 
			
		||||
  var opts = {
 | 
			
		||||
    url: "/api/disable"
 | 
			
		||||
  , method: "POST"
 | 
			
		||||
  //, headers: { 'Content-Type': 'application/json' }
 | 
			
		||||
  };
 | 
			
		||||
  return Telebit.reqLocalAsync(opts).then(function (resp) {
 | 
			
		||||
    var json = resp.body;
 | 
			
		||||
@ -107,8 +119,8 @@ var TELEBIT_RELAYS = [
 | 
			
		||||
var PRODUCTION_ACME = 'https://acme-v02.api.letsencrypt.org/directory';
 | 
			
		||||
var STAGING_ACME = 'https://acme-staging-v02.api.letsencrypt.org/directory';
 | 
			
		||||
var appData = {
 | 
			
		||||
  config: null
 | 
			
		||||
, status: null
 | 
			
		||||
  config: {}
 | 
			
		||||
, status: {}
 | 
			
		||||
, init: {
 | 
			
		||||
    teletos: true
 | 
			
		||||
  , letos: true
 | 
			
		||||
@ -181,11 +193,11 @@ var appMethods = {
 | 
			
		||||
, betaRelay: function () {
 | 
			
		||||
    appData.init.relay = BETA_RELAY;
 | 
			
		||||
  }
 | 
			
		||||
, defaultRhubarb: function () {
 | 
			
		||||
    appData.init.rhubarb = DEFAULT_RELAY;
 | 
			
		||||
, enable: function () {
 | 
			
		||||
    api.enable();
 | 
			
		||||
  }
 | 
			
		||||
, betaRhubarb: function () {
 | 
			
		||||
    appData.init.rhubarb = BETA_RELAY;
 | 
			
		||||
, disable: function () {
 | 
			
		||||
    api.disable();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
var appStates = {
 | 
			
		||||
@ -200,9 +212,15 @@ var appStates = {
 | 
			
		||||
  }
 | 
			
		||||
, status: function () {
 | 
			
		||||
    appData.views.section = { status: true };
 | 
			
		||||
    return api.status().then(function (status) {
 | 
			
		||||
      appData.status = status;
 | 
			
		||||
    });
 | 
			
		||||
    var tok = setInterval(function () {
 | 
			
		||||
      api.status().then(function (status) {
 | 
			
		||||
        appData.status = status;
 | 
			
		||||
      });
 | 
			
		||||
    }, 2000);
 | 
			
		||||
 | 
			
		||||
    return function cancelState() {
 | 
			
		||||
      clearInterval(tok);
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -216,23 +234,72 @@ function changeState(newstate) {
 | 
			
		||||
  }
 | 
			
		||||
  location.hash = newhash;
 | 
			
		||||
}
 | 
			
		||||
/*globals Promise*/
 | 
			
		||||
window.addEventListener('hashchange', setState, false);
 | 
			
		||||
function setState(/*ev*/) {
 | 
			
		||||
  //ev.oldURL
 | 
			
		||||
  //ev.newURL
 | 
			
		||||
  if (appData.exit) {
 | 
			
		||||
    appData.exit.then(function (exit) {
 | 
			
		||||
      if ('function' === typeof appData.exit) {
 | 
			
		||||
        exit();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  var parts = location.hash.substr(1).replace(/^\//, '').replace(/\/$/, '').split('/');
 | 
			
		||||
  var fn = appStates;
 | 
			
		||||
  parts.forEach(function (s) {
 | 
			
		||||
    console.log("state:", s);
 | 
			
		||||
    fn = fn[s];
 | 
			
		||||
  });
 | 
			
		||||
  fn();
 | 
			
		||||
  appData.exit = Promise.resolve(fn());
 | 
			
		||||
  //appMethods.states[newstate]();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function msToHumanReadable(ms) {
 | 
			
		||||
  var uptime = ms;
 | 
			
		||||
  var uptimed = uptime / 1000;
 | 
			
		||||
  var minute = 60;
 | 
			
		||||
  var hour = 60 * minute;
 | 
			
		||||
  var day = 24 * hour;
 | 
			
		||||
  var days = 0;
 | 
			
		||||
  var times = [];
 | 
			
		||||
  while (uptimed > day) {
 | 
			
		||||
    uptimed -= day;
 | 
			
		||||
    days += 1;
 | 
			
		||||
  }
 | 
			
		||||
  times.push(days + " days ");
 | 
			
		||||
  var hours = 0;
 | 
			
		||||
  while (uptimed > hour) {
 | 
			
		||||
    uptimed -= hour;
 | 
			
		||||
    hours += 1;
 | 
			
		||||
  }
 | 
			
		||||
  times.push(hours.toString().padStart(2, "0") + " h ");
 | 
			
		||||
  var minutes = 0;
 | 
			
		||||
  while (uptimed > minute) {
 | 
			
		||||
    uptimed -= minute;
 | 
			
		||||
    minutes += 1;
 | 
			
		||||
  }
 | 
			
		||||
  times.push(minutes.toString().padStart(2, "0") + " m ");
 | 
			
		||||
  var seconds = Math.round(uptimed);
 | 
			
		||||
  times.push(seconds.toString().padStart(2, "0") + " s ");
 | 
			
		||||
  return times.join('');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
new Vue({
 | 
			
		||||
  el: ".v-app"
 | 
			
		||||
, data: appData
 | 
			
		||||
, computed: {
 | 
			
		||||
    statusProctime: function () {
 | 
			
		||||
      return msToHumanReadable(this.status.proctime);
 | 
			
		||||
    }
 | 
			
		||||
  , statusRuntime: function () {
 | 
			
		||||
      return msToHumanReadable(this.status.runtime);
 | 
			
		||||
    }
 | 
			
		||||
  , statusUptime: function () {
 | 
			
		||||
      return msToHumanReadable(this.status.uptime);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
, methods: appMethods
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user