mirror of
https://github.com/nasa/openmct.git
synced 2024-12-22 14:32:22 +00:00
wip
This commit is contained in:
parent
5f8d6899d2
commit
68436a9d38
148
src/plugins/persistence/couch/scripts/restore.js
Executable file
148
src/plugins/persistence/couch/scripts/restore.js
Executable file
@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/*****************************************************************************
|
||||
* Open MCT, Copyright (c) 2014-2024, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* Open MCT includes source code licensed under additional open source
|
||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
const process = require('process');
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const { serverUrl, databaseName, helpRequested, username, password, backupFilename } =
|
||||
processArguments();
|
||||
if (helpRequested) {
|
||||
return;
|
||||
}
|
||||
const restoredDocumentCount = await performUpsert({
|
||||
backupFilename,
|
||||
serverUrl,
|
||||
databaseName,
|
||||
username,
|
||||
password
|
||||
});
|
||||
console.log(
|
||||
`Restored ${restoredDocumentCount} document${restoredDocumentCount === 1 ? '' : 's'}.`
|
||||
);
|
||||
} catch (error) {
|
||||
console.error(`Error: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
function processArguments() {
|
||||
const args = process.argv.slice(2);
|
||||
let databaseName = 'openmct'; // default db name to "openmct"
|
||||
let serverUrl = new URL('http://127.0.0.1:5984'); // default db name to "openmct"
|
||||
let backupFilename = 'backup.json'; // default backup filename to "backup.json"
|
||||
let helpRequested = false;
|
||||
|
||||
args.forEach((val, index) => {
|
||||
switch (val) {
|
||||
case '--help':
|
||||
console.log(
|
||||
'Usage: restore.js [--backupFilename pathToBackupJSON] [--dbName name] <CouchDB URL> \nFor authentication, set the environment variables COUCHDB_USERNAME and COUCHDB_PASSWORD. \n'
|
||||
);
|
||||
helpRequested = true;
|
||||
break;
|
||||
case '--dbName':
|
||||
databaseName = args[index + 1];
|
||||
break;
|
||||
case '--serverUrl':
|
||||
serverUrl = new URL(args[index + 1]);
|
||||
break;
|
||||
case '--backupFilename':
|
||||
backupFilename = args[index + 1];
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
let username = process.env.COUCHDB_USERNAME || '';
|
||||
let password = process.env.COUCHDB_PASSWORD || '';
|
||||
|
||||
return {
|
||||
backupFilename,
|
||||
serverUrl,
|
||||
databaseName,
|
||||
helpRequested,
|
||||
username,
|
||||
password
|
||||
};
|
||||
}
|
||||
|
||||
async function getExistingDocsIdToRevMap({ serverUrl, databaseName, username, password }) {
|
||||
const baseUrl = `${serverUrl.href}${databaseName}/_find`;
|
||||
let bookmark = null;
|
||||
let existingDocs = [];
|
||||
let hasMoreDocs = true;
|
||||
|
||||
const body = {
|
||||
selector: {
|
||||
_id: { $gt: null }
|
||||
},
|
||||
fields: ['_id', '_rev'],
|
||||
limit: 1000
|
||||
};
|
||||
|
||||
const findOptions = {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(body)
|
||||
};
|
||||
|
||||
if (username && password) {
|
||||
findOptions.headers.Authorization = `Basic ${btoa(`${username}:${password}`)}`;
|
||||
}
|
||||
|
||||
while (hasMoreDocs) {
|
||||
if (bookmark) {
|
||||
body.bookmark = bookmark;
|
||||
}
|
||||
|
||||
const res = await fetch(baseUrl, findOptions);
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Server responded with status: ${res.status}`);
|
||||
}
|
||||
|
||||
const findResult = await res.json();
|
||||
|
||||
bookmark = findResult.bookmark;
|
||||
existingDocs = [...existingDocs, ...findResult.docs];
|
||||
|
||||
// check if we got less than limit, set hasMoreDocs to false
|
||||
hasMoreDocs = findResult.docs.length === body.limit;
|
||||
}
|
||||
|
||||
return existingDocs;
|
||||
}
|
||||
|
||||
async function performUpsert({ backupFilename, serverUrl, databaseName, username, password }) {
|
||||
console.debug(`👾 Contacting ${serverUrl}/${databaseName}`);
|
||||
const existingDocs = await getExistingDocsIdToRevMap({
|
||||
serverUrl,
|
||||
databaseName,
|
||||
username,
|
||||
password
|
||||
});
|
||||
console.debug('🐻 Existing docs:', existingDocs);
|
||||
}
|
||||
|
||||
main();
|
Loading…
Reference in New Issue
Block a user