112 lines
3.3 KiB
JavaScript
112 lines
3.3 KiB
JavaScript
const _ = require('lodash/fp')
|
|
const fs = require('fs')
|
|
const makeDir = require('make-dir')
|
|
const path = require('path')
|
|
|
|
const load = require('./options-loader')
|
|
|
|
// current path of lamassu-server project
|
|
const currentBasePath = path.dirname(__dirname)
|
|
// get path as array of path components
|
|
const paths = _.wrap(_.split, path.sep)
|
|
// find the index of the lamassu-server directory
|
|
// /usr/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem => 3
|
|
const indexOfLs = _.flow(paths, _.wrap(_.indexOf, 'lamassu-server'))
|
|
|
|
module.exports = {run, mapKeyValuesDeep, updateOptionBasepath}
|
|
|
|
function mapKeyValuesDeep (cb, obj, key) {
|
|
if (_.isArray(obj)) {
|
|
return _.mapValues((val, key) => mapKeyValuesDeep(cb, val, key), obj)
|
|
} else if (_.isObject(obj)) {
|
|
return _.pickBy((val, key) => mapKeyValuesDeep(cb, val, key), obj)
|
|
} else {
|
|
return cb(obj, key)
|
|
}
|
|
}
|
|
|
|
function updateOptionBasepath (result, optionName) {
|
|
const currentPath = _.get(optionName, result)
|
|
|
|
// process only keys that contains
|
|
// lamassu-server dir in its path
|
|
const i = indexOfLs(currentPath)
|
|
if (i === -1) {
|
|
return
|
|
}
|
|
|
|
// workout the relative path
|
|
// /usr/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem => certs/Lamassu_OP.pem
|
|
const rPath = _.drop(i + 1, paths(currentPath))
|
|
|
|
// prepend the current lamassu-server path
|
|
// certs/Lamassu_OP.pem => /usr/local/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem
|
|
const newPath = _.join(path.sep, _.concat([currentBasePath], rPath))
|
|
|
|
// update this option
|
|
// if the value has changed
|
|
if (!_.isEqual(currentPath, newPath)) {
|
|
console.log(`Migrating option ${optionName} to new path ${newPath}`)
|
|
result[optionName] = newPath
|
|
}
|
|
}
|
|
|
|
async function run () {
|
|
// load defaults
|
|
const defaultOpts = require('../lamassu-default')
|
|
|
|
// load current opts
|
|
const options = load()
|
|
const currentOpts = options.opts
|
|
|
|
// check if there are new options to add
|
|
let result = _.mergeAll([defaultOpts, currentOpts])
|
|
|
|
// get all the options
|
|
// that ends with "Path" suffix
|
|
console.log(`Detected lamassu-server basepath: ${currentBasePath}`)
|
|
_.each(_.wrap(updateOptionBasepath, result),
|
|
[
|
|
'seedPath',
|
|
'caPath',
|
|
'certPath',
|
|
'keyPath',
|
|
'lamassuCaPath'
|
|
])
|
|
|
|
const shouldMigrate = !_.isEqual(result, currentOpts) || _.has('lamassuServerPath', result)
|
|
|
|
// write the resulting lamassu.json
|
|
if (shouldMigrate) {
|
|
// remove old lamassuServerPath config
|
|
result = _.omit('lamassuServerPath', result)
|
|
|
|
// find keys for which values
|
|
// have been changed
|
|
const differentValue = _.wrap(_.filter, key => !_.isEqual(result[key], currentOpts[key]))
|
|
|
|
// output affected options
|
|
const newOpts = _.pick(_.union(
|
|
// find change keys
|
|
differentValue(_.keys(result)),
|
|
// find new opts
|
|
_.difference(_.keys(result), _.keys(currentOpts))
|
|
), result)
|
|
console.log('Updating options', newOpts)
|
|
|
|
// store new lamassu.json file
|
|
fs.writeFileSync(options.path, JSON.stringify(result, null, ' '))
|
|
}
|
|
|
|
// get all the new options
|
|
// that ends with "Dir" suffix
|
|
mapKeyValuesDeep((v, k) => {
|
|
if (_.endsWith('Dir', k)) {
|
|
const path = _.attempt(() => makeDir.sync(v))
|
|
|
|
if (_.isError(path)) {
|
|
console.error(`Error while creating folder ${v}`, path)
|
|
}
|
|
}
|
|
}, result)
|
|
}
|