🎉 Initial library code

This commit is contained in:
Franck Nijhof 2019-03-14 17:14:31 +01:00
parent f91b4cbaa9
commit 2346cddca2
No known key found for this signature in database
GPG key ID: D62583BA8AB11CA3
26 changed files with 4499 additions and 6 deletions

84
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,84 @@
---
image: docker:latest
variables:
DOCKER_DRIVER: overlay2
stages:
- preflight
# Generic DIND template
.dind: &dind
before_script:
- docker info
services:
- name: docker:dind
command: ["--experimental"]
# Generic preflight template
.preflight: &preflight
stage: preflight
tags:
- preflight
# Preflight jobs
shellcheck:
<<: *preflight
image:
name: koalaman/shellcheck-alpine:stable
entrypoint: [""]
before_script:
- shellcheck --version
- apk --no-cache add grep
- |
find . -type f -print0 | \
xargs -0 sed -i 's:#!/usr/bin/with-contenv bash:#!/bin/bash:g'
script:
- |
for file in $(grep -IRl "#\!\(/usr/bin/env \|/bin/\)" --exclude-dir ".git" "${ADDON_TARGET}"); do
if ! shellcheck $file; then
export FAILED=1
else
echo "$file OK"
fi
done
if [ "${FAILED}" = "1" ]; then
exit 1
fi
yamllint:
<<: *preflight
image: sdesbure/yamllint
before_script:
- yamllint --version
script:
- yamllint .
jsonlint:
<<: *preflight
image: sahsu/docker-jsonlint
before_script:
- jsonlint --version || true
script:
- |
for file in $(find . -type f -name "*.json"); do
if ! jsonlint -q $file; then
export FAILED=1
else
echo "$file OK"
fi
done
if [ "${FAILED}" = "1" ]; then
exit 1
fi
markdownlint:
<<: *preflight
image:
name: ruby:alpine
entrypoint: [""]
before_script:
- gem install mdl
- mdl --version
script:
- mdl --style all --warnings .

View file

