non-lossy python config parser

This commit is contained in:
AJ ONeal 2015-12-14 21:04:19 -08:00
parent 0bb800dd85
commit efcc2b3bac
2 changed files with 156 additions and 0 deletions

View File

@ -0,0 +1,62 @@
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem
# Options and defaults used in the renewal process
[renewalparams]
apache_enmod = a2enmod
no_verify_ssl = False
ifaces = None
apache_dismod = a2dismod
register_unsafely_without_email = False
uir = None
installer = none
config_dir = /etc/letsencrypt
text_mode = False
func = <function obtain_cert at 0x30c9500>
prepare = False
work_dir = /var/lib/letsencrypt
tos = True
init = False
http01_port = 80
duplicate = False
key_path = None
nginx = False
fullchain_path = /home/user/letsencrypt/chain.pem
email = user@example.com
csr = None
agree_dev_preview = None
redirect = None
verbose_count = -3
config_file = None
renew_by_default = False
hsts = False
authenticator = webroot
domains = example.com,
rsa_key_size = 2048
checkpoints = 1
manual_test_mode = False
apache = False
cert_path = /home/user/letsencrypt/cert.pem
webroot_path = /srv/www/example.com/,
strict_permissions = False
apache_server_root = /etc/apache2
account = f4c33502df3789849f617944253b35ae
manual_public_ip_logging_ok = False
chain_path = /home/user/letsencrypt/chain.pem
standalone = False
manual = False
server = https://acme-v01.api.letsencrypt.org/directory
standalone_supported_challenges = "http-01,tls-sni-01"
webroot = True
apache_init_script = None
user_agent = None
apache_ctl = apache2ctl
apache_le_vhost_ext = -le-ssl.conf
debug = False
tls_sni_01_port = 443
logs_dir = /var/log/letsencrypt
configurator = None
[[webroot_map]]
example.com = /srv/www/example.com/

94
pyconf.js Normal file
View File

@ -0,0 +1,94 @@
'use strict';
var fs = require('fs');
function snakeCase(key) {
if ('tlsSni01Port' === key) {
return 'tls_sni_01_port';
}
/*
else if ('http01Port' === key) {
return 'http01-port';
}
*/
else {
return key.replace(/([A-Z])/g, '_$1').toLowerCase();
}
}
function uc(match, c) {
return c.toUpperCase();
}
function camelCase(key) {
return key.replace(/_([a-z0-9])/g, uc);
}
function parsePythonConf(str, cb) {
var keys = {};
var obj = {};
var lines = str.split('\n');
lines.forEach(function (line, i) {
line = line.replace(/#.*/, '').trim();
if (!line) { return; }
var parts = line.trim().split('=');
var pykey = parts.shift().trim();
var key = camelCase(pykey);
var val = parts.join('=');
if ('True' === val) {
val = true;
}
else if ('False' === val) {
val = false;
}
else if ('None' === val) {
val = null;
}
else if (/,/.test(val) && !/^"[^"]*"$/.test(val)) {
val = val.split(',');
}
else if (/^[0-9]+$/.test(val)) {
val = parseInt(val, 10);
}
obj[key] = val;
if ('undefined' !== typeof keys[key]) {
console.warn("unexpected duplicate key '" + key + "': '" + val + "'");
}
keys[key] = i;
});
// we want to be able to rewrite the file with comments, etc
obj.__keys = keys;
obj.__lines = lines;
cb(null, obj);
}
function parsePythonConfFile(pathname, cb) {
fs.readFile(pathname, 'utf8', function (err, text) {
if (err) {
cb(err);
return;
}
parsePythonConf(text, cb);
});
}
module.exports.parse = parsePythonConf;
module.exports.parseFile = parsePythonConfFile;
parsePythonConfFile('examples/renewal-example.com.conf', function (err, obj) {
if (err) {
console.error(err.stack);
return;
}
console.log(obj);
});