forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var cluster = require('cluster');
 | |
| var PromiseA = require('bluebird');
 | |
| var memstore;
 | |
| var sqlstore;
 | |
| var config;
 | |
| // TODO
 | |
| // var rootMasterKey;
 | |
| 
 | |
| function updateIps() {
 | |
|   console.log('[UPDATE IP]');
 | |
|   var allMap = {};
 | |
|   var hostnames = config.redirects.reduce(function (all, redirect) {
 | |
|     if (redirect.ip && !allMap[redirect.id]) {
 | |
|       allMap[redirect.id] = true;
 | |
|       all.push(redirect.id);
 | |
|     }
 | |
| 
 | |
|     return all;
 | |
|   }, []);
 | |
| 
 | |
|   require('./ddns-updater').update(
 | |
|     config.ddns.services
 | |
|   , hostnames
 | |
|   , config.ddns.token
 | |
|   ).then(function (results) {
 | |
|     results.forEach(function (result) {
 | |
|       if (result.error) {
 | |
|         console.error(result);
 | |
|       } else {
 | |
|         console.log('[SUCCESS]', result.service.hostname);
 | |
|       }
 | |
|     });
 | |
|   }).error(function (err) {
 | |
|     console.error('[UPDATE IP] ERROR');
 | |
|     console.error(err);
 | |
|   });
 | |
| }
 | |
| 
 | |
| function init(conf/*, state*/) {
 | |
|   config = conf;
 | |
|   if (!conf.ipcKey) {
 | |
|     conf.ipcKey = require('crypto').randomBytes(16).toString('base64');
 | |
|   }
 | |
|   if (!conf.sqlite3Sock) {
 | |
|     conf.sqlite3Sock = '/tmp/sqlite3.' + require('crypto').randomBytes(4).toString('hex') + '.sock';
 | |
|   }
 | |
|   if (!conf.memstoreSock) {
 | |
|     conf.memstoreSock = '/tmp/memstore.' + require('crypto').randomBytes(4).toString('hex') + '.sock';
 | |
|   }
 | |
| 
 | |
|   try {
 | |
|     require('fs').unlinkSync(conf.memstoreSock);
 | |
|   } catch(e) {
 | |
|     if ('ENOENT' !== e.code) {
 | |
|       console.error(e.stack);
 | |
|       console.error(JSON.stringify(e));
 | |
|     }
 | |
|     // ignore
 | |
|   }
 | |
|   try {
 | |
|     require('fs').unlinkSync(conf.sqlite3Sock);
 | |
|   } catch(e) {
 | |
|     if ('ENOENT' !== e.code) {
 | |
|       console.error(e.stack);
 | |
|       console.error(JSON.stringify(e));
 | |
|     }
 | |
|     // ignore
 | |
|   }
 | |
| 
 | |
|   var cstore = require('cluster-store');
 | |
|   var sqlite3 = require('sqlite3-cluster/server');
 | |
|   var promise = PromiseA.all([
 | |
|     cstore.create({
 | |
|       sock: conf.memstoreSock
 | |
|     , serve: cluster.isMaster && conf.memstoreSock
 | |
|     , store: cluster.isMaster && null //new require('express-session/session/memory')()
 | |
|       // TODO implement
 | |
|     , key: conf.ipcKey
 | |
|     }).then(function (_memstore) {
 | |
|       memstore = _memstore;
 | |
|       return memstore;
 | |
|     })
 | |
|   , sqlite3.createServer({
 | |
|       verbose: null
 | |
|     , sock: conf.sqlite3Sock
 | |
|     , ipcKey: conf.ipcKey
 | |
|     }).then(function (_sqlstore) {
 | |
|       sqlstore = _sqlstore;
 | |
|       return sqlstore;
 | |
|     })
 | |
|   ]).then(function (/*args*/) {
 | |
|     return conf;
 | |
|     /*
 | |
|     {
 | |
|       conf: conf
 | |
|     , memstore: memstore // args[0]
 | |
|     , sqlstore: sqlstore // args[1]
 | |
|     };
 | |
|     */
 | |
|   });
 | |
| 
 | |
|   // TODO check the IP every 5 minutes and update it every hour
 | |
|   setInterval(updateIps, 60 * 60 * 1000);
 | |
|   // we don't want this to load right away (extra procesing time)
 | |
|   setTimeout(updateIps, 1);
 | |
| 
 | |
|   return promise;
 | |
| }
 | |
| 
 | |
| function touch(conf, state) {
 | |
|   if (!state.initialize) {
 | |
|     state.initialize = init(conf, state);
 | |
|   }
 | |
| 
 | |
|   // TODO if no xyz worker, start on xyz worker (unlock, for example)
 | |
|   return state.initialize.then(function () {
 | |
|     // TODO conf.locked = true|false;
 | |
|     conf.initialized = true;
 | |
|     return conf;
 | |
|   });
 | |
| 
 | |
|   /*
 | |
|   setInterval(function () {
 | |
|     console.log('SIGUSR1 to caddy');
 | |
|     return caddy.update(caddyConf);
 | |
|   }, 10 * 60 * 1000);
 | |
|   */
 | |
| }
 | |
| 
 | |
| module.exports.init = init;
 | |
| module.exports.touch = touch;
 |