@ -1,6 +1,6 @@
# MIT License # MIT License
Copyright (c) 2018 Franck Nijhof Copyright (c) 2019 Franck Nijhof
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -8,7 +8,6 @@
![Project Maintenance][maintenance-shield] ![Project Maintenance][maintenance-shield]
[![GitHub Activity][commits-shield]][commits] [![GitHub Activity][commits-shield]][commits]
[![Bountysource][bountysource-shield]][bountysource]
[![Discord][discord-shield]][discord] [![Discord][discord-shield]][discord]
[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] [![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]
@ -98,7 +97,7 @@ check [the contributor's page][contributors].
MIT License MIT License
Copyright (c) 2018 Franck Nijhof Copyright (c) 2019 Franck Nijhof
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -118,8 +117,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
[bountysource-shield]: https://img.shields.io/bountysource/team/hassio-addons/activity.svg
[bountysource]: https://www.bountysource.com/teams/hassio-addons/issues
[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg [buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg
[buymeacoffee]: https://www.buymeacoffee.com/frenck [buymeacoffee]: https://www.buymeacoffee.com/frenck
[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/bashio.svg [commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/bashio.svg
@ -133,7 +130,7 @@ SOFTWARE.
[issue]: https://github.com/hassio-addons/bashio/issues [issue]: https://github.com/hassio-addons/bashio/issues
[keepchangelog]: http://keepachangelog.com/en/1.0.0/ [keepchangelog]: http://keepachangelog.com/en/1.0.0/
[license-shield]: https://img.shields.io/github/license/hassio-addons/bashio.svg [license-shield]: https://img.shields.io/github/license/hassio-addons/bashio.svg
[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg [maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg
[patreon-shield]: https://www.frenck.nl/images/patreon.png [patreon-shield]: https://www.frenck.nl/images/patreon.png
[patreon]: https://www.patreon.com/frenck [patreon]: https://www.patreon.com/frenck
[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg [project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg

1005
lib/addons.sh Normal file

File diff suppressed because it is too large Load diff

103
lib/api.sh Normal file
View file

@ -0,0 +1,103 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Makes a call to the Hass.io API.
#
# Arguments:
# $1 HTTP Method (GET/POST)
# $2 API Resource requested
# $3 Whether or not this resource returns raw data instead of json (optional)
# $3 In case of a POST method, this parameter is the JSON to POST (optional)
# $4 jq filter command (optional)
# ------------------------------------------------------------------------------
function bashio::api.hassio() {
local method=${1}
local resource=${2}
local raw=${3:-}
local filter=${4:-}
local auth_header='X-HASSIO-KEY;'
local response
local status
local data='{}'
local result
bashio::log.trace "${FUNCNAME[0]}" "$@"
if [[ -n "${HASSIO_TOKEN:-}" ]]; then
auth_header="X-HASSIO-KEY: ${__BASHIO_HASSIO_TOKEN}"
fi
if [[ "${method}" = "POST" ]] && bashio::var.has_value "${raw}"; then
data="${raw}"
fi
if ! response=$(curl --silent --show-error \
--write-out '\n%{http_code}' --request "${method}" \
-H "${auth_header}" \
-H "Content-Type: application/json" \
-d "${data}" \
"${__BASHIO_HASSIO_API}${resource}"
); then
bashio::log.debug "${response}"
bashio::log.error "Something went wrong contacting the API"
return "${__BASHIO_EXIT_NOK}"
fi
status=${response##*$'\n'}
response=${response%$status}
bashio::log.debug "Requested API resource: ${__BASHIO_HASSIO_API}${resource}"
bashio::log.debug "Request method: ${method}"
bashio::log.debug "Request data: ${data}"
bashio::log.debug "API HTTP Response code: ${status}"
bashio::log.debug "API Response: ${response}"
if [[ "${status}" -eq 401 ]]; then
bashio::log.error "Unable to authenticate with the API, permission denied"
return "${__BASHIO_EXIT_NOK}"
fi
if [[ "${status}" -eq 404 ]]; then
bashio::log.error "Requested resource ${resource} was not found"
return "${__BASHIO_EXIT_NOK}"
fi
if [[ "${status}" -eq 405 ]]; then
bashio::log.error "Requested resource ${resource} was called using an" \
"unallowed method."
return "${__BASHIO_EXIT_NOK}"
fi
if [[ $(bashio::jq "${response}" ".result") = "error" ]]; then
bashio::log.error "Got unexpected response from the API:" \
"$(bashio::jq "${response}" '.message // empty')"
return "${__BASHIO_EXIT_NOK}"
fi
if [[ "${status}" -ne 200 ]]; then
bashio::log.error "Unknown HTTP error occured"
return "${__BASHIO_EXIT_NOK}"
fi
if bashio::var.true "${raw}"; then
echo "${response}"
return "${__BASHIO_EXIT_NOK}"
fi
result=$(bashio::jq "${response}" 'if .data == {} then empty else .data end')
if bashio::var.has_value "${filter}"; then
bashio::log.debug "Filtering response using: ${filter}"
result=$(bashio::jq "${result}" "${filter}")
fi
echo "${result}"
return "${__BASHIO_EXIT_OK}"
}

26
lib/bashio Executable file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
set -o errexit # Exit script when a command exits with non-zero status
set -o errtrace # Exit on error inside any functions or sub-shells
set -o nounset # Exit script on use of an undefined variable
set -o pipefail # Return exit status of the last command in the pipe that failed
export __BASHIO_BIN
export __BASHIO_LIB_DIR
__BASHIO_BIN=$(readlink -f "${BASH_SOURCE[0]}")
__BASHIO_LIB_DIR=$(dirname "${__BASHIO_BIN}")
# Include Bashio library
# shellcheck source=bashio.sh
source "${__BASHIO_LIB_DIR}/bashio.sh"
# Execute source
# shellcheck source=/dev/null
source "$@"

80
lib/bashio.sh Normal file
View file

@ -0,0 +1,80 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
set -o errexit # Exit script when a command exits with non-zero status
set -o errtrace # Exit on error inside any functions or sub-shells
set -o nounset # Exit script on use of an undefined variable
set -o pipefail # Return exit status of the last command in the pipe that failed
# ==============================================================================
# GLOBALS
# ==============================================================================
# Bashio version number
readonly BASHIO_VERSION="0.1.0"
# Stores the location of this library
readonly __BASHIO_LIB_DIR=$(dirname "${BASH_SOURCE[0]}")
# shellcheck source=const.sh
source "${__BASHIO_LIB_DIR}/const.sh"
# Defaults
declare __BASHIO_HASSIO_API=${HASSIO_API:-${__BASHIO_DEFAULT_HASSIO_API}}
declare __BASHIO_HASSIO_TOKEN=${HASSIO_TOKEN:-${__BASHIO_DEFAULT_HASSIO_TOKEN}}
declare __BASHIO_ADDON_CONFIG=${HASSIO_ADDON_CONFIG:-${__BASHIO_DEFAULT_ADDON_CONFIG}}
declare __BASHIO_LOG_LEVEL=${LOG_LEVEL:-${__BASHIO_DEFAULT_LOG_LEVEL}}
declare __BASHIO_LOG_FORMAT=${LOG_FORMAT:-${__BASHIO_DEFAULT_LOG_FORMAT}}
declare __BASHIO_LOG_TIMESTAMP=${LOG_TIMESTAMP:-${__BASHIO_DEFAULT_LOG_TIMESTAMP}}
declare __BASHIO_HIBP_ENDPOINT=${HIBP_ENDPOINT:-${__BASHIO_DEFAULT_HIBP_ENDPOINT}}
declare __BASHIO_CACHE_DIR=${CACHE_DIR:-${__BASHIO_DEFAULT_CACHE_DIR}}
declare __BASHIO_HA_SECRETS=${HA_SECRETS:-${__BASHIO_DEFAULT_SECRETS}}
# ==============================================================================
# MODULES
# ==============================================================================
# shellcheck source=color.sh
source "${__BASHIO_LIB_DIR}/color.sh"
# shellcheck source=log.sh
source "${__BASHIO_LIB_DIR}/log.sh"
# shellcheck source=fs.sh
source "${__BASHIO_LIB_DIR}/fs.sh"
# shellcheck source=cache.sh
source "${__BASHIO_LIB_DIR}/cache.sh"
# shellcheck source=addons.sh
source "${__BASHIO_LIB_DIR}/addons.sh"
# shellcheck source=api.sh
source "${__BASHIO_LIB_DIR}/api.sh"
# shellcheck source=config.sh
source "${__BASHIO_LIB_DIR}/config.sh"
# shellcheck source=exit.sh
source "${__BASHIO_LIB_DIR}/exit.sh"
# shellcheck source=hardware.sh
source "${__BASHIO_LIB_DIR}/hardware.sh"
# shellcheck source=hassos.sh
source "${__BASHIO_LIB_DIR}/hassos.sh"
# shellcheck source=homeassistant.sh
source "${__BASHIO_LIB_DIR}/homeassistant.sh"
# shellcheck source=host.sh
source "${__BASHIO_LIB_DIR}/host.sh"
# shellcheck source=info.sh
source "${__BASHIO_LIB_DIR}/info.sh"
# shellcheck source=jq.sh
source "${__BASHIO_LIB_DIR}/jq.sh"
# shellcheck source=pwned.sh
source "${__BASHIO_LIB_DIR}/pwned.sh"
# shellcheck source=repositories.sh
source "${__BASHIO_LIB_DIR}/repositories.sh"
# shellcheck source=secrets.sh
source "${__BASHIO_LIB_DIR}/secrets.sh"
# shellcheck source=supervisor.sh
source "${__BASHIO_LIB_DIR}/supervisor.sh"
# shellcheck source=var.sh
source "${__BASHIO_LIB_DIR}/var.sh"

108
lib/cache.sh Normal file
View file

@ -0,0 +1,108 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Check if a cache key exists in the cache
#
# Arguments:
# $1 Cache key
# ------------------------------------------------------------------------------
function bashio::cache.exists() {
local key=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::fs.file_exists "${__BASHIO_CACHE_DIR}/${key}.cache"; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Returns the cached value based on a key
#
# Arguments:
# $1 Cache key
# ------------------------------------------------------------------------------
function bashio::cache.get() {
local key=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::cache.exists "${key}"; then
return "${__BASHIO_EXIT_NOK}"
fi
printf "%s" "$(<${__BASHIO_CACHE_DIR}/"${key}".cache)"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Cache a value identified by a given key
#
# Arguments:
# $1 Cache key
# $2 Cache value
# ------------------------------------------------------------------------------
function bashio::cache.set() {
local key=${1}
local value=${2}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::fs.directory_exists "${__BASHIO_CACHE_DIR}"; then
mkdir -p "${__BASHIO_CACHE_DIR}" ||
basshio::exit.nok "Could not create cache folder"
fi
if ! printf "%s" "$value" > "${__BASHIO_CACHE_DIR}/${key}.cache"; then
bashio::log.warning "An error occured while storing ${key} to cache"
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Remove a specific item from the cache based on the caching key
#
# Arguments:
# $1 Cache key
# ------------------------------------------------------------------------------
function bashio::cache.flush() {
local key=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! rm -f "${__BASHIO_CACHE_DIR}/${key}.cache"; then
bashio::exit.nok "An error while flushing ${key} from cache"
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Flush all cached data
# ------------------------------------------------------------------------------
bashio::cache.flush_all() {
bashio::log.trace "${FUNCNAME[0]}"
if ! bashio::fs.directory_exists "${__BASHIO_CACHE_DIR}"; then
return "${__BASHIO_EXIT_OK}"
fi
if ! rm -f -r "${__BASHIO_CACHE_DIR}"; then
basshio::exit.nok "Could not flush cache"
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}

253
lib/color.sh Normal file
View file

@ -0,0 +1,253 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Reset color output (background and foreground colors).
# ------------------------------------------------------------------------------
function bashio::color.reset() {
echo -n -e "${__BASHIO_COLORS_RESET}"
}
# ------------------------------------------------------------------------------
# Set default output color.
# ------------------------------------------------------------------------------
function bashio::color.default() {
echo -n -e "${__BASHIO_COLORS_DEFAULT}"
}
# ------------------------------------------------------------------------------
# Set font output color to black.
# ------------------------------------------------------------------------------
function bashio::color.black() {
echo -n -e "${__BASHIO_COLORS_BLACK}"
}
# ------------------------------------------------------------------------------
# Set font output color to red.
# ------------------------------------------------------------------------------
function bashio::color.red() {
echo -n -e "${__BASHIO_COLORS_RED}"
}
# ------------------------------------------------------------------------------
# Set font output color to green.
# ------------------------------------------------------------------------------
function bashio::color.green() {
echo -n -e "${__BASHIO_COLORS_GREEN}"
}
# ------------------------------------------------------------------------------
# Set font output color to yellow.
# ------------------------------------------------------------------------------
function bashio::color.yellow() {
echo -n -e "${__BASHIO_COLORS_YELLOW}"
}
# ------------------------------------------------------------------------------
# Set font output color to blue.
# ------------------------------------------------------------------------------
function bashio::color.blue() {
echo -n -e "${__BASHIO_COLORS_BLUE}"
}
# ------------------------------------------------------------------------------
# Set font output color to magenta.
# ------------------------------------------------------------------------------
function bashio::color.magenta() {
echo -n -e "${__BASHIO_COLORS_MAGENTA}"
}
# ------------------------------------------------------------------------------
# Set font output color to cyan.
# ------------------------------------------------------------------------------
function bashio::color.cyan() {
echo -n -e "${__BASHIO_COLORS_CYAN}"
}
# ------------------------------------------------------------------------------
# Set font output color to light grey.
# ------------------------------------------------------------------------------
function bashio::color.light_grey() {
echo -n -e "${__BASHIO_COLORS_LIGHT_GRAY}"
}
# ------------------------------------------------------------------------------
# Set font output color to dark grey.
# ------------------------------------------------------------------------------
function bashio::color.dark_grey() {
echo -n -e "${__BASHIO_COLORS_DARK_GRAY}"
}
# ------------------------------------------------------------------------------
# Set font output color to light red.
# ------------------------------------------------------------------------------
function bashio::color.light_red() {
echo -n -e "${__BASHIO_COLORS_LIGHT_RED}"
}
# ------------------------------------------------------------------------------
# Set font output color to light green.
# ------------------------------------------------------------------------------
function bashio::color.light_green() {
echo -n -e "${__BASHIO_COLORS_LIGHT_GREEN}"
}
# ------------------------------------------------------------------------------
# Set font output color to light yellow.
# ------------------------------------------------------------------------------
function bashio::color.light_yellow() {
echo -n -e "${__BASHIO_COLORS_LIGHT_YELLOW}"
}
# ------------------------------------------------------------------------------
# Set font output color to light blue.
# ------------------------------------------------------------------------------
function bashio::color.light_blue() {
echo -n -e "${__BASHIO_COLORS_LIGHT_BLUE}"
}
# ------------------------------------------------------------------------------
# Set font output color to light magenta.
# ------------------------------------------------------------------------------
function bashio::color.light_magenta() {
echo -n -e "${__BASHIO_COLORS_LIGHT_MAGENTA}"
}
# ------------------------------------------------------------------------------
# Set font output color to light cyan.
# ------------------------------------------------------------------------------
function bashio::color.light_cyan() {
echo -n -e "${__BASHIO_COLORS_LIGHT_CYAN}"
}
# ------------------------------------------------------------------------------
# Set font output color to white.
# ------------------------------------------------------------------------------
function bashio::color.white() {
echo -n -e "${__BASHIO_COLORS_WHITE}"
}
# ------------------------------------------------------------------------------
# Set font output color background to default.
# ------------------------------------------------------------------------------
function bashio::color.bg.default() {
echo -n -e "${__BASHIO_COLORS_BG_DEFAULT}"
}
# ------------------------------------------------------------------------------
# Set font output color background to black.
# ------------------------------------------------------------------------------
function bashio::color.bg.black() {
echo -n -e "${__BASHIO_COLORS_BG_BLACK}"
}
# ------------------------------------------------------------------------------
# Set font output color background to red.
# ------------------------------------------------------------------------------
function bashio::color.bg.red() {
echo -n -e "${__BASHIO_COLORS_BG_RED}"
}
# ------------------------------------------------------------------------------
# Set font output color background to green.
# ------------------------------------------------------------------------------
function bashio::color.bg.green() {
echo -n -e "${__BASHIO_COLORS_BG_GREEN}"
}
# ------------------------------------------------------------------------------
# Set font output color background to yellow.
# ------------------------------------------------------------------------------
function bashio::color.bg.yellow() {
echo -n -e "${__BASHIO_COLORS_BG_YELLOW}"
}
# ------------------------------------------------------------------------------
# Set font output color background to blue.
# ------------------------------------------------------------------------------
function bashio::color.bg.blue() {
echo -n -e "${__BASHIO_COLORS_BG_BLUE}"
}
# ------------------------------------------------------------------------------
# Set font output color background to magenta.
# ------------------------------------------------------------------------------
function bashio::color.bg.magenta() {
echo -n -e "${__BASHIO_COLORS_BG_MAGENTA}"
}
# ------------------------------------------------------------------------------
# Set font output color background to cyan.
# ------------------------------------------------------------------------------
function bashio::color.bg.cyan() {
echo -n -e "${__BASHIO_COLORS_BG_CYAN}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light gray.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_gray() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_GRAY}"
}
# ------------------------------------------------------------------------------
# Set font output color background to dark gray.
# ------------------------------------------------------------------------------
function bashio::color.bg.dark_gray() {
echo -n -e "${__BASHIO_COLORS_BG_DARK_GRAY}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light red.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_red() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_RED}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light green.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_green() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_GREEN}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light yellow.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_yellow() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_YELLOW}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light blue.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_blue() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_BLUE}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light magenta.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_magenta() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_MAGENTA}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light cyan.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_cyan() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_CYAN}"
}
# ------------------------------------------------------------------------------
# Set font output color background to light white.
# ------------------------------------------------------------------------------
function bashio::color.bg.light_white() {
echo -n -e "${__BASHIO_COLORS_BG_LIGHT_WHITE}"
}

603
lib/config.sh Normal file
View file

@ -0,0 +1,603 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Fetches a configuration value from the add-on config file.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config() {
local key=${1}
local query
local result
bashio::log.trace "${FUNCNAME[0]}:" "$@"
read -r -d '' query << QUERY
if (.${key} == null) then
null
elif (.${key} | type == "string") then
.${key} // empty
elif (.${key} | type == "boolean") then
.${key} // false
elif (.${key} | type == "array") then
if (.${key} == []) then
empty
else
.${key}[]
end
elif (.${key} | type == "object") then
if (.${key} == {}) then
empty
else
.${key}
end
else
.${key}
end
QUERY
result=$(bashio::jq "${__BASHIO_ADDON_CONFIG}" "${query}")
if [[ "${result}" == '!secret '* ]]; then
result=$(bashio::secret "${result}")
fi
printf "%s" "${result}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if a configuration option exists in the config file
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.exists() {
local key=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ $(bashio::config ".${key}") != "null" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if a configuration option has an actual value.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.has_value() {
local key=${1}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::config "${key}")
if [[ "${value}" == "null" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
if ! bashio::var.has_value "${value}"; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if a configuration option has an empty value.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.is_empty() {
local key=${1}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::config "${key}")
if bashio::var.is_empty "${value}"; then
return "${__BASHIO_EXIT_OK}"
fi
if [[ "${value}" == "null" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Checks if a configuration option is true.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.true() {
local key=${1}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::config "${key}")
if ! bashio::var.true "${value}"; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if a configuration option is false.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.false() {
local key=${1}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::config "${key}")
if ! bashio::var.false "${value}"; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if a password is safe to use, using IHaveBeenPwned.
#
# Arguments:
# $1 Key of the config option
# ------------------------------------------------------------------------------
function bashio::config.is_safe_password() {
local key=${1}
local password
bashio::log.trace "${FUNCNAME[0]}:" "$@"
# If the password is safe, we'll accept it anyways.
password=$(bashio::config "${key}")
if bashio::pwned.is_safe_password "${password}"; then
return "${__BASHIO_EXIT_OK}"
fi
# If the bypass is enabled, we'll return OK.
if bashio::config.true "i_like_to_be_pwned"; then
bashio::log.warning "Have I Been Pwned bypass enabled."
return "${__BASHIO_EXIT_OK}"
fi
# If we reach this point, we'll just fail.
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Require a configuration option to be set by the user.
#
# Arguments:
# $1 Key of the config option
# $2 Addition reason why this is needed
# ------------------------------------------------------------------------------
function bashio::config.require() {
local key=${1}
local reason=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::config.has_value "${key}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal
bashio::log.fatal "A required add-on configuration option is missing!"
bashio::log.fatal
bashio::log.fatal "Please set a value for the '${key}' option."
if bashio::var.has_value "${reason}"; then
bashio::log.fatal
bashio::log.fatal "This option is required because:"
bashio::log.fatal "${reason}"
fi
bashio::log.fatal
bashio::log.fatal "If unsure, check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
}
# ------------------------------------------------------------------------------
# Suggest on setting a configuration option to the user.
#
# Arguments:
# $1 Key of the config option
# $2 Addition reason why this is needed
# ------------------------------------------------------------------------------
function bashio::config.suggest() {
local key=${1}
local reason=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::config.has_value "${key}"; then
bashio::log.warning
bashio::log.warning \
"A recommended add-on configuration option is not set."
bashio::log.warning
bashio::log.warning "The configuration key '${key}' seems to be empty."
bashio::log.warning
if bashio::var.has_value "${reason}"; then
bashio::log.warning
bashio::log.warning "Consider configuring this because:"
bashio::log.warning "${reason}"
fi
bashio::log.warning "Check the add-on manual for more information."
bashio::log.warning
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Suggest on enabling a configuration option to the user.
#
# Arguments:
# $1 Key of the config option
# $2 Addition reason why this is needed
# ------------------------------------------------------------------------------
function bashio::config.suggest.true() {
local key=${1}
local reason=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::config.true "${key}"; then
bashio::log.warning
bashio::log.warning \
"A recommended add-on configuration option is not enabled."
if bashio::var.has_value "${reason}"; then
bashio::log.warning
bashio::log.warning "Consider enabling this because:"
bashio::log.warning "${reason}"
fi
bashio::log.warning
bashio::log.warning "Enable config option '${key}' hide this message."
bashio::log.warning
bashio::log.warning "Check the add-on manual for more information."
bashio::log.warning
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Suggest on disabling a configuration option to the user.
#
# Arguments:
# $1 Key of the config option
# $2 Addition reason why this is needed
# ------------------------------------------------------------------------------
function bashio::config.suggest.false() {
local key=${1}
local reason=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::config.false "${key}"; then
bashio::log.warning
bashio::log.warning \
"A recommended add-on configuration option is not disabled."
if bashio::var.has_value "${reason}"; then
bashio::log.warning
bashio::log.warning "Consider disabling this because:"
bashio::log.warning "${reason}"
fi
bashio::log.warning
bashio::log.warning "Disable config option '${key}' hide this message."
bashio::log.warning
bashio::log.warning "Check the add-on manual for more information."
bashio::log.warning
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Require the user to configure a username.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'username')
# ------------------------------------------------------------------------------
function bashio::config.require.username() {
local key=${1:-"username"}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::config.has_value "${key}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal
bashio::log.fatal "Setting a username is required!"
bashio::log.fatal
bashio::log.fatal "Please username in the '${key}' option."
bashio::log.fatal
bashio::log.fatal "If unsure, check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
}
# ------------------------------------------------------------------------------
# Suggest to the user to set a username, in case it is not.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'username')
# ------------------------------------------------------------------------------
function bashio::config.suggest.username() {
local key=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::config.has_value "${key}"; then
bashio::log.warning
bashio::log.warning \
"Setting a username is highly recommended!"
bashio::log.warning
bashio::log.warning "Define a username in the '${key}' option."
bashio::log.warning
bashio::log.warning "Check the add-on manual for more information."
bashio::log.warning
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if the password has been set and exits when it is not.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'password')
# ------------------------------------------------------------------------------
function bashio::config.require.password() {
local key=${1:-"password"}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::config.has_value "${key}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal
bashio::log.fatal "Setting a password is required!"
bashio::log.fatal
bashio::log.fatal "Please password in the '${key}' option."
bashio::log.fatal
bashio::log.fatal "If unsure, check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
}
# ------------------------------------------------------------------------------
# Suggest to set a password if it was not set.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'password')
# ------------------------------------------------------------------------------
function bashio::config.suggest.password() {
local key=${1:-"password"}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::config.has_value "${key}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.warning
bashio::log.warning "Setting a password is highly recommended!"
bashio::log.warning
bashio::log.warning "Please set a password in the '${key}' option."
bashio::log.warning
bashio::log.warning \
"If unsure, check the add-on manual for more information."
bashio::log.warning
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Require to set a password which is not in HaveIBeenPwned database.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'password')
# ------------------------------------------------------------------------------
function bashio::config.require.safe_password() {
local key=${1:-"password"}
local password
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::config.require.password "${key}"
password=$(bashio::config "${key}")
if bashio::pwned.is_safe_password "${password}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal
bashio::log.fatal "We are trying to help you to protect your system the"
bashio::log.fatal "best we can. Therefore, this add-on checks your"
bashio::log.fatal "configured password again the HaveIBeenPwned database."
bashio::log.fatal
bashio::log.fatal "Unfortunately, your configured password is considered"
bashio::log.fatal "unsafe. We highly recommend you to pick a different one."
bashio::log.fatal
bashio::log.fatal "Please change the password in the '${key}' option."
bashio::log.fatal
bashio::log.fatal "Check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
}
# ------------------------------------------------------------------------------
# Suggest to set a password which is not in HaveIBeenPwned database.
#
# Arguments:
# $1 Key of the config option (optional: defaults to 'password')
# ------------------------------------------------------------------------------
function bashio::config.suggest.safe_password() {
local key=${1:-"password"}
local password
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::config.has_value "${key}"; then
bashio::config.suggest.password "${key}"
return "${__BASHIO_EXIT_OK}"
fi
password=$(bashio::config "${key}")
if bashio::pwned.is_safe_password "${password}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.warning
bashio::log.warning "We are trying to help you to protect your system the"
bashio::log.warning "best we can. Therefore, this add-on checks your"
bashio::log.warning "configured password again the HaveIBeenPwned database."
bashio::log.warning
bashio::log.warning "Unfortunately, your configured password is considered"
bashio::log.warning "unsafe. It is recommended to pick a different one."
bashio::log.warning
bashio::log.warning "Please change the password in the '${key}' option."
bashio::log.warning
bashio::log.warning "Check the add-on manual for more information."
bashio::log.warning
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Check if certificate files exists when SSL is enabled.
#
# Arguments:
# $1 Key of the ssl config option (optional: defaults to 'ssl')
# $2 Key of the cert file config option (optional: defaults to 'certfile')
# $3 Key of the cert key file config option (optional: defaults to 'keyfile')
# ------------------------------------------------------------------------------
function bashio::config.require.ssl() {
local key=${1:-"ssl"}
local certfile=${1:-"certfile"}
local keyfile=${2:-"keyfile"}
if ! bashio::config.true "${key}"; then
return "${__BASHIO_EXIT_OK}"
fi
if bashio::config.is_empty "${certfile}"; then
bashio::log.fatal
bashio::log.fatal "SSL has been enabled using the '${key}' option,"
bashio::log.fatal "this requires a SSL certificate file which is"
bashio::log.fatal "configured using the '${certfile}' option in the"
bashio::log.fatal "add-on configuration."
bashio::log.fatal
bashio::log.fatal "Unfortunately, the '${certfile}' option is empty."
bashio::log.fatal
bashio::log.fatal "Consider configuring or getting a SSL certificate"
bashio::log.fatal "or setting the '${key}' option to 'false' in case"
bashio::log.fatal "you are not planning on using SSL with this add-on."
bashio::log.fatal
bashio::log.fatal "Check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
fi
if bashio::config.is_empty "${keyfile}"; then
bashio::log.fatal
bashio::log.fatal "SSL has been enabled using the '${key}' option,"
bashio::log.fatal "this requires a SSL certificate key file which is"
bashio::log.fatal "configured using the '${keyfile}' option in the"
bashio::log.fatal "add-on configuration."
bashio::log.fatal
bashio::log.fatal "Unfortunately, the '${keyfile}' option is empty."
bashio::log.fatal
bashio::log.fatal "Consider configuring or getting a SSL certificate"
bashio::log.fatal "or setting the '${key}' option to 'false' in case"
bashio::log.fatal "you are not planning on using SSL with this add-on."
bashio::log.fatal
bashio::log.fatal "Check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
fi
if ! bashio::fs.file_exists "/ssl/$(bashio::config "${certfile}")"; then
bashio::log.fatal
bashio::log.fatal "SSL has been enabled using the '${key}' option,"
bashio::log.fatal "this requires a SSL certificate file which is"
bashio::log.fatal "configured using the '${certfile}' option in the"
bashio::log.fatal "add-on configuration."
bashio::log.fatal
bashio::log.fatal "Unfortunately, the file specified in the"
bashio::log.fatal "'${certfile}' option does not exists."
bashio::log.fatal
bashio::log.fatal "Please ensure the certificate file exists and"
bashio::log.fatal "is placed in the Hass.io '/ssl/' directory."
bashio::log.fatal
bashio::log.fatal "In case you don't have SSL yet, consider getting"
bashio::log.fatal "a SSL certificate or setting the '${key}' option"
bashio::log.fatal "to 'false' in case you are not planning on using"
bashio::log.fatal "SSL with this add-on."
bashio::log.fatal
bashio::log.fatal "Check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
fi
if ! bashio::fs.file_exists "/ssl/$(bashio::config "${keyfile}")"; then
bashio::log.fatal
bashio::log.fatal "SSL has been enabled using the '${key}' option,"
bashio::log.fatal "this requires a SSL certificate key file which is"
bashio::log.fatal "configured using the '${keyfile}' option in the"
bashio::log.fatal "add-on configuration."
bashio::log.fatal
bashio::log.fatal "Unfortunately, the file specified in the"
bashio::log.fatal "'${keyfile}' option does not exists."
bashio::log.fatal
bashio::log.fatal "Please ensure the certificate key file exists and"
bashio::log.fatal "is placed in the Hass.io '/ssl/' directory."
bashio::log.fatal
bashio::log.fatal "In case you don't have SSL yet, consider getting"
bashio::log.fatal "a SSL certificate or setting the '${key}' option"
bashio::log.fatal "to 'false' in case you are not planning on using"
bashio::log.fatal "SSL with this add-on."
bashio::log.fatal
bashio::log.fatal "Check the add-on manual for more information."
bashio::log.fatal
bashio::exit.nok
fi
return "${__BASHIO_EXIT_OK}"
}

83
lib/const.sh Normal file
View file

@ -0,0 +1,83 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# Defaults
readonly __BASHIO_DEFAULT_LOG_LEVEL=5 # Defaults to INFO
readonly __BASHIO_DEFAULT_LOG_FORMAT="[{TIMESTAMP}] {LEVEL}: {MESSAGE}"
readonly __BASHIO_DEFAULT_LOG_TIMESTAMP="%T%z"
readonly __BASHIO_DEFAULT_HASSIO_API="http://hassio"
readonly __BASHIO_DEFAULT_HASSIO_TOKEN=""
readonly __BASHIO_DEFAULT_ADDON_CONFIG="/data/options.json"
readonly __BASHIO_DEFAULT_HIBP_ENDPOINT="https://api.pwnedpasswords.com/range"
readonly __BASHIO_DEFAULT_CACHE_DIR="/dev/shm/bashio"
readonly __BASHIO_DEFAULT_SECRETS="/config/secrets.yaml"
# Exit codes
readonly __BASHIO_EXIT_OK=0 # Successful termination
readonly __BASHIO_EXIT_NOK=1 # Termination with errors
# Log levels
readonly __BASHIO_LOG_LEVEL_ALL=8
readonly __BASHIO_LOG_LEVEL_DEBUG=6
readonly __BASHIO_LOG_LEVEL_ERROR=2
readonly __BASHIO_LOG_LEVEL_FATAL=1
readonly __BASHIO_LOG_LEVEL_INFO=5
readonly __BASHIO_LOG_LEVEL_NOTICE=4
readonly __BASHIO_LOG_LEVEL_OFF=0
readonly __BASHIO_LOG_LEVEL_TRACE=7
readonly __BASHIO_LOG_LEVEL_WARNING=3
readonly -A __BASHIO_LOG_LEVELS=(
[${__BASHIO_LOG_LEVEL_OFF}]="OFF"
[${__BASHIO_LOG_LEVEL_FATAL}]="FATAL"
[${__BASHIO_LOG_LEVEL_ERROR}]="ERROR"
[${__BASHIO_LOG_LEVEL_WARNING}]="WARNING"
[${__BASHIO_LOG_LEVEL_NOTICE}]="NOTICE"
[${__BASHIO_LOG_LEVEL_INFO}]="INFO"
[${__BASHIO_LOG_LEVEL_DEBUG}]="DEBUG"
[${__BASHIO_LOG_LEVEL_TRACE}]="TRACE"
[${__BASHIO_LOG_LEVEL_ALL}]="ALL"
)
# Colors
readonly __BASHIO_COLORS_ESCAPE="\033[";
readonly __BASHIO_COLORS_RESET="${__BASHIO_COLORS_ESCAPE}0m"
readonly __BASHIO_COLORS_DEFAULT="${__BASHIO_COLORS_ESCAPE}49m"
readonly __BASHIO_COLORS_BLACK="${__BASHIO_COLORS_ESCAPE}30m"
readonly __BASHIO_COLORS_RED="${__BASHIO_COLORS_ESCAPE}31m"
readonly __BASHIO_COLORS_GREEN="${__BASHIO_COLORS_ESCAPE}32m"
readonly __BASHIO_COLORS_YELLOW="${__BASHIO_COLORS_ESCAPE}33m"
readonly __BASHIO_COLORS_BLUE="${__BASHIO_COLORS_ESCAPE}34m"
readonly __BASHIO_COLORS_MAGENTA="${__BASHIO_COLORS_ESCAPE}35m"
readonly __BASHIO_COLORS_CYAN="${__BASHIO_COLORS_ESCAPE}36m"
readonly __BASHIO_COLORS_LIGHT_GRAY="${__BASHIO_COLORS_ESCAPE}37m"
readonly __BASHIO_COLORS_DARK_GRAY="${__BASHIO_COLORS_ESCAPE}90m"
readonly __BASHIO_COLORS_LIGHT_RED="${__BASHIO_COLORS_ESCAPE}91m"
readonly __BASHIO_COLORS_LIGHT_GREEN="${__BASHIO_COLORS_ESCAPE}92m"
readonly __BASHIO_COLORS_LIGHT_YELLOW="${__BASHIO_COLORS_ESCAPE}93m"
readonly __BASHIO_COLORS_LIGHT_BLUE="${__BASHIO_COLORS_ESCAPE}94m"
readonly __BASHIO_COLORS_LIGHT_MAGENTA="${__BASHIO_COLORS_ESCAPE}95m"
readonly __BASHIO_COLORS_LIGHT_CYAN="${__BASHIO_COLORS_ESCAPE}96m"
readonly __BASHIO_COLORS_WHITE="${__BASHIO_COLORS_ESCAPE}97m"
readonly __BASHIO_COLORS_BG_DEFAULT="${__BASHIO_COLORS_ESCAPE}49m"
readonly __BASHIO_COLORS_BG_BLACK="${__BASHIO_COLORS_ESCAPE}40m"
readonly __BASHIO_COLORS_BG_RED="${__BASHIO_COLORS_ESCAPE}41m"
readonly __BASHIO_COLORS_BG_GREEN="${__BASHIO_COLORS_ESCAPE}42m"
readonly __BASHIO_COLORS_BG_YELLOW="${__BASHIO_COLORS_ESCAPE}43m"
readonly __BASHIO_COLORS_BG_BLUE="${__BASHIO_COLORS_ESCAPE}44m"
readonly __BASHIO_COLORS_BG_MAGENTA="${__BASHIO_COLORS_ESCAPE}45m"
readonly __BASHIO_COLORS_BG_CYAN="${__BASHIO_COLORS_ESCAPE}46m"
readonly __BASHIO_COLORS_BG_LIGHT_GRAY="${__BASHIO_COLORS_ESCAPE}47m"
readonly __BASHIO_COLORS_BG_DARK_GRAY="${__BASHIO_COLORS_ESCAPE}100m"
readonly __BASHIO_COLORS_BG_LIGHT_RED="${__BASHIO_COLORS_ESCAPE}101m"
readonly __BASHIO_COLORS_BG_LIGHT_GREEN="${__BASHIO_COLORS_ESCAPE}102m"
readonly __BASHIO_COLORS_BG_LIGHT_YELLOW="${__BASHIO_COLORS_ESCAPE}103m"
readonly __BASHIO_COLORS_BG_LIGHT_BLUE="${__BASHIO_COLORS_ESCAPE}104m"
readonly __BASHIO_COLORS_BG_LIGHT_MAGENTA="${__BASHIO_COLORS_ESCAPE}105m"
readonly __BASHIO_COLORS_BG_LIGHT_CYAN="${__BASHIO_COLORS_ESCAPE}106m"
readonly __BASHIO_COLORS_BG_LIGHT_WHITE="${__BASHIO_COLORS_ESCAPE}107m"

89
lib/exit.sh Normal file
View file

@ -0,0 +1,89 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Exit the script with as failed with an optional error message.
#
# Arguments:
# $1 Error message (optional)
# ------------------------------------------------------------------------------
function bashio::exit.nok() {
local message=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${message}"; then
bashio::log.fatal "${message}"
fi
exit "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Exit the script when given value is false, with an optional error message.
#
# Arguments:
# $1 Value to check if false
# $2 Error message (optional)
# ------------------------------------------------------------------------------
function bashio::exit.die_if_false() {
local value=${1:-}
local message=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.false "${value}"; then
bashio::exit.nok "${message}"
fi
}
# ------------------------------------------------------------------------------
# Exit the script when given value is true, with an optional error message.
#
# Arguments:
# $1 Value to check if true
# $2 Error message (optional)
# ------------------------------------------------------------------------------
function hass.die_if_true() {
local value=${1:-}
local message=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.true "${value}"; then
bashio::exit.nok "${message}"
fi
}
# ------------------------------------------------------------------------------
# Exit the script when given value is empty, with an optional error message.
#
# Arguments:
# $1 Value to check if true
# $2 Error message (optional)
# ------------------------------------------------------------------------------
function hass.die_if_empty() {
local value=${1:-}
local message=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.is_empty "${value}"; then
bashio::exit.nok "${message}"
fi
}
# ------------------------------------------------------------------------------
# Exit the script nicely.
# ------------------------------------------------------------------------------
function bashio::exit.ok() {
bashio::log.trace "${FUNCNAME[0]}" "$@"
exit "${__BASHIO_EXIT_OK}"
}

80
lib/fs.sh Normal file
View file

@ -0,0 +1,80 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Check whether or not a directory exists.
#
# Arguments:
# $1 Path to directory
# ------------------------------------------------------------------------------
function bashio::fs.directory_exists() {
local directory=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -d "${directory}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Check whether or not a file exists.
#
# Arguments:
# $1 Path to file
# ------------------------------------------------------------------------------
function bashio::fs.file_exists() {
local file=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -f "${file}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Check whether or not a device exists.
#
# Arguments:
# $1 Path to device
# ------------------------------------------------------------------------------
function bashio::fs.device_exists() {
local device=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -d "${device}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Check whether or not a socket exists.
#
# Arguments:
# $1 Path to socket
# ------------------------------------------------------------------------------
function bashio::fs.socket_exists() {
local socket=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -S "${socket}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}

78
lib/hardware.sh Normal file
View file

@ -0,0 +1,78 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Returns a JSON object with hardware information about the system.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::hardware() {
local cache_key=${1:-'hardware.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'hardware.info'; then
info=$(bashio::cache.get 'hardware.info')
else
info=$(bashio::api.hassio GET /hardware/info false)
bashio::cache.set 'hardware.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns a list of available serial devices on the host system.
# ------------------------------------------------------------------------------
function bashio::hardware.serial() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hardware 'hardware.info.serial' '.serial[]'
}
# ------------------------------------------------------------------------------
# Returns a list of available input devices on the host system.
# ------------------------------------------------------------------------------
function bashio::hardware.input() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hardware 'hardware.info.input' '.input[]'
}
# ------------------------------------------------------------------------------
# Returns a list of available disk devices on the host system.
# ------------------------------------------------------------------------------
function bashio::hardware.disk() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hardware 'hardware.info.disk' '.disk[]'
}
# ------------------------------------------------------------------------------
# Returns a list of available GPIO on the host system.
# ------------------------------------------------------------------------------
function bashio::hardware.gpio() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hardware 'hardware.info.gpio' '.gpio[]'
}

172
lib/hassos.sh Normal file
View file

@ -0,0 +1,172 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Updates HassOS to the latest version.
#
# Arguments:
# $1 Version to update to (optional)
# ------------------------------------------------------------------------------
function bashio::hassos.update() {
local version=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${version}"; then
version=$(bashio::var.json version "${version}")
bashio::api.hassio POST /hassos/update "${version}"
else
bashio::api.hassio POST /hassos/update
fi
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Updates HassOS CLI to the latest version.
#
# Arguments:
# $1 Version to update to (optional)
# ------------------------------------------------------------------------------
function bashio::hassos.update_cli() {
local version=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${version}"; then
version=$(bashio::var.json version "${version}")
bashio::api.hassio POST /hassos/update/cli "${version}"
else
bashio::api.hassio POST /hassos/update/cli
fi
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Load HassOS host configuration from USB stick.
# ------------------------------------------------------------------------------
function bashio::hassos.config_sync() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /hassos/config/sync
}
# ------------------------------------------------------------------------------
# Returns a JSON object with generic Home Asssistant information.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::hassos() {
local cache_key=${1:-'hassos.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'hassos.info'; then
info=$(bashio::cache.get 'hassio.hassos')
else
info=$(bashio::api.hassio GET /hassos/info false)
bashio::cache.set 'hassos.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the version of HassOS.
# ------------------------------------------------------------------------------
function bashio::hassos.version() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassos 'hassos.info.version' '.version'
}
# ------------------------------------------------------------------------------
# Returns the latest version of HassOS.
# ------------------------------------------------------------------------------
function bashio::hassos.version_latest() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassos 'hassos.info.version_latest' '.version_latest'
}
# ------------------------------------------------------------------------------
# Checks if there is an update available for the Supervisor.
# ------------------------------------------------------------------------------
function bashio::hassos.update_available() {
local version
local last_version
bashio::log.trace "${FUNCNAME[0]}"
version=$(bashio::hassos.version)
last_version=$(bashio::hassos.last_version)
if [[ "${version}" = "${last_version}" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the CLI version of HassOS.
# ------------------------------------------------------------------------------
function bashio::hassos.version_cli() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassos 'hassos.info.version_cli' '.version_cli'
}
# ------------------------------------------------------------------------------
# Returns the latest CLI version of HassOS.
# ------------------------------------------------------------------------------
function bashio::hassos.version_cli_latest() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassos 'hassos.info.version_cli_latest' '.version_cli_latest'
}
# ------------------------------------------------------------------------------
# Checks if there is an update available for the Supervisor.
# ------------------------------------------------------------------------------
function bashio::hassos.update_available_cli() {
local version
local last_version
bashio::log.trace "${FUNCNAME[0]}"
version=$(bashio::hassos.version_cli)
last_version=$(bashio::hassos.version_cli_latest)
if [[ "${version}" = "${last_version}" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the board running HassOS.
# ------------------------------------------------------------------------------
function bashio::hassos.board() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassos 'hassos.info.board' '.board'
}

323
lib/homeassistant.sh Normal file
View file

@ -0,0 +1,323 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Starts Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.start() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /homeassistant/start
}
# ------------------------------------------------------------------------------
# Stops Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.stop() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /homeassistant/stop
}
# ------------------------------------------------------------------------------
# Restarts Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.restart() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /homeassistant/restart
}
# ------------------------------------------------------------------------------
# Updates Home Assistant to the latest version.
#
# Arguments:
# $1 Version to update to (optional)
# ------------------------------------------------------------------------------
function bashio::homeassistant.update() {
local version=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${version}"; then
version=$(bashio::var.json version "${version}")
bashio::api.hassio POST /homeassistant/update "${version}"
else
bashio::api.hassio POST /homeassistant/update
fi
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Checks/validates your Home Assistant configuration.
# ------------------------------------------------------------------------------
function bashio::homeassistant.check() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /homeassistant/check
}
# ------------------------------------------------------------------------------
# Returns the logs created by Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.logs() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio GET /homeassistant/logs true
}
# ------------------------------------------------------------------------------
# Returns a JSON object with generic Home Asssistant information.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::homeassistant() {
local cache_key=${1:-'homeassistant.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'homeassistant.info'; then
info=$(bashio::cache.get 'hassio.homeassistant')
else
info=$(bashio::api.hassio GET /homeassistant/info false)
bashio::cache.set 'homeassistant.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the version of Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.version() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.version' '.version'
}
# ------------------------------------------------------------------------------
# Returns the latest version of Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.last_version() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.last_version' '.last_version'
}
# ------------------------------------------------------------------------------
# Checks if there is an update available for the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.update_available() {
local version
local last_version
bashio::log.trace "${FUNCNAME[0]}"
version=$(bashio::homeassistant.version)
last_version=$(bashio::homeassistant.last_version)
if [[ "${version}" = "${last_version}" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the arch of Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.arch() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.arch' '.arch'
}
# ------------------------------------------------------------------------------
# Returns the machine info running Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.machine() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.machine' '.machine'
}
# ------------------------------------------------------------------------------
# Returns the Docker image of Home Assistant.
#
# Arguments:
# $1 Image to set (optional).
# ------------------------------------------------------------------------------
function bashio::homeassistant.image() {
local image=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${image}"; then
image=$(bashio::var.json image "${image}")
bashio::api.hassio POST /homeassistant/options "${image}"
bashio::cache.flush_all
else
bashio::homeassistant 'homeassistant.info.image' '.image'
fi
}
# ------------------------------------------------------------------------------
# Returns whether or not a custom version of Home Assistant is installed.
# ------------------------------------------------------------------------------
function bashio::homeassistant.custom() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.custom' '.custom // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not Home Assistant starts at device boot.
# ------------------------------------------------------------------------------
function bashio::homeassistant.boot() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.boot' '.boot // false'
# ------------------------------------------------------------------------------
}
# Returns the port number on which Home Assistant is running.
# ------------------------------------------------------------------------------
function bashio::homeassistant.port() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.port' '.port'
}
# ------------------------------------------------------------------------------
# Returns whether or not Home Assistant is running on SSL.
# ------------------------------------------------------------------------------
function bashio::homeassistant.ssl() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant 'homeassistant.info.ssl' '.ssl // false'
}
# ------------------------------------------------------------------------------
# Returns or sets whether or not Home Assistant is monitored by Watchdog.
#
# Arguments:
# $1 True to enable watchdog, false otherwise (optional).
# ------------------------------------------------------------------------------
function bashio::homeassistant.watchdog() {
local watchdog=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${wait}"; then
watchdog=$(bashio::var.json watchdog "^${watchdog}")
bashio::api.hassio POST /homeassistant/options "${watchdog}"
bashio::cache.flush_all
else
bashio::homeassistant 'homeassistant.info.watchdog' '.watchdog // false'
fi
}
# ------------------------------------------------------------------------------
# List all available stats about Home Assistant.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::homeassistant.stats() {
local cache_key=${1:-'homeassistant.stats'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'homeassistant.stats'; then
info=$(bashio::cache.get 'homeassistant.stats')
else
info=$(bashio::api.hassio GET /homeassistant/stats false)
bashio::cache.set 'homeassistant.stats' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns CPU usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.cpu_percent() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.cpu_percent' '.cpu_percent'
}
# ------------------------------------------------------------------------------
# Returns memory usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.memory_usage() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.memory_usage' '.memory_usage'
}
# ------------------------------------------------------------------------------
# Returns memory limit from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.memory_limit() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.memory_limit' '.memory_limit'
}
# ------------------------------------------------------------------------------
# Returns outgoing network usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.network_tx() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.network_tx' '.network_tx'
}
# ------------------------------------------------------------------------------
# Returns incoming network usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.network_rx() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.network_rx' '.network_rx'
}
# ------------------------------------------------------------------------------
# Returns disk read usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.blk_read() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.blk_read' '.blk_read'
}
# ------------------------------------------------------------------------------
# Returns disk write usage from Home Assistant.
# ------------------------------------------------------------------------------
function bashio::homeassistant.blk_write() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::homeassistant.stats 'homeassistant.stats.blk_write' '.blk_write'
}

135
lib/host.sh Normal file
View file

@ -0,0 +1,135 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Reload the host controller.
# ------------------------------------------------------------------------------
function bashio::host.reload() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /host/reload
}
# ------------------------------------------------------------------------------
# Shuts down the host system.
# ------------------------------------------------------------------------------
function bashio::host.shutdown() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /host/shutdown
}
# ------------------------------------------------------------------------------
# Reboots the host system.
# ------------------------------------------------------------------------------
function bashio::host.reboot() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /host/reboot
}
# ------------------------------------------------------------------------------
# Returns a JSON object with generic Host information.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::host() {
local cache_key=${1:-'host.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'host.info'; then
info=$(bashio::cache.get 'host.info')
else
info=$(bashio::api.hassio GET /host/info false)
bashio::cache.set 'host.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the hostname of the host system.
# ------------------------------------------------------------------------------
function bashio::host.hostname() {
local hostname=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${hostname}"; then
hostname=$(bashio::var.json hostname "${hostname}")
bashio::api.hassio POST /host/options "${hostname}"
bashio::cache.flush_all
else
bashio::host 'host.info.hostname' '.hostname'
fi
}
# ------------------------------------------------------------------------------
# Returns a list of exposed features by the host.
# ------------------------------------------------------------------------------
function bashio::host.features() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.features' '.features[]'
}
# ------------------------------------------------------------------------------
# Returns the OS of the host system.
# ------------------------------------------------------------------------------
function bashio::host.operating_system() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.operating_system' '.operating_system'
}
# ------------------------------------------------------------------------------
# Returns the kernel of the host system.
# ------------------------------------------------------------------------------
function bashio::host.kernel() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.kernel' '.kernel'
}
# ------------------------------------------------------------------------------
# Returns the chassis of the host system.
# ------------------------------------------------------------------------------
function bashio::host.chassis() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.chassis' '.chassis'
}
# ------------------------------------------------------------------------------
# Returns the stability channel / deployment of the system.
# ------------------------------------------------------------------------------
function bashio::host.deployment() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.deployment' '.deployment'
}
# ------------------------------------------------------------------------------
# Returns the cpe from the host.
# ------------------------------------------------------------------------------
function bashio::host.cpe() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::host 'host.info.cpe' '.cpe'
}

110
lib/info.sh Normal file
View file

@ -0,0 +1,110 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Returns a JSON object with generic version information about the system.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::info() {
local cache_key=${1:-'hassio.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'hassio.info'; then
info=$(bashio::cache.get 'hassio.info')
else
info=$(bashio::api.hassio GET /info false)
bashio::cache.set 'hassio.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the Hass.io supervisor version used.
# ------------------------------------------------------------------------------
function bashio::info.supervisor() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::hassio::info 'hassio.info.supervisor' '.supervisor'
}
# ------------------------------------------------------------------------------
# Returns the Home Assistant version used.
# ------------------------------------------------------------------------------
function bashio::info.homeassistant() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.homeassistant' '.homeassistant'
}
# ------------------------------------------------------------------------------
# Returns the hassos version running on the host system.
# ------------------------------------------------------------------------------
function bashio::info.hassos() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.hassos' '.hassos'
}
# ------------------------------------------------------------------------------
# Returns the hostname of the host system.
# ------------------------------------------------------------------------------
function bashio::info.hostname() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.hostname' '.hostname'
}
# ------------------------------------------------------------------------------
# Returns the machine type used.
# ------------------------------------------------------------------------------
function bashio::info.machine() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.machine' '.machine'
}
# ------------------------------------------------------------------------------
# Returns the architecture of the machine.
# ------------------------------------------------------------------------------
function bashio::info.arch() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.arch' '.arch'
}
# ------------------------------------------------------------------------------
# Returns the stability channel the system is enrolled in.
# ------------------------------------------------------------------------------
function bashio::info.channel() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.channel' '.channel'
}
# ------------------------------------------------------------------------------
# Returns a list of supported architectures by this system.
# ------------------------------------------------------------------------------
function bashio::info.supported_arch() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::info 'hassio.info.supported_arch' '.supported_arch[]'
}

173
lib/jq.sh Normal file
View file

@ -0,0 +1,173 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Execute a JSON query.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -f "${data}" ]]; then
jq --raw-output -c -M "$filter" "${data}"
else
jq --raw-output -c -M "$filter" <<< "${data}"
fi
}
# ------------------------------------------------------------------------------
# Checks if variable exists (optionally after filtering).
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.exists() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ $(bashio::jq "${data}" "${filter}") = "null" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if data exists (optionally after filtering).
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.has_value() {
local data=${1}
local filter=${2:-}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::jq "${data}" \
"${filter} | if (. == {} or . == []) then empty else . end // empty")
if ! hass.has_value "${value}"; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is of a specific type.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter
# $3 type (boolean, string, number, array, object, null)
# ------------------------------------------------------------------------------
function bashio::jq.is() {
local data=${1}
local filter=${2}
local type=${3}
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
value=$(bashio::jq "${data}" \
"${filter} | if type==\"${type}\" then true else false end")
if [[ "${value}" = "false" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is a boolean.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.is_boolean() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::jq.is "${data}" "${filter}" "boolean"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is a string.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.is_string() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::jq.is "${data}" "${filter}" "string"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is an object.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.is_object() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::jq.is "${data}" "${filter}" "object"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is a number.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.is_number() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::jq.is "${data}" "${filter}" "number"
}
# ------------------------------------------------------------------------------
# Checks if resulting data is an array.
#
# Arguments:
# $1 JSON string or path to a JSON file
# $2 jq filter (optional)
# ------------------------------------------------------------------------------
function bashio::jq.is_array() {
local data=${1}
local filter=${2:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
bashio::jq.is "${data}" "${filter}" "array"
}

128
lib/log.sh Normal file
View file

@ -0,0 +1,128 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Log a message
#
# Arguments:
# $1 Log level
# $2 Message to display
# ------------------------------------------------------------------------------
function bashio::log.log() {
local level=${1}
local message=${2}
local timestamp
local output
if [[ "${level}" -gt "${__BASHIO_LOG_LEVEL}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
timestamp=$(date +"${__BASHIO_LOG_TIMESTAMP}")
output="${__BASHIO_LOG_FORMAT}"
output="${output//\{TIMESTAMP\}/${timestamp}}"
output="${output//\{MESSAGE\}/${message}}"
output="${output//\{LEVEL\}/${__BASHIO_LOG_LEVELS[$level]}}"
echo "${output}" >&2
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Log a message @ trace level
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.trace() {
local message=$*
bashio::color.dark_grey >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_TRACE}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ debug level.
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.debug() {
local message=$*
bashio::color.dark_grey >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_DEBUG}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ info level
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.info() {
local message=$*
bashio::color.light_blue >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_INFO}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ notice level.
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.notice() {
local message=$*
bashio::color.cyan >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_NOTICE}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ warning level.
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.warning() {
local message=$*
bashio::color.yellow >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_WARNING}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ error level.
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.error() {
local message=$*
bashio::color.magenta >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_ERROR}" "${message}"
bashio::color.reset >&2
}
# ------------------------------------------------------------------------------
# Log a message @ fatal level.
#
# Arguments:
# $* Message to display
# ------------------------------------------------------------------------------
function bashio::log.fatal() {
local message=$*
bashio::color.red >&2
bashio::log.log "${__BASHIO_LOG_LEVEL_FATAL}" "${message}"
bashio::color.reset >&2
}

140
lib/pwned.sh Normal file
View file

@ -0,0 +1,140 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Checks if a given password is safe to use.
#
# Arguments:
# $1 The password to check
# ------------------------------------------------------------------------------
function bashio::pwned.is_safe_password() {
local password="${1}"
local occurances
bashio::log.trace "${FUNCNAME[0]}" "<REDACTED PASSWORD>"
if ! occurances=$(bashio::pwned "${password}"); then
bashio::log.warning "Could not check password, assuming it is safe."
return "${__BASHIO_EXIT_OK}"
fi
if [[ "${occurances}" -ne 0 ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Gets the number of occurances of the password in the list.
#
# Arguments:
# $1 The password to check
# ------------------------------------------------------------------------------
function bashio::pwned.occurances() {
local password="${1}"
local occurances
bashio::log.trace "${FUNCNAME[0]}" "<REDACTED PASSWORD>"
if ! occurances=$(bashio::pwned "${password}"); then
occurances="0"
fi
echo -n "${occurances}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Makes a call to the Have I Been Pwned password database
#
# Arguments:
# $1 The password to check
# ------------------------------------------------------------------------------
function bashio::pwned() {
local password="${1}"
local response
local status
local hibp_hash
local count
bashio::log.trace "${FUNCNAME[0]}" "${password//./x}"
# Do not check empty password
if ! bashio::var.has_value "${password}"; then
bashio::log.warning 'Cannot check empty password against HaveIBeenPwned.'
return "${__BASHIO_EXIT_NOK}"
fi
# Hash the password
password=$(echo -n "${password}" \
| sha1sum \
| tr '[:lower:]' '[:upper:]' \
| awk -F' ' '{ print $1 }'
)
bashio::log.debug "Password SHA1: ${password}"
# Check with have I Been Powned, only send the first 5 chars of the hash
if ! response=$(curl \
--silent \
--show-error \
--write-out '\n%{http_code}' \
--request GET \
"${__BASHIO_HIBP_ENDPOINT}/${password:0:5}"
); then
bashio::log.debug "${response}"
bashio::log.error "Something went wrong contacting the HIBP API"
return "${__BASHIO_EXIT_NOK}"
fi
status=${response##*$'\n'}
response=${response%$status}
bashio::log.debug "Requested API resource: ${__BASHIO_HIBP_ENDPOINT}/${password:0:5}"
bashio::log.debug "API HTTP Response code: ${status}"
bashio::log.trace "API Response: ${response}"
if [[ "${status}" -eq 429 ]]; then
bashio::log.error "HIBP Rate limit exceeded."
return "${__BASHIO_EXIT_NOK}"
fi
if [[ "${status}" -eq 503 ]]; then
bashio::log.error "HIBP Service unavailable."
return "${__BASHIO_EXIT_NOK}"
fi
if [[ "${status}" -ne 200 ]]; then
bashio::log.error "Unknown HIBP HTTP error occured."
return "${__BASHIO_EXIT_NOK}"
fi
# Check the list of returned hashes for a match
for hibp_hash in ${response}; do
if [[ "${password:5:35}" == "${hibp_hash%%:*}" ]]; then
# Found a match! This is bad :(
count=$(echo "${hibp_hash#*:}" | tr -d '\r')
bashio::log.warning \
"Password is in the Have I Been Pwned database!"
bashio::log.warning \
"Password appeared ${count} times!"
echo "${count}"
# Well, at least the execution of this function succeeded.
return "${__BASHIO_EXIT_OK}"
fi
done
# Password was not found
echo "0"
bashio::log.info "Password is NOT in the Have I Been Pwned database! Nice!"
return "${__BASHIO_EXIT_OK}"
}

106
lib/repositories.sh Normal file
View file

@ -0,0 +1,106 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Returns a JSON object with generic version information about repositories.
#
# Arguments:
# $1 Add-on slug (optional)
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::repositories() {
local slug=${1:-false}
local cache_key=${2:-'repositories.list'}
local filter=${3:-'.repositories[].slug'}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::var.false "${slug}"; then
if bashio::cache.exists "repositories.list"; then
info=$(bashio::cache.get 'repositories.list')
else
info=$(bashio::api.hassio GET "/addons" false)
bashio::cache.set "repositories.list" "${info}"
fi
else
if bashio::cache.exists "repositories.${slug}.info"; then
info=$(bashio::cache.get "repositories.${slug}.info")
else
info=$(bashio::api.hassio GET "/addons" \
false ".repositories[] | select(.slug==\"${slug}\")")
bashio::cache.set "repositories.${slug}.info" "${info}"
fi
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the name of a repository.
#
# Arguments:
# $1 Repository slug
# ------------------------------------------------------------------------------
function bashio::repository.name() {
local slug=${1}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::repositories "${slug}" "repositories.${slug}.name" '.name'
}
# ------------------------------------------------------------------------------
# Returns the source of a repository.
#
# Arguments:
# $1 Repository slug
# ------------------------------------------------------------------------------
function bashio::repository.source() {
local slug=${1}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::repositories "${slug}" "repositories.${slug}.source" '.source'
}
# ------------------------------------------------------------------------------
# Returns the URL of a repository.
#
# Arguments:
# $1 Repository slug
# ------------------------------------------------------------------------------
function bashio::repository.url() {
local slug=${1}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::repositories "${slug}" "repositories.${slug}.url" '.url'
}
# ------------------------------------------------------------------------------
# Returns the maintainer of a repository.
#
# Arguments:
# $1 Repository slug
# ------------------------------------------------------------------------------
function bashio::repository.maintainer() {
local slug=${1}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::repositories "${slug}" "repositories.${slug}.maintainer" '.maintainer'
}

61
lib/secrets.sh Normal file
View file

@ -0,0 +1,61 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Gets a secret value by key from secrets.yaml.
#
# Arguments:
# $1 Secret key
# ------------------------------------------------------------------------------
bashio::secret() {
local key=${1}
local secret
local value
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if ! bashio::fs.directory_exists "$(dirname "${__BASHIO_HA_SECRETS}")"; then
bashio::log.error "This add-on does not support secrets!"
return "${__BASHIO_EXIT_NOK}"
fi
if ! bashio::fs.file_exists "${__BASHIO_HA_SECRETS}"; then
bashio::log.error \
"A secret was requested, but could not find a secrets.yaml"
return "${__BASHIO_EXIT_NOK}"
fi
secret="${key#'!secret '}"
value=$(yq read "${__BASHIO_HA_SECRETS}" "${secret}" )
if [[ "${value}" = "null" ]]; then
bashio::log.error "Secret ${secret} not found in secrets.yaml file."
return "${__BASHIO_EXIT_NOK}"
fi
printf "%s" "${value}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Tells whether or not a string might be a secret.
#
# Arguments:
# $1 String to check for a secret
# ------------------------------------------------------------------------------
bashio::is_secret() {
local string="${1}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ "${string}" != '!secret '* ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}

96
lib/string.sh Normal file
View file

@ -0,0 +1,96 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Converts a string to lower case.
#
# Arguments:
# $1 String to convert
# ------------------------------------------------------------------------------
function bashio::string.lower() {
local string="${1}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
printf "%s" "${string,,}"
}
# ------------------------------------------------------------------------------
# Converts a string to upper case.
#
# Arguments:
# $1 String to convert
# ------------------------------------------------------------------------------
function bashio::string.upper() {
local string="${1}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
printf "%s" "${string^^}"
}
# ------------------------------------------------------------------------------
# Replaces parts of the string with an other string.
#
# Arguments:
# $1 String to make replacements in
# $2 String part to replace
# $3 String replacement
# ------------------------------------------------------------------------------
function bashio::string.replace() {
local string="${1}"
local needle="${2}"
local replacement="${3}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
printf "%s" "${string//${needle}/${replacement}}"
}
# ------------------------------------------------------------------------------
# Returns the length of a string.
#
# Arguments:
# $1 String to determine the length of
# ------------------------------------------------------------------------------
bashio::string.length() {
local string="${1}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
printf "%s" "${#string}"
}
# ------------------------------------------------------------------------------
# Returns a substring of a string.
#
# stringZ=abcABC123ABCabc
# hass.string.substring "${stringZ}" 0 # abcABC123ABCabc
# hass.string.substring "${stringZ}" 1 # bcABC123ABCabc
# hass.string.substring "${stringZ}" 7 # 23ABCabc
# hass.string.substring "${stringZ}" 7 3 # 23AB
#
# Arguments:
# $1 String to return a substring off
# $2 Position to start
# $3 Length of the substring (optional)
# ------------------------------------------------------------------------------
bashio::string.substring() {
local string="${1}"
local position="${2}"
local length="${3:-}"
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${length}"; then
printf "%s" "${string:${position}:${length}}"
else
printf "%s" "${string:${position}}"
fi
}

304
lib/supervisor.sh Normal file
View file

@ -0,0 +1,304 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Check to see if the Supervisor is still alive.
# ------------------------------------------------------------------------------
function bashio::supervisor.ping() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio GET /supervisor/ping
}
# ------------------------------------------------------------------------------
# Updates the Supervisor to the latest version.
#
# Arguments:
# $1 Version to update to (optional)
# ------------------------------------------------------------------------------
function bashio::supervisor.update() {
local version=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${version}"; then
version=$(bashio::var.json version "${version}")
bashio::api.hassio POST /supervisor/update "${version}"
else
bashio::api.hassio POST /supervisor/update
fi
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Reloads the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.reload() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio POST /supervisor/reload
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Returns the logs created by the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.logs() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.hassio GET /supervisor/logs true
}
# ------------------------------------------------------------------------------
# Returns a JSON object with generic version information about the system.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::supervisor() {
local cache_key=${1:-'supervisor.info'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'supervisor.info'; then
info=$(bashio::cache.get 'supervisor.info')
else
info=$(bashio::api.hassio GET /supervisor/info false)
bashio::cache.set 'supervisor.info' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the Hass.io supervisor version used.
# ------------------------------------------------------------------------------
function bashio::supervisor.version() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor 'supervisor.info.version' '.version'
}
# ------------------------------------------------------------------------------
# Returns the latest version of the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.last_version() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor 'supervisor.info.last_version' '.last_version'
}
# ------------------------------------------------------------------------------
# Checks if there is an update available for the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.update_available() {
local version
local last_version
bashio::log.trace "${FUNCNAME[0]}"
version=$(bashio::supervisor.version)
last_version=$(bashio::supervisor.last_version)
if [[ "${version}" = "${last_version}" ]]; then
return "${__BASHIO_EXIT_NOK}"
fi
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns the architecture of the system.
# ------------------------------------------------------------------------------
function bashio::supervisor.arch() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor 'supervisor.info.arch' '.arch'
}
# ------------------------------------------------------------------------------
# Returns or sets the stability channel of the setup.
#
# Arguments:
# $1 Stability channel to switch to: stable, beta or dev (optional).
# ------------------------------------------------------------------------------
function bashio::supervisor.channel() {
local channel=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${channel}"; then
channel=$(bashio::var.json channel "${channel}")
bashio::api.hassio POST /supervisor/options "${channel}"
bashio::cache.flush_all
else
bashio::supervisor 'supervisor.info.channel' '.channel // false'
fi
}
# ------------------------------------------------------------------------------
# Returns or sets the current timezone of the system.
#
# Arguments:
# $1 Timezone to set (optional).
# ------------------------------------------------------------------------------
function bashio::supervisor.timezone() {
local timezone=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${channel}"; then
channel=$(bashio::var.json timezone "${timezone}")
bashio::api.hassio POST /supervisor/options "${timezone}"
bashio::cache.flush_all
else
bashio::supervisor 'supervisor.info.timezone' '.timezone'
fi
}
# ------------------------------------------------------------------------------
# Returns the time to wait after boot in seconds.
#
# Arguments:
# $1 Timezone to set (optional).
# ------------------------------------------------------------------------------
function bashio::supervisor.wait_boot() {
local wait=${1:-}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if bashio::var.has_value "${wait}"; then
wait=$(bashio::var.json wait_boot "${wait}")
bashio::api.hassio POST /supervisor/options "${wait}"
bashio::cache.flush_all
else
bashio::supervisor 'supervisor.info.wait_boot' '.wait_boot'
fi
}
# ------------------------------------------------------------------------------
# Returns a list of add-on slugs of the add-ons installed.
# ------------------------------------------------------------------------------
function bashio::supervisor.addons() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor 'supervisor.info.addons' '.addons[].slug'
}
# ------------------------------------------------------------------------------
# Returns a list of add-on repositories installed.
# ------------------------------------------------------------------------------
function bashio::supervisor.addons_repositories() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor 'supervisor.info.addons_repositories' '.addons_repositories[]'
}
# ------------------------------------------------------------------------------
# List all available stats about the Supervisor.
#
# Arguments:
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::supervisor.stats() {
local cache_key=${1:-'supervisor.stats'}
local filter=${2:-}
local info
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
if bashio::cache.exists 'supervisor.stats'; then
info=$(bashio::cache.get 'supervisor.stats')
else
info=$(bashio::api.hassio GET /supervisor/stats false)
bashio::cache.set 'supervisor.stats' "${info}"
fi
response="${info}"
if bashio::var.has_value "${filter}"; then
response=$(bashio::jq "${info}" "${filter}")
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns CPU usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.cpu_percent() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.cpu_percent' '.cpu_percent'
}
# ------------------------------------------------------------------------------
# Returns memory usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.memory_usage() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.memory_usage' '.memory_usage'
}
# ------------------------------------------------------------------------------
# Returns memory limit from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.memory_limit() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.memory_limit' '.memory_limit'
}
# ------------------------------------------------------------------------------
# Returns outgoing network usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.network_tx() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.network_tx' '.network_tx'
}
# ------------------------------------------------------------------------------
# Returns incoming network usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.network_rx() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.network_rx' '.network_rx'
}
# ------------------------------------------------------------------------------
# Returns disk read usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.blk_read() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.blk_read' '.blk_read'
}
# ------------------------------------------------------------------------------
# Returns disk write usage from the Supervisor.
# ------------------------------------------------------------------------------
function bashio::supervisor.blk_write() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::supervisor.stats 'supervisor.stats.blk_write' '.blk_write'
}

156
lib/var.sh Normal file
View file

@ -0,0 +1,156 @@
#!/usr/bin/env bash
# ==============================================================================
# Community Hass.io Add-ons: Bashio
# Bashio is an bash function library for use with Hass.io add-ons.
#
# It contains a set of commonly used operations and can be used
# to be included in add-on scripts to reduce code duplication across add-ons.
# ==============================================================================
# ------------------------------------------------------------------------------
# Checks if a give value is true.
#
# Arguments:
# $1 value
# ------------------------------------------------------------------------------
function bashio::var.true() {
local value=${1:-null}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ "${value}" = "true" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Checks if a give value is false.
#
# Arguments:
# $1 value
# ------------------------------------------------------------------------------
function bashio::var.false() {
local value=${1:-null}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ "${value}" = "false" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Checks if a global variable is defined.
#
# Arguments:
# $1 Name of the variable
# ------------------------------------------------------------------------------
bashio::var.defined() {
local variable=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
[[ "${!variable-X}" = "${!variable-Y}" ]]
}
# ------------------------------------------------------------------------------
# Checks if a value has actual value.
#
# Arguments:
# $1 Value
# ------------------------------------------------------------------------------
function bashio::var.has_value() {
local value=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -n "${value}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Checks if a value is empty.
#
# Arguments:
# $1 Value
# ------------------------------------------------------------------------------
function bashio::var.is_empty() {
local value=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -z "${value}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Checks if a value equals.
#
# Arguments:
# $1 Value
# ------------------------------------------------------------------------------
function bashio::var.is_empty() {
local value=${1}
bashio::log.trace "${FUNCNAME[0]}:" "$@"
if [[ -z "${value}" ]]; then
return "${__BASHIO_EXIT_OK}"
fi
return "${__BASHIO_EXIT_NOK}"
}
# ------------------------------------------------------------------------------
# Creates JSON based on function arguments.
#
# Arguments:
# $@ Bash array of key/value pairs, prefix integer or boolean values with ^
# ------------------------------------------------------------------------------
function bashio::var.json() {
local data=("$@");
local number_of_items=${#data[@]}
local json=''
local separator
local counter
local item
if [[ ${number_of_items} -eq 0 ]]; then
bashio::log.error "Length of input array needs to be at least 2"
return "${__BASHIO_EXIT_NOK}"
fi
if [[ $((number_of_items%2)) -eq 1 ]]; then
bashio::log.error "Length of input array needs to be even (key/value pairs)"
return "${__BASHIO_EXIT_NOK}"
fi
counter=0;
for i in "${data[@]}"; do
separator=","
if [ $((++counter%2)) -eq 0 ]; then
separator=":";
fi
item="\"$i\""
if [[ "${i:0:1}" == "^" ]]; then
item="${i:1}"
fi
json="$json$separator$item";
done
echo "{${json:1}}";
return "${__BASHIO_EXIT_OK}"
}