read and write python-style config files

This commit is contained in:
AJ ONeal 2015-12-14 22:42:59 -08:00
parent 050ec1f1f3
commit 366b5234d0
1 changed files with 101 additions and 3 deletions

View File

@ -1,6 +1,7 @@
'use strict'; 'use strict';
var fs = require('fs'); var fs = require('fs');
var sfs = require('safe-replace').create();
function snakeCase(key) { function snakeCase(key) {
if ('tlsSni01Port' === key) { if ('tlsSni01Port' === key) {
@ -37,7 +38,7 @@ function parsePythonConf(str, cb) {
var parts = line.trim().split('='); var parts = line.trim().split('=');
var pykey = parts.shift().trim(); var pykey = parts.shift().trim();
var key = camelCase(pykey); var key = camelCase(pykey);
var val = parts.join('='); var val = parts.join('=').trim();
if ('True' === val) { if ('True' === val) {
val = true; val = true;
@ -70,6 +71,94 @@ function parsePythonConf(str, cb) {
cb(null, obj); cb(null, obj);
} }
function toPyVal(val) {
if (null === val) {
return 'None';
}
else if (true === val) {
return 'True';
}
else if (false === val) {
return 'False';
}
else if ('string' === typeof val) {
return val;
}
else if ('number' === typeof val) {
return val;
}
else if (Array.isArray(val)) {
return val.join(',');
}
return val && JSON.stringify(val);
}
function stringifyPythonConf(obj, cb) {
var endline;
// nix the final newline
if (!obj.__lines[obj.__lines.length - 1].trim()) {
endline = obj.__lines.pop();
}
Object.keys(obj).forEach(function (key) {
if ('__' === key.slice(0, 2)) {
return;
}
var pykey = snakeCase(key);
var pyval = toPyVal(obj[key]);
var num = obj.__keys[key];
var comment = '';
if ('number' !== typeof num) {
obj.__lines.push(pykey + ' = ' + pyval);
return;
}
// restore comments
if (-1 !== obj.__lines[num].indexOf('#')) {
comment = obj.__lines[num].replace(/.*?(\s*#.*)/, '$1');
}
if ('[' === pykey[0]) {
return;
}
if ('undefined' === typeof pyval) {
obj.__lines[num] = "___DELETE_ME___";
}
});
obj.__lines = obj.__lines.filter(function (line) {
if ("___DELETE_ME___" !== line) {
return true;
}
});
if ('string' === typeof endline) {
obj.__lines.push(endline);
}
cb(null, obj.__lines.join('\n'));
}
function writePythonConfFile(pathname, obj, cb) {
// TODO re-read file?
stringifyPythonConf(obj, function (err, text) {
sfs.writeFile(pathname, text, 'utf8', function (err) {
if (err) {
cb(err);
return;
}
cb();
});
});
}
function parsePythonConfFile(pathname, cb) { function parsePythonConfFile(pathname, cb) {
fs.readFile(pathname, 'utf8', function (err, text) { fs.readFile(pathname, 'utf8', function (err, text) {
if (err) { if (err) {
@ -82,7 +171,9 @@ function parsePythonConfFile(pathname, cb) {
} }
module.exports.parse = parsePythonConf; module.exports.parse = parsePythonConf;
module.exports.parseFile = parsePythonConfFile; module.exports.readFile = parsePythonConfFile;
module.exports.stringify = stringifyPythonConf;
module.exports.writeFile = writePythonConfFile;
parsePythonConfFile('examples/renewal-example.com.conf', function (err, obj) { parsePythonConfFile('examples/renewal-example.com.conf', function (err, obj) {
if (err) { if (err) {
@ -90,5 +181,12 @@ parsePythonConfFile('examples/renewal-example.com.conf', function (err, obj) {
return; return;
} }
writePythonConfFile('examples/renewal-example.com.conf.new', obj, function (err, obj) {
if (err) {
console.error(err.stack);
return;
}
console.log(obj); console.log(obj);
}); });
});