automatically add `id` to modules and domains
This commit is contained in:
parent
d04b750f87
commit
0380a8087f
|
@ -8,6 +8,7 @@ if (!cluster.isMaster) {
|
|||
return;
|
||||
}
|
||||
|
||||
var crypto = require('crypto');
|
||||
var PromiseA = require('bluebird');
|
||||
var fs = PromiseA.promisifyAll(require('fs'));
|
||||
var configStorage;
|
||||
|
@ -25,7 +26,45 @@ function mergeSettings(orig, changes) {
|
|||
}
|
||||
});
|
||||
}
|
||||
function createStorage(filename, filetype) {
|
||||
|
||||
function fixRawConfig(config) {
|
||||
var updated = false;
|
||||
|
||||
function updateModules(list) {
|
||||
if (!Array.isArray(list)) {
|
||||
return;
|
||||
}
|
||||
list.forEach(function (mod) {
|
||||
if (!mod.id) {
|
||||
mod.id = crypto.randomBytes(8).toString('hex');
|
||||
updated = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
function updateDomains(list) {
|
||||
if (!Array.isArray(list)) {
|
||||
return;
|
||||
}
|
||||
list.forEach(function (mod) {
|
||||
if (!mod.id) {
|
||||
mod.id = crypto.randomBytes(8).toString('hex');
|
||||
updated = true;
|
||||
}
|
||||
updateModules(mod.modules);
|
||||
});
|
||||
}
|
||||
|
||||
[ 'dns', 'tcp', 'http', 'tls' ].forEach(function (key) {
|
||||
if (!config[key]) {
|
||||
return;
|
||||
}
|
||||
updateModules(config[key].modules);
|
||||
updateDomains(config[key].domains);
|
||||
});
|
||||
|
||||
return updated;
|
||||
}
|
||||
async function createStorage(filename, filetype) {
|
||||
var recase = require('recase').create({});
|
||||
var snakeCopy = recase.snakeCopy.bind(recase);
|
||||
var camelCopy = recase.camelCopy.bind(recase);
|
||||
|
@ -40,13 +79,25 @@ function createStorage(filename, filetype) {
|
|||
dump = yaml.safeDump;
|
||||
}
|
||||
|
||||
function read() {
|
||||
return fs.readFileAsync(filename).then(parse).catch(function (err) {
|
||||
async function read() {
|
||||
var text;
|
||||
try {
|
||||
text = await fs.readFileAsync(filename);
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
return '';
|
||||
return {};
|
||||
}
|
||||
return PromiseA.reject(err);
|
||||
});
|
||||
throw err;
|
||||
}
|
||||
|
||||
var rawConfig = parse(text);
|
||||
if (fixRawConfig(rawConfig)) {
|
||||
await fs.writeFileAsync(filename, dump(rawConfig));
|
||||
text = await fs.readFileAsync(filename);
|
||||
rawConfig = parse(text);
|
||||
}
|
||||
|
||||
return rawConfig;
|
||||
}
|
||||
|
||||
var result = {
|
||||
|
@ -76,51 +127,54 @@ function createStorage(filename, filetype) {
|
|||
};
|
||||
return result;
|
||||
}
|
||||
function checkConfigLocation(cwd, configFile) {
|
||||
async function checkConfigLocation(cwd, configFile) {
|
||||
cwd = cwd || process.cwd();
|
||||
var path = require('path');
|
||||
var filename;
|
||||
var filename, text;
|
||||
|
||||
var prom;
|
||||
if (configFile) {
|
||||
filename = path.resolve(cwd, configFile);
|
||||
prom = fs.readFileAsync(filename)
|
||||
.catch(function (err) {
|
||||
try {
|
||||
text = await fs.readFileAsync(filename);
|
||||
} catch (err) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
return PromiseA.reject(err);
|
||||
throw err;
|
||||
}
|
||||
if (path.extname(filename) === '.json') {
|
||||
return '{}';
|
||||
}
|
||||
return '';
|
||||
})
|
||||
;
|
||||
return { name: filename, type: 'json' };
|
||||
} else {
|
||||
prom = PromiseA.reject('blah')
|
||||
.catch(function () {
|
||||
filename = path.resolve(cwd, 'goldilocks.yml');
|
||||
return fs.readFileAsync(filename);
|
||||
})
|
||||
.catch(function () {
|
||||
filename = path.resolve(cwd, 'goldilocks.json');
|
||||
return fs.readFileAsync(filename);
|
||||
})
|
||||
.catch(function () {
|
||||
filename = path.resolve(cwd, 'etc/goldilocks/goldilocks.yml');
|
||||
return fs.readFileAsync(filename);
|
||||
})
|
||||
.catch(function () {
|
||||
filename = '/etc/goldilocks/goldilocks.yml';
|
||||
return fs.readFileAsync(filename);
|
||||
})
|
||||
.catch(function () {
|
||||
filename = path.resolve(cwd, 'goldilocks.yml');
|
||||
return '';
|
||||
})
|
||||
;
|
||||
return { name: filename, type: 'yaml' };
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Note that `path.resolve` can handle both relative and absolute paths.
|
||||
var defLocations = [
|
||||
path.resolve(cwd, 'goldilocks.yml')
|
||||
, path.resolve(cwd, 'goldilocks.json')
|
||||
, path.resolve(cwd, 'etc/goldilocks/goldilocks.yml')
|
||||
, '/etc/goldilocks/goldilocks.yml'
|
||||
, path.resolve(cwd, 'goldilocks.yml')
|
||||
];
|
||||
|
||||
var ind;
|
||||
for (ind = 0; ind < defLocations.length; ind += 1) {
|
||||
try {
|
||||
text = await fs.readFileAsync(defLocations[ind]);
|
||||
filename = defLocations[ind];
|
||||
break;
|
||||
} catch (err) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!filename) {
|
||||
filename = defLocations[0];
|
||||
text = '';
|
||||
}
|
||||
}
|
||||
|
||||
return prom.then(function (text) {
|
||||
try {
|
||||
JSON.parse(text);
|
||||
return { name: filename, type: 'json' };
|
||||
|
@ -132,16 +186,12 @@ function checkConfigLocation(cwd, configFile) {
|
|||
} catch (err) {}
|
||||
|
||||
throw new Error('Could not load "' + filename + '" as JSON nor YAML');
|
||||
});
|
||||
}
|
||||
function createConfigStorage(args) {
|
||||
return checkConfigLocation(args.cwd, args.config)
|
||||
.then(function (result) {
|
||||
async function createConfigStorage(args) {
|
||||
var result = await checkConfigLocation(args.cwd, args.config);
|
||||
console.log('config file', result.name, 'is of type', result.type);
|
||||
configStorage = createStorage(result.name, result.type);
|
||||
configStorage = await createStorage(result.name, result.type);
|
||||
return configStorage.read();
|
||||
})
|
||||
;
|
||||
}
|
||||
|
||||
var tcpProm;
|
||||
|
|
Loading…
Reference in New Issue