3

GitHub - snyball/tombl: Easily query TOML files from bash

 1 year ago
source link: https://github.com/snyball/tombl
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

tombl

tombl makes bash viable for DevOps-automations that involve configurations saved as .toml files.

$ eval "$(tombl -e DB=databases.hmm /etc/my-config.toml)"
$ echo "${DB[user]}"
postgreker
$ pg_dumpall -h "${DB[host]}" -p "${DB[port]}" -u "${DB[user]}" > out.sql
$ eval "$(tombl -e KEYS=backup.gpg_keys /etc/my-config.toml)"
$ for key in "${KEYS[@]}"; do echo "key: $key"; done
key: [email protected]
key: [email protected]

It allows bash to read .toml files structurally, so you don't have to come up with weird ad-hoc solutions involving awk, sed, and tears as soon as it breaks in production because you didn't use an actual toml-parser. It does this by outputting declare statements for associative, and "plain" arrays.

$ tombl -e DB=databases.hmm /etc/my-config.toml
declare -A DB=([user]=postgreker [password]='super secret' [host]=0.0.0.0 [port]=5432)
$ tombl -e GPG_KEYS=backup.gpg_keys /etc/my-config.toml
declare -a GPG_KEYS=([email protected] [email protected])
$ tombl -e VAR=some.number /etc/my-config.toml
declare -i VAR=123
$ tombl -e VAR=some.thing /etc/my-config.toml
declare VAR='a thing of sorts'

Bash is unable to store nested arrays of any kind, so any nesting will be ignored when exporting, and you'll have to adapt your -e VAR=path.to.thing to access the nested information. It is recommended that you start your scripts with set -euo pipefail in order to fail fast™.

$ set -euo pipefail
$ cat /etc/my-config.toml
[databases.hmm]
user = "postgreker"
password = "super secret"
host = "0.0.0.0"
port = 5432
thing-that-is-nested = { will-not-be-included = 123 }
$ tombl -e DB=databases.hmm /etc/my-config.toml
declare -A DB=(["user"]="postgreker" ["password"]="super secret" ["host"]="0.0.0.0" ["port"]=5432)
$ eval "$(tombl -e DB=databases.hmm /etc/my-config.toml)"
$ echo "${DB[thing-that-is-nested]}" # whoops, but this will fail fast because of `set -euo`
bash: l: unbound variable

The tombl binary is 184K statically linked, and the release build is created with the help of itself in make-release.sh. Builds are available for Linux only, but it should work on any platform Rust supports.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK