bin/repairPad.js: conversion to promise/async

- but see also github issue #3545
This commit is contained in:
Ray Bellis 2019-01-30 10:47:50 +00:00
parent 58d0e6cea4
commit c499a08030

View file

@ -1,106 +1,78 @@
/* /*
This is a repair tool. It extracts all datas of a pad, removes and inserts them again. * This is a repair tool. It extracts all datas of a pad, removes and inserts them again.
*/ */
console.warn("WARNING: This script must not be used while etherpad is running!"); console.warn("WARNING: This script must not be used while etherpad is running!");
if(process.argv.length != 3) if (process.argv.length != 3) {
{
console.error("Use: node bin/repairPad.js $PADID"); console.error("Use: node bin/repairPad.js $PADID");
process.exit(1); process.exit(1);
} }
//get the padID
// get the padID
var padId = process.argv[2]; var padId = process.argv[2];
var db, padManager, pad, settings; let npm = require("../src/node_modules/npm");
var neededDBValues = ["pad:"+padId]; npm.load({}, async function(er) {
if (er) {
console.error("Could not load NPM: " + er)
process.exit(1);
}
var npm = require("../src/node_modules/npm"); try {
var async = require("../src/node_modules/async"); // intialize database
let settings = require('../src/node/utils/Settings');
let db = require('../src/node/db/DB');
await db.init();
async.series([ // get the pad
// load npm let padManager = require('../src/node/db/PadManager');
function(callback) { let pad = await padManager.getPad(padId);
npm.load({}, function(er) {
if(er) // accumulate the required keys
{ let neededDBValues = ["pad:" + padId];
console.error("Could not load NPM: " + er)
process.exit(1); // add all authors
} neededDBValues.push(...pad.getAllAuthors().map(author => "globalAuthor:"));
else
{ // add all revisions
callback(); for (let rev = 0; rev <= pad.head; ++rev) {
} neededDBValues.push("pad:" + padId + ":revs:" + rev);
})
},
// load modules
function(callback) {
settings = require('../src/node/utils/Settings');
db = require('../src/node/db/DB');
callback();
},
//initialize the database
function (callback)
{
db.init(callback);
},
//get the pad
function (callback)
{
padManager = require('../src/node/db/PadManager');
padManager.getPad(padId, function(err, _pad)
{
pad = _pad;
callback(err);
});
},
function (callback)
{
//add all authors
var authors = pad.getAllAuthors();
for(var i=0;i<authors.length;i++)
{
neededDBValues.push("globalAuthor:" + authors[i]);
} }
//add all revisions // add all chat values
var revHead = pad.head; for (let chat = 0; chat <= pad.chatHead; ++chat) {
for(var i=0;i<=revHead;i++) neededDBValues.push("pad:" + padId + ":chat:" + chat);
{
neededDBValues.push("pad:"+padId+":revs:" + i);
} }
//get all chat values //
var chatHead = pad.chatHead; // NB: this script doesn't actually does what's documented
for(var i=0;i<=chatHead;i++) // since the `value` fields in the following `.forEach`
{ // block are just the array index numbers
neededDBValues.push("pad:"+padId+":chat:" + i); //
} // the script therefore craps out now before it can do
callback(); // any damage.
}, //
function (callback) { // See gitlab issue #3545
db = db.db; //
console.info("aborting [gitlab #3545]");
process.exit(1);
// now fetch and reinsert every key
neededDBValues.forEach(function(key, value) { neededDBValues.forEach(function(key, value) {
console.debug("Key: "+key+", value: "+value); console.log("Key: " + key+ ", value: " + value);
db.remove(key); db.remove(key);
db.set(key, value); db.set(key, value);
}); });
callback();
}
], function (err)
{
if(err) throw err;
else
{
console.info("finished"); console.info("finished");
process.exit(); process.exit(0);
} catch (er) {
if (er.name === "apierror") {
console.error(er);
} else {
console.trace(er);
}
} }
}); });
//get the pad object
//get all revisions of this pad
//get all authors related to this pad
//get the readonly link related to this pad
//get the chat entries related to this pad
//remove all keys from database and insert them again