skull-island
Version:
A tool for diffable Kong configuration
60 lines (53 loc) • 2.22 kB
JavaScript
;
const fs = require('fs');
const {dissoc, merge, compose} = require('ramda');
const colors = require('colors');
const kongContext = require('../../lib/kong/context');
const kongApi = require('../../lib/kong/index');
module.exports = async function backup(filename, url, username, password) {
let adjustedFileName = 'kong-backup.json';
if (filename) {
adjustedFileName = filename;
}
try {
const context = kongContext(username, password, url);
const kong = kongApi(context);
const apis = await kong.apis.allApis();
const plugins = await kong.plugins.allPlugins();
const consumers = await kong.consumers.allEnrichedConsumers();
const certificates = await kong.certificates.allCertificates();
const certificatesWithoutSNIs = certificates.map(certificate => dissoc('snis', certificate));
const snis = await kong.snis.allSNIs();
// create certificates directory if it doesn't already exist
if (!fs.existsSync('certificates')) {
fs.mkdirSync('certificates');
}
// write certificate key-pairs to file and replace the data with the file-paths on the JSON object
const modifiedCertificates = certificatesWithoutSNIs.map(certificate => {
const publicKey = certificate.cert;
const privateKey = certificate.key;
const id = certificate.id;
const publicKeyFilePath = `certificates/${id}.pub.pem`;
const privateKeyFilePath = `certificates/${id}.pem`;
fs.writeFileSync(publicKeyFilePath, publicKey);
fs.writeFileSync(privateKeyFilePath, privateKey);
const certificateMinusCertAndKey = compose(dissoc('cert'), dissoc('key'))(certificate);
return merge(certificateMinusCertAndKey, { cert_path: publicKeyFilePath, key_path: privateKeyFilePath });
});
const results = {
apis,
plugins,
consumers,
certificates: modifiedCertificates,
snis
};
fs.writeFileSync(adjustedFileName, JSON.stringify(results, null, 4));
console.log(`Backup data has been written to ${adjustedFileName}`.green);
console.log(' '.reset);
} catch (e) {
console.log(e.message.red);
console.log(' '.reset);
// non-zero exit code for Unix
process.exit(1);
}
};