Add a repl to improve debugging on the prod server

pull/1/head
Caleb James DeLisle 7 years ago
parent 89ab37f1bf
commit cac5e75a99

@ -313,4 +313,12 @@ module.exports = {
// '/etc/apache2/ssl/my_public_cert.crt', // '/etc/apache2/ssl/my_public_cert.crt',
// '/etc/apache2/ssl/my_certificate_authorities_cert_chain.ca' // '/etc/apache2/ssl/my_certificate_authorities_cert_chain.ca'
//], //],
/* You can get a repl for debugging the server if you want it.
* to enable this, specify the debugReplName and then you can
* connect to it with `nc -U /tmp/repl/<your name>.sock`
* If you run multiple cryptpad servers, you need to use different
* repl names.
*/
//debugReplName: "cryptpad"
}; };

@ -7,6 +7,7 @@
"express": "~4.10.1", "express": "~4.10.1",
"nthen": "~0.1.0", "nthen": "~0.1.0",
"pull-stream": "^3.6.1", "pull-stream": "^3.6.1",
"replify": "^1.2.0",
"saferphore": "0.0.1", "saferphore": "0.0.1",
"stream-to-pull-stream": "^1.7.2", "stream-to-pull-stream": "^1.7.2",
"tweetnacl": "~0.12.2", "tweetnacl": "~0.12.2",

@ -395,8 +395,7 @@ var getHash = function (Env, publicKey, cb) {
// The limits object contains storage limits for all the publicKey that have paid // The limits object contains storage limits for all the publicKey that have paid
// To each key is associated an object containing the 'limit' value and a 'note' explaining that limit // To each key is associated an object containing the 'limit' value and a 'note' explaining that limit
var limits = {}; var updateLimits = function (Env, config, publicKey, cb /*:(?string, ?any[])=>void*/) {
var updateLimits = function (config, publicKey, cb /*:(?string, ?any[])=>void*/) {
if (config.adminEmail === false) { if (config.adminEmail === false) {
if (config.allowSubscriptions === false) { return; } if (config.allowSubscriptions === false) { return; }
throw new Error("allowSubscriptions must be false if adminEmail is false"); throw new Error("allowSubscriptions must be false if adminEmail is false");
@ -461,15 +460,15 @@ var updateLimits = function (config, publicKey, cb /*:(?string, ?any[])=>void*/)
response.on('end', function () { response.on('end', function () {
try { try {
var json = JSON.parse(str); var json = JSON.parse(str);
limits = json; Env.limits = json;
Object.keys(customLimits).forEach(function (k) { Object.keys(customLimits).forEach(function (k) {
if (!isLimit(customLimits[k])) { return; } if (!isLimit(customLimits[k])) { return; }
limits[k] = customLimits[k]; Env.limits[k] = customLimits[k];
}); });
var l; var l;
if (userId) { if (userId) {
var limit = limits[userId]; var limit = Env.limits[userId];
l = limit && typeof limit.limit === "number" ? l = limit && typeof limit.limit === "number" ?
[limit.limit, limit.plan, limit.note] : [defaultLimit, '', '']; [limit.limit, limit.plan, limit.note] : [defaultLimit, '', ''];
} }
@ -490,7 +489,7 @@ var updateLimits = function (config, publicKey, cb /*:(?string, ?any[])=>void*/)
var getLimit = function (Env, publicKey, cb) { var getLimit = function (Env, publicKey, cb) {
var unescapedKey = unescapeKeyCharacters(publicKey); var unescapedKey = unescapeKeyCharacters(publicKey);
var limit = limits[unescapedKey]; var limit = Env.limits[unescapedKey];
var defaultLimit = typeof(Env.defaultStorageLimit) === 'number'? var defaultLimit = typeof(Env.defaultStorageLimit) === 'number'?
Env.defaultStorageLimit: DEFAULT_LIMIT; Env.defaultStorageLimit: DEFAULT_LIMIT;
@ -1063,7 +1062,11 @@ type NetfluxWebsocketSrvContext_t = {
)=>void )=>void
}; };
*/ */
RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/) { RPC.create = function (
config /*:Config_t*/,
debuggable /*:<T>(string, T)=>T*/,
cb /*:(?Error, ?Function)=>void*/
) {
// load pin-store... // load pin-store...
console.log('loading rpc module...'); console.log('loading rpc module...');
@ -1081,8 +1084,10 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
msgStore: (undefined /*:any*/), msgStore: (undefined /*:any*/),
pinStore: (undefined /*:any*/), pinStore: (undefined /*:any*/),
pinnedPads: {}, pinnedPads: {},
evPinnedPadsReady: mkEvent(true) evPinnedPadsReady: mkEvent(true),
limits: {}
}; };
debuggable('rpc_env', Env);
var Sessions = Env.Sessions; var Sessions = Env.Sessions;
var paths = Env.paths; var paths = Env.paths;
@ -1264,7 +1269,7 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
Respond(e, size); Respond(e, size);
}); });
case 'UPDATE_LIMITS': case 'UPDATE_LIMITS':
return void updateLimits(config, safeKey, function (e, limit) { return void updateLimits(Env, config, safeKey, function (e, limit) {
if (e) { if (e) {
WARN(e, limit); WARN(e, limit);
return void Respond(e); return void Respond(e);
@ -1376,7 +1381,7 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
}; };
var updateLimitDaily = function () { var updateLimitDaily = function () {
updateLimits(config, undefined, function (e) { updateLimits(Env, config, undefined, function (e) {
if (e) { if (e) {
WARN('limitUpdate', e); WARN('limitUpdate', e);
} }

@ -20,10 +20,25 @@ try {
var websocketPort = config.websocketPort || config.httpPort; var websocketPort = config.websocketPort || config.httpPort;
var useSecureWebsockets = config.useSecureWebsockets || false; var useSecureWebsockets = config.useSecureWebsockets || false;
// This is stuff which will become available to replify
const debuggableStore = new WeakMap();
const debuggable = function (name, x) {
if (name in debuggableStore) {
try { throw new Error(); } catch (e) {
console.error('cannot add ' + name + ' more than once [' + e.stack + ']');
}
} else {
debuggableStore[name] = x;
}
return x;
};
debuggable('global', global);
debuggable('config', config);
// support multiple storage back ends // support multiple storage back ends
var Storage = require(config.storage||'./storage/file'); var Storage = require(config.storage||'./storage/file');
var app = Express(); var app = debuggable('app', Express());
var httpsOpts; var httpsOpts;
@ -217,7 +232,7 @@ var loadRPC = function (cb) {
if (typeof(config.rpc) === 'string') { if (typeof(config.rpc) === 'string') {
// load pin store... // load pin store...
var Rpc = require(config.rpc); var Rpc = require(config.rpc);
Rpc.create(config, function (e, rpc) { Rpc.create(config, debuggable, function (e, rpc) {
if (e) { throw e; } if (e) { throw e; }
cb(void 0, rpc); cb(void 0, rpc);
}); });
@ -227,3 +242,7 @@ var loadRPC = function (cb) {
}; };
loadRPC(createSocketServer); loadRPC(createSocketServer);
if (config.debugReplName) {
require('replify')({ name: config.debugReplName, app: debuggableStore });
}
Loading…
Cancel
Save