non-lossy python config parser
This commit is contained in:
parent
0bb800dd85
commit
efcc2b3bac
|
@ -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/
|
|
@ -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);
|
||||
});
|
Loading…
Reference in New Issue