[Freeipa-devel] Using JSON for tlog config files
Simo Sorce
simo at redhat.com
Tue Jun 14 21:25:12 UTC 2016
On Tue, 2016-06-14 at 16:40 +0300, Nikolai Kondrashov wrote:
> Hi everyone,
>
> Although this was mentioned several times before, I'd like to bring additional
> attention to the idea of using config files written in JSON for tlog, because
> there were some concerns over that being appropriate.
What was the reasoning behind this questioning ?
In order to understand whether json is appropriate I need to ask who do
you think will be the primary user of the configuration file.
- Is it going to be mainly sysadmins manually setting things up ?
- Is this going to be something that may need to be templated and
delivered via things like puppet ansible ?
- Is it going to be a file generated by some other program (like sssd or
similar) based on rules stored in a central system ?
The answer to these questions will help understanding what format is
better suited.
Simo.
> Tlog is a terminal I/O recording package [1], with primary purpose of sending
> the recordings as JSON-formatted log messages to ElasticSearch. For the
> purpose of reading what it wrote, it links with json-c.
>
> At this moment both of tlog programs (tlog-rec and tlog-play) expect their
> global configuration to be in JSON, with comments allowed. See the default
> configurations attached. Plus, tlog-rec accepts an environment variable,
> containing the whole, or a part of the configuration to (partially) override
> the global one. That is also in JSON. Tlog uses the same json-c to parse all
> of these. Internally, tlog uses json-c structures to pass around and merge the
> configurations.
>
> The question is, should the global tlog configuration, located in
> /etc/tlog/tlog-rec.conf and /etc/tlog/tlog-play.conf, be in JSON, or should it
> be something else?
>
> The cons I heard so far:
>
> * Administrators don't expect to find JSON in /etc.
> * JSON is a fragile format.
>
> The pros I'd like to present:
>
> * Administrators setting up tlog are expected to also be familiar with
> ElasticSearch, which tlog targets as the storage. ElasticSearch speaks
> JSON exclusively and is configured using either YAML or JSON. So, the
> administrators should be largely familiar with it.
>
> * Although JSON uses explicit and rigid syntax, such as quoting and
> prohibited trailing commas, it is still easy to read, and its
> specification is succint and easy to learn: http://json.org/
>
> * Tlog is already linked with json-c, to read what it wrote, and
> reusing it for configuration reading avoids adding another dependency.
>
> Overall, I consider the present situation a good compromise between
> smaller/simpler code and reduced dependencies vs. familiarity and ease of
> editing and reading for administrators.
>
> The alternatives presented so far are YAML and INI. I'll list each of their
> pros and cons, as I see them.
>
> YAML
>
> Pros
>
> * Has a subset of syntax (sufficient for our purposes), which is easy to
> read and write, doesn't require quoting, not critical to commas and
> other separators.
> * Has official specification.
>
> Cons
>
> * Requires additional dependency to be used in tlog.
> * Only one implementation in C.
> * Uses significant whitespace, which is easier to overlook than explicit
> syntax.
> * *Sometimes* requires quoting to enforce value type, which is easy to
> overlook. E.g. an all-digits string requires quoting, otherwise it is
> considered a number.
> * Although well-defined, specification is long and complicated:
> http://www.yaml.org/spec/1.2/spec.html This makes it hard to fully
> understand the language and be proficient at it.
> * In an attempt to make the language as human-readable as possible, made
> it actually harder for humans to write, in some cases.
> * Has too many features, complicating parsers, leading to harder to use
> APIs, and more bugs.
>
> INI
>
> Pros
>
> * Familiar, already used by sister projects: SSSD, Kerberos, Samba, etc.
> * Light, simple syntax
>
> Cons
>
> * Requires additional dependency to be used in tlog.
> * No official specification, lots of variance in the field:
> https://en.wikipedia.org/wiki/INI_file#Varying_features
> This requires explicit description of the actually used syntax in
> the program manuals. I.e. it cannot simply link to a specification.
> Administrators have to discover which flavor to use. This will become
> worse if we'll implement storing (a subset of) tlog-rec configuration
> in LDAP verbatim, as suggested so far, because the documentation for the
> format will be less discoverable for the person editing the directory.
> * Cannot be written without newlines, in a single line. This will make
> overriding configuration with an environment variable in tlog-rec harder
> to use. I.e. the environment variable value will have to contain
> newlines, or instead refer to a file containing the configuration.
> * No escaping for special characters, multiline value support is patchy
> (not present at all in dinglibs). This will limit the ways to specify
> the recording notice presented to the users at the start of tlog-rec.
>
>
> Your own pros/cons, and suggestions for other formats to use are welcome!
> Thank you for your attention.
>
> Nick
>
> [1]: https://github.com/Scribery/tlog
--
Simo Sorce * Red Hat, Inc * New York
More information about the Freeipa-devel
mailing list