From 685ccfd9e0d0d89b404129eb4ec068c923b375bc Mon Sep 17 00:00:00 2001 From: Patrick Spek Date: Tue, 19 Apr 2022 15:32:55 +0200 Subject: Add documentation --- lib/util.bash | 268 +-------------------------------------------------- lib/util/config.bash | 65 +++++++++++++ lib/util/pkg.bash | 64 ++++++++++++ lib/util/svc.bash | 138 ++++++++++++++++++++++++++ 4 files changed, 271 insertions(+), 264 deletions(-) create mode 100644 lib/util/config.bash create mode 100644 lib/util/pkg.bash create mode 100644 lib/util/svc.bash (limited to 'lib') diff --git a/lib/util.bash b/lib/util.bash index 79bac92..8a119f2 100644 --- a/lib/util.bash +++ b/lib/util.bash @@ -4,6 +4,10 @@ # # SPDX-License-Identifier: AGPL-3.0-or-later +. "$BASHTARD_LIBDIR/util/config.bash" +. "$BASHTARD_LIBDIR/util/pkg.bash" +. "$BASHTARD_LIBDIR/util/svc.bash" + # Change the working directory. In usage, this is the same as using cd, # however, it will make additional checks to ensure everything is going fine. chgdir() { @@ -11,70 +15,6 @@ chgdir() { cd -- "$1" || die "Failed to change directory to $1" } -# 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_for() { - local host=$1 ; shift - local key=$1 ; shift - local default=$1 ; shift - - local default - local file - local files - - files=( - "$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_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" -} - # Create a datetime stamp. This is a wrapper around the date utility, ensuring # that the date being formatted is always in UTC and respect SOURCE_DATE_EPOCH, # if it is set. @@ -186,206 +126,6 @@ join_args() { printf "%s" "$*" } -# OS independent package management -pkg() { - local system="bashtard/pkg" - local action=$1 ; shift - local pkg - - pkg="$(config "pkg.$1")" ; shift - - if [[ -z $pkg ]] - then - crit "$system" "No package name for $pkg" - return 1 - fi - - if [[ "$(type -t "pkg_$action")" != "function" ]] - then - crit "$system" "Invalid package manager action $action" - return 1 - fi - - "pkg_$action" "$pkg" -} - -pkg_install() { - local system="bashtard/pkg/install" - - local app=$1 ; shift - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- /usr/sbin/pkg install -y "$app" ;; - linux-debian*) set -- apt install -y "$app" ;; - linux-gentoo) set -- emerge --ask=n --update "$app" ;; - *) - crit "$system" "No package manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - ;; - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -pkg_uninstall() { - local system="bashtard/pkg/uninstall" - - local app=$1 ; shift - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- /usr/sbin/pkg uninstall -y "$app" ;; - linux-debian*) set -- apt remove -y "$app" ;; - linux-gentoo) set -- emerge --ask=n --unmerge "$app" ;; - *) - crit "$system" "No package manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - ;; - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -# OS independent service management. -svc() { - local system="bashtard/svc" - - local service - local action - - action=$1 ; shift - service="$(config "svc.$1")" ; shift - - if [[ -z $service ]] - then - crit "$system" "No service name for $service" - return 1 - fi - - if [[ "$(type -t "svc_$action")" != "function" ]] - then - crit "$system" "Invalid service manager action $action" - return 1 - fi - - "svc_$action" "$service" -} - -svc_disable() { - local system="bashtard/svc/disable" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - linux-gentoo) set -- /sbin/rc-update del "$service" ;; - linux-*) set -- systemctl disable "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -svc_enable() { - local system="bashtard/svc/enable" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - linux-gentoo) set -- /sbin/rc-update add "$service" ;; - linux-*) set -- systemctl enable "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -svc_reload() { - local system="bashtard/svc/reload" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- service "$service" reload ;; - linux-gentoo) set -- /sbin/rc-service "$service" reload ;; - linux-*) set -- systemctl reload "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -svc_restart() { - local system="bashtard/svc/restart" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- service "$service" restart ;; - linux-gentoo) set -- /sbin/rc-service "$service" restart ;; - linux-*) set -- systemctl restart "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -svc_start() { - local system="bashtard/svc/start" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- service "$service" start ;; - linux-gentoo) set -- /sbin/rc-service "$service" start ;; - linux-*) set -- systemctl start "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - -svc_stop() { - local system="bashtard/svc/stop" - - local service=$1 - - case "${BASHTARD_PLATFORM[key]}" in - freebsd) set -- service "$service" stop ;; - linux-gentoo) set -- /sbin/rc-service "$service" stop ;; - linux-*) set -- systemctl stop "$service" ;; - *) - crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" - return 1 - esac - - notice "$system" "$*" - # shellcheck disable=SC2068 - $@ -} - file_template() { local file="$BASHTARD_ETCDIR/playbooks.d/$BASHTARD_PLAYBOOK/share/$1" ; shift diff --git a/lib/util/config.bash b/lib/util/config.bash new file mode 100644 index 0000000..a3b1727 --- /dev/null +++ b/lib/util/config.bash @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +# 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_for() { + local host=$1 ; shift + local key=$1 ; shift + local default=$1 ; shift + + local default + local file + local files + + files=( + "$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_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" +} diff --git a/lib/util/pkg.bash b/lib/util/pkg.bash new file mode 100644 index 0000000..618ce6a --- /dev/null +++ b/lib/util/pkg.bash @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# OS independent package management +pkg() { + local system="bashtard/pkg" + local action=$1 ; shift + local pkg + + pkg="$(config "pkg.$1")" ; shift + + if [[ -z $pkg ]] + then + crit "$system" "No package name for $pkg" + return 1 + fi + + if [[ "$(type -t "pkg_$action")" != "function" ]] + then + crit "$system" "Invalid package manager action $action" + return 1 + fi + + "pkg_$action" "$pkg" +} + +pkg_install() { + local system="bashtard/pkg/install" + + local app=$1 ; shift + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- /usr/sbin/pkg install -y "$app" ;; + linux-debian*) set -- apt install -y "$app" ;; + linux-gentoo) set -- emerge --ask=n --update "$app" ;; + *) + crit "$system" "No package manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + ;; + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +pkg_uninstall() { + local system="bashtard/pkg/uninstall" + + local app=$1 ; shift + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- /usr/sbin/pkg uninstall -y "$app" ;; + linux-debian*) set -- apt remove -y "$app" ;; + linux-gentoo) set -- emerge --ask=n --unmerge "$app" ;; + *) + crit "$system" "No package manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + ;; + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} diff --git a/lib/util/svc.bash b/lib/util/svc.bash new file mode 100644 index 0000000..403615f --- /dev/null +++ b/lib/util/svc.bash @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +# OS independent service management. +svc() { + local system="bashtard/svc" + + local service + local action + + action=$1 ; shift + service="$(config "svc.$1")" ; shift + + if [[ -z $service ]] + then + crit "$system" "No service name for $service" + return 1 + fi + + if [[ "$(type -t "svc_$action")" != "function" ]] + then + crit "$system" "Invalid service manager action $action" + return 1 + fi + + "svc_$action" "$service" +} + +svc_disable() { + local system="bashtard/svc/disable" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + linux-gentoo) set -- /sbin/rc-update del "$service" ;; + linux-*) set -- systemctl disable "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +svc_enable() { + local system="bashtard/svc/enable" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + linux-gentoo) set -- /sbin/rc-update add "$service" ;; + linux-*) set -- systemctl enable "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +svc_reload() { + local system="bashtard/svc/reload" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- service "$service" reload ;; + linux-gentoo) set -- /sbin/rc-service "$service" reload ;; + linux-*) set -- systemctl reload "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +svc_restart() { + local system="bashtard/svc/restart" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- service "$service" restart ;; + linux-gentoo) set -- /sbin/rc-service "$service" restart ;; + linux-*) set -- systemctl restart "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +svc_start() { + local system="bashtard/svc/start" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- service "$service" start ;; + linux-gentoo) set -- /sbin/rc-service "$service" start ;; + linux-*) set -- systemctl start "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} + +svc_stop() { + local system="bashtard/svc/stop" + + local service=$1 + + case "${BASHTARD_PLATFORM[key]}" in + freebsd) set -- service "$service" stop ;; + linux-gentoo) set -- /sbin/rc-service "$service" stop ;; + linux-*) set -- systemctl stop "$service" ;; + *) + crit "$system" "No service manager configured for ${BASHTARD_PLATFORM[key]}" + return 1 + esac + + notice "$system" "$*" + # shellcheck disable=SC2068 + $@ +} -- cgit v1.1