From efcc2b3bac673fa7fe09ebb236f4996e18a50229 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 14 Dec 2015 21:04:19 -0800 Subject: [PATCH] non-lossy python config parser --- examples/renewal-example.com.conf | 62 ++++++++++++++++++++ pyconf.js | 94 +++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 examples/renewal-example.com.conf create mode 100644 pyconf.js diff --git a/examples/renewal-example.com.conf b/examples/renewal-example.com.conf new file mode 100644 index 0000000..4ed27fa --- /dev/null +++ b/examples/renewal-example.com.conf @@ -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 = +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/ diff --git a/pyconf.js b/pyconf.js new file mode 100644 index 0000000..e2c4c3d --- /dev/null +++ b/pyconf.js @@ -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); +});