#!/usr/bin/env bash # SPDX-FileCopyrightText: 2022 Patrick Spek # # SPDX-License-Identifier: AGPL-3.0-or-later # Read a particular value from a key/value configuration file. Using this # function introduces a dependency on awk. config() { config_for "${BASHTARD_PLATFORM[fqdn]}" "$@" } config_subkeys() { config_subkeys_for "${BASHTARD_PLATFORM[fqdn]}" "$@" } config_for() { local host=$1 ; shift local key=$1 ; shift local default=$1 ; shift local default local file local files files=( "$BASHTARD_ETCDIR/secrets" "$BASHTARD_ETCDIR/hosts.d/$host" "$BASHTARD_ETCDIR/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_ETCDIR/defaults" ) if [[ -n "$BASHTARD_PLAYBOOK" ]] then debug "bashtard/config_for" "BASHTARD_PLAYBOOK=$BASHTARD_PLAYBOOK, adding etc entries" files+=( "$BASHTARD_ETCDIR/playbooks.d/$BASHTARD_PLAYBOOK/etc/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_ETCDIR/playbooks.d/$BASHTARD_PLAYBOOK/etc/defaults" ) fi files+=( "$BASHTARD_SHAREDIR/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_SHAREDIR/defaults" ) # Check configuration files for file in "${files[@]}" do debug "bashtard/config_for" "Checking for '$key' in '$file'" [[ ! -f $file ]] && continue value="$(awk -F= '$1 == "'"$key"'" { print $NF }' "$file")" if [[ -n $value ]] then debug "bashtard/config_for" "Found $key=$value in $file" printf "%s" "$value" return fi done # Return default value if [[ -n $default ]] then printf "%s" "$default" return fi # Error alert "bashtard/config_for" "No configuration value for $key" } config_subkeys_for() { local host=$1 ; shift local key=$1 ; shift local file local files local results files=( "$BASHTARD_ETCDIR/secrets" "$BASHTARD_ETCDIR/hosts.d/$host" "$BASHTARD_ETCDIR/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_ETCDIR/defaults" ) if [[ -n "$BASHTARD_PLAYBOOK" ]] then debug "bashtard/config_for" "BASHTARD_PLAYBOOK=$BASHTARD_PLAYBOOK, adding etc entries" files+=( "$BASHTARD_ETCDIR/playbooks.d/$BASHTARD_PLAYBOOK/etc/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_ETCDIR/playbooks.d/$BASHTARD_PLAYBOOK/etc/defaults" ) fi files+=( "$BASHTARD_SHAREDIR/os.d/${BASHTARD_PLATFORM[key]}" "$BASHTARD_SHAREDIR/defaults" ) # Check configuration files for file in "${files[@]}" do debug "bashtard/config_subkeys" "Checking for subkeys of '$key' in '$file'" [[ ! -f $file ]] && continue while read -r result do results+=("$result") done < <(grep "^$key\." "$file" | awk -F= '{ print $1 }') done # Return unique results for result in "${results[@]}" do printf "%s\n" "$result" done | sort -u }