bashio/lib/addons.sh
2025-04-22 12:28:35 +02:00

1411 lines
49 KiB
Bash

#!/usr/bin/env bash
# ==============================================================================
# Home Assistant Community Add-ons: Bashio
# Bashio is a bash function library for use with Home Assistant 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.
# ==============================================================================
# ------------------------------------------------------------------------------
# Reloads the add-ons.
# ------------------------------------------------------------------------------
function bashio::addons.reload() {
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST /addons/reload
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Start the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.start() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/start"
}
# ------------------------------------------------------------------------------
# Restart the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.restart() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/restart"
}
# ------------------------------------------------------------------------------
# Stop the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.stop() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/stop"
}
# ------------------------------------------------------------------------------
# Install the specified add-on.
#
# Arguments:
# $1 Add-on slug
# ------------------------------------------------------------------------------
function bashio::addon.install() {
local slug=${1}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/install"
}
# ------------------------------------------------------------------------------
# Rebuild the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.rebuild() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/rebuild"
}
# ------------------------------------------------------------------------------
# Uninstall the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.uninstall() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/uninstall"
}
# ------------------------------------------------------------------------------
# Update the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.update() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor POST "/addons/${slug}/update"
}
# ------------------------------------------------------------------------------
# RAW Docker logs of the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.logs() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor GET "/addons/${slug}/logs" true
}
# ------------------------------------------------------------------------------
# Returns the documentation of the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.documentation() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor GET "/addons/${slug}/documentation" true
}
# ------------------------------------------------------------------------------
# Returns the changelog of the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.changelog() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}"
bashio::api.supervisor GET "/addons/${slug}/changelog" true
}
# ------------------------------------------------------------------------------
# Returns a JSON object with generic version information about addons.
#
# 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::addons() {
local slug=${1:-false}
local cache_key=${2:-'addons.list'}
local filter=${3:-'.addons[].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 "addons.list"; then
info=$(bashio::cache.get 'addons.list')
else
info=$(bashio::api.supervisor GET "/addons" false)
if [ "$?" -ne "${__BASHIO_EXIT_OK}" ]; then
bashio::log.error "Failed to get addons from Supervisor API"
return "${__BASHIO_EXIT_NOK}"
fi
bashio::cache.set "addons.list" "${info}"
fi
else
if bashio::cache.exists "addons.${slug}.info"; then
info=$(bashio::cache.get "addons.${slug}.info")
else
info=$(bashio::api.supervisor GET "/addons/${slug}/info" false)
if [ "$?" -ne "${__BASHIO_EXIT_OK}" ]; then
bashio::log.error "Failed to get addon info from Supervisor API"
return "${__BASHIO_EXIT_NOK}"
fi
bashio::cache.set "addons.${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 a list of installed add-ons or for a specific add-ons.
# Arguments:
# $1 Add-on slug (optional)
# ------------------------------------------------------------------------------
function bashio::addons.installed() {
local slug=${1:-false}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.false "${slug}"; then
bashio::addons \
false \
'addons.info.installed' \
'.addons[] | select(.installed != null) | .slug'
else
bashio::addons \
"${slug}" \
"addons.${slug}.installed" \
'if (.version != null) then true else false end'
fi
}
# ------------------------------------------------------------------------------
# Returns the name of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.name() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.name" '.name'
}
# ------------------------------------------------------------------------------
# Returns the hostname of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.hostname() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.hostname" '.hostname'
}
# ------------------------------------------------------------------------------
# Returns a list of DNS names for the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.dns() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.dns" '.dns // empty | .[]'
}
# ------------------------------------------------------------------------------
# Returns the description of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.description() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.description" '.description'
}
# ------------------------------------------------------------------------------
# Returns the long description of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.long_description() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.long_description" \
'.long_description'
}
# ------------------------------------------------------------------------------
# Returns or sets whether or not auto update is enabled for this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# $2 Set current auto update state (Optional)
# ------------------------------------------------------------------------------
function bashio::addon.auto_update() {
local slug=${1:-'self'}
local auto_update=${2:-}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.has_value "${auto_update}"; then
auto_update=$(bashio::var.json auto_update "^${auto_update}")
bashio::api.supervisor POST "/addons/${slug}/options" "${auto_update}"
bashio::cache.flush_all
else
bashio::addons \
"${slug}" \
"addons.${slug}.auto_update" \
'.auto_update // false'
fi
}
# ------------------------------------------------------------------------------
# Returns the URL of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.url() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.url" '.url'
}
# ------------------------------------------------------------------------------
# Returns the detached state of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.detached() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.detached" '.detached // false'
}
# ------------------------------------------------------------------------------
# Returns the availability state of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.available() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.available" '.available // false'
}
# ------------------------------------------------------------------------------
# Returns is this is an advanced add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.advanced() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.advanced" '.advanced // false'
}
# ------------------------------------------------------------------------------
# Returns the stage the add-on is currently in.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.stage() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.stage" '.stage'
}
# ------------------------------------------------------------------------------
# Returns the phase the add-on is started up.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.startup() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.startup" '.startup'
}
# ------------------------------------------------------------------------------
# Returns list of supported architectures by the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.arch() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.arch" '.arch[]'
}
# ------------------------------------------------------------------------------
# Returns list of supported machine types by the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.machine() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.machine" '.machine[]'
}
# ------------------------------------------------------------------------------
# Returns the slug of the repository this add-on is in.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.repository() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.repository" '.repository'
}
# ------------------------------------------------------------------------------
# Returns the version of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.version() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.version" '.version'
}
# ------------------------------------------------------------------------------
# Returns the latest version of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.version_latest() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.version_latest" '.version_latest'
}
# ------------------------------------------------------------------------------
# Checks if there is an update available for an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.update_available() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.update_available" \
'.update_available // false'
}
# ------------------------------------------------------------------------------
# Returns the current state of an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.state() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.state" '.state'
}
# ------------------------------------------------------------------------------
# Returns the current boot setting of this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# $2 Sets boot setting (optional).
# ------------------------------------------------------------------------------
function bashio::addon.boot() {
local slug=${1:-'self'}
local boot=${2:-}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.has_value "${boot}"; then
boot=$(bashio::var.json boot "${boot}")
bashio::api.supervisor POST "/addons/${slug}/options" "${boot}"
bashio::cache.flush_all
else
bashio::addons "${slug}" "addons.${slug}.boot" '.boot'
fi
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on is being build locally.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.build() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.build" '.build // false'
}
# ------------------------------------------------------------------------------
# Returns options for this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.options() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.options" '.options'
}
# ------------------------------------------------------------------------------
# Edit options for this add-on.
#
# Arguments:
# $1 Config Key to set or remove (required)
# $2 Value to set (optional, default:null, if null will remove the key pair)
# $3 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.option() {
local key=${1}
local value=${2:-}
local slug=${3:-'self'}
local options
local payload
local item
bashio::log.trace "${FUNCNAME[0]}" "$@"
options=$(bashio::addon.options "${slug}")
if bashio::var.has_value "${value}"; then
item="\"$value\""
if [[ "${value:0:1}" == "^" ]]; then
item="${value:1}"
fi
if bashio::jq.exists "${options}" ".${key}"; then
options=$(bashio::jq "${options}" ".${key} |= ${item}")
else
options=$(bashio::jq "${options}" ".${key} = ${item}")
fi
else
options=$(bashio::jq "${options}" "del(.${key})")
fi
payload=$(bashio::var.json options "^${options}")
bashio::api.supervisor POST "/addons/${slug}/options" "${payload}"
bashio::cache.flush_all
}
# ------------------------------------------------------------------------------
# Returns a JSON object with add-on specific config for the addon itself.
#
# This can be only used by self.
# ------------------------------------------------------------------------------
function bashio::addon.config() {
local cache_key="addons.self.options.config"
local response
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::cache.exists "${cache_key}"; then
bashio::cache.get "${cache_key}"
return "${__BASHIO_EXIT_OK}"
fi
response=$(bashio::api.supervisor GET "/addons/self/options/config" false)
# If the add-on has no configuration, it returns an empty string.
# This is Bashio logic, that is problematic in this case, so make it a
# emtpty JSON object instead.
if bashio::var.is_empty "${response}";
then
response="{}"
fi
bashio::cache.set "${cache_key}" "${response}"
printf "%s" "${response}"
return "${__BASHIO_EXIT_OK}"
}
# ------------------------------------------------------------------------------
# Returns a list of ports which are exposed on the host network for this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.network() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.network" '.network'
}
# ------------------------------------------------------------------------------
# Returns a list of ports and their descriptions for this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.network_description() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" \
"addons.${slug}.network_description" \
'.network_description'
}
# ------------------------------------------------------------------------------
# Returns a user configured port number for an original port number.
#
# Arguments:
# $1 Original port number
# $2 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.port() {
local port=${1:-}
local slug=${2:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
# Default to TCP if not specified.
if [[ "${port}" != *"/"* ]]; then
port="${port}/tcp"
fi
bashio::addons \
"${slug}" \
"addons.${slug}.network.${port//\//-}" \
".network[\"${port}\"] // empty"
}
# ------------------------------------------------------------------------------
# Returns a description for port number for this add-on.
#
# Arguments:
# $1 Original port number
# $2 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.port_description() {
local port=${1:-}
local slug=${2:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
# Default to TCP if not specified.
if [[ "${port}" != *"/"* ]]; then
port="${port}/tcp"
fi
bashio::addons \
"${slug}" \
"addons.${slug}.network_description.${port//\//-}" \
".network_description[\"${port}\"] // empty"
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on runs on the host network.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.host_network() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.host_network" \
'.host_network // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on runs on the host pid namespace.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.host_pid() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.host_pid" \
'.host_pid // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has IPC access.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.host_ipc() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.host_ipc" \
'.host_ipc // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has DBus access to the host.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.host_dbus() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.host_dbus" \
'.host_dbus // false'
}
# ------------------------------------------------------------------------------
# Returns the privileges the add-on has on to the hardware / system.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.privileged() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.privileged" '.privileged[]'
}
# ------------------------------------------------------------------------------
# Returns the current apparmor state of this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.apparmor() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.apparmor" '.apparmor'
}
# ------------------------------------------------------------------------------
# Returns a list devices made available to the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.devices() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.devices" '.devices // empty | .[]'
}
# ------------------------------------------------------------------------------
# Returns if add-on provide his own udev support.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.udev() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.udev" '.udev // false'
}
# ------------------------------------------------------------------------------
# Returns if UART was made available to the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.uart() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.uart" '.uart // false'
}
# ------------------------------------------------------------------------------
# Returns if USB was made available to the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.usb() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.usb" '.usb // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has an icon available.
#
# Arguments:
# $1 Add-on slug
# ------------------------------------------------------------------------------
function bashio::addon.icon() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.icon" '.icon // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has a logo available.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.logo() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.logo" '.logo // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has documentation available.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.has_documentation() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.documentation" '.documentation // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has a changelog available.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.has_changelog() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.changelog" '.changelog // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access the Supervisor API.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.hassio_api() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.hassio_api" '.hassio_api // false'
}
# ------------------------------------------------------------------------------
# Returns the Supervisor API role of this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.hassio_role() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.hassio_role" '.hassio_role'
}
# ------------------------------------------------------------------------------
# Returns the minimal required Home Assistant version needed by this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.homeassistant() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.homeassistant" '.homeassistant'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access the Home Assistant API.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.homeassistant_api() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.homeassistant_api" \
'.homeassistant_api // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access the Supervisor Auth API.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.auth_api() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.auth_api" '.auth_api // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on run in protected mode.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.protected() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.protected" '.protected // false'
}
# ------------------------------------------------------------------------------
# Returns the add-on its rating
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.rating() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.rating" '.rating'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can use the STDIN on the Supervisor API.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.stdin() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.stdin" '.stdin // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on has full access
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.full_access() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.full_access" \
'.full_access // false'
}
# ------------------------------------------------------------------------------
# A URL for web interface of this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.webui() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.webui" '.webui // empty'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access GPIO.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.gpio() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.gpio" '.gpio // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access kernel modules.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.kernel_modules() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.kernel_modules" \
'.kernel_modules // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access the devicetree.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.devicetree() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.devicetree" '.devicetree // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access the Docker socket.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.docker_api() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.docker_api" '.docker_api // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access video devices.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.video() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.video" '.video // false'
}
# ------------------------------------------------------------------------------
# Returns whether or not this add-on can access an audio device.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.audio() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.audio" '.audio // false'
}
# ------------------------------------------------------------------------------
# Returns the available audio input device for an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.audio_input() {
local slug=${1:-'self'}
local audio_input=${2:-}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.has_value "${audio_input}"; then
audio_input=$(bashio::var.json audio_input "${audio_input}")
bashio::api.supervisor POST "/addons/${slug}/options" "${audio_input}"
bashio::cache.flush_all
else
bashio::addons \
"${slug}" \
"addons.${slug}.audio_input" \
'.audio_input // empty'
fi
}
# ------------------------------------------------------------------------------
# Returns the available audio output device for an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# $2 Audio output device to set (Optional)
# ------------------------------------------------------------------------------
function bashio::addon.audio_output() {
local slug=${1:-'self'}
local audio_output=${2:-}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.has_value "${audio_output}"; then
audio_output=$(bashio::var.json audio_output "${audio_output}")
bashio::api.supervisor POST "/addons/${slug}/options" "${audio_output}"
bashio::cache.flush_all
else
bashio::addons \
"${slug}" \
"addons.${slug}.audio_output" \
'.audio_output // empty'
fi
}
# ------------------------------------------------------------------------------
# Returns IP address assigned on the home assistant network for an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.ip_address() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.ip_address" '.ip_address // empty'
}
# ------------------------------------------------------------------------------
# Returns if the add-on support ingress mode.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.ingress() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons "${slug}" "addons.${slug}.ingress" '.ingress // false'
}
# ------------------------------------------------------------------------------
# Returns the ingress entry point of the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.ingress_entry() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.ingress_entry" \
'.ingress_entry // empty'
}
# ------------------------------------------------------------------------------
# Returns the ingress url of the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.ingress_url() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.ingress_url" \
'.ingress_url // empty'
}
# ------------------------------------------------------------------------------
# Returns the ingress port of the add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.ingress_port() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons \
"${slug}" \
"addons.${slug}.ingress_port" \
'.ingress_port // empty'
}
# ------------------------------------------------------------------------------
# Returns or sets whether or not watchdog is enabled for this add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# $2 Set current watchdog state (Optional)
# ------------------------------------------------------------------------------
function bashio::addon.watchdog() {
local slug=${1:-'self'}
local watchdog=${2:-}
bashio::log.trace "${FUNCNAME[0]}" "$@"
if bashio::var.has_value "${watchdog}"; then
watchdog=$(bashio::var.json watchdog "^${watchdog}")
bashio::api.supervisor POST "/addons/${slug}/options" "${watchdog}"
bashio::cache.flush_all
else
bashio::addons \
"${slug}" \
"addons.${slug}.watchdog" \
'.watchdog // false'
fi
}
# ------------------------------------------------------------------------------
# List all available stats about an add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# $1 Cache key to store results in (optional)
# $2 jq Filter to apply on the result (optional)
# ------------------------------------------------------------------------------
function bashio::addon.stats() {
local slug=${1:-'self'}
local cache_key=${2:-"addons.${slug}.stats"}
local filter=${3:-}
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 "addons.${slug}.stats"; then
info=$(bashio::cache.get "addons.${slug}.stats")
else
info=$(bashio::api.supervisor GET "/addons/${slug}/stats" false)
if [ "$?" -ne "${__BASHIO_EXIT_OK}" ]; then
bashio::log.error "Failed to get addon stats from Supervisor API"
return "${__BASHIO_EXIT_NOK}"
fi
bashio::cache.set "addons.${slug}.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 specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.cpu_percent() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.cpu_percent" \
'.cpu_percent'
}
# ------------------------------------------------------------------------------
# Returns memory usage from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.memory_usage() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.memory_usage" \
'.memory_usage'
}
# ------------------------------------------------------------------------------
# Returns memory limit from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.memory_limit() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.memory_limit" \
'.memory_limit'
}
# ------------------------------------------------------------------------------
# Returns memory usage in percentage for the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.memory_percent() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.memory_percent" \
'.memory_percent'
}
# ------------------------------------------------------------------------------
# Returns outgoing network usage from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.network_tx() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.network_tx" \
'.network_tx'
}
# ------------------------------------------------------------------------------
# Returns incoming network usage from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.network_rx() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.network_rx" \
'.network_rx'
}
# ------------------------------------------------------------------------------
# Returns disk read usage from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.blk_read() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.blk_read" \
'.blk_read'
}
# ------------------------------------------------------------------------------
# Returns disk write usage from the specified add-on.
#
# Arguments:
# $1 Add-on slug (optional, default: self)
# ------------------------------------------------------------------------------
function bashio::addon.blk_write() {
local slug=${1:-'self'}
bashio::log.trace "${FUNCNAME[0]}" "$@"
bashio::addons.stats \
"${slug}" \
"addons.${slug}.stats.blk_write" \
'.blk_write'
}
# ------------------------------------------------------------------------------
# Checks if the add-on is running in protected mode and exits if not.
# ------------------------------------------------------------------------------
function bashio::require.protected() {
local protected
protected=$(bashio::addon.protected 'self')
if bashio::var.true "${protected}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal "PROTECTION MODE IS DISABLED!"
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 if"
bashio::log.fatal "protection mode is enabled on this add-on."
bashio::log.fatal
bashio::log.fatal "Unfortunately, it has been disabled."
bashio::log.fatal "Please enable it again!"
bashio::log.fatal ""
bashio::log.fatal "Steps:"
bashio::log.fatal " - Go to the Supervisor Panel."
bashio::log.fatal " - Click on this add-on."
bashio::log.fatal " - Set the 'Protection mode' switch to on."
bashio::log.fatal " - Restart the add-on."
bashio::log.fatal
bashio::exit.nok
}
# ------------------------------------------------------------------------------
# Checks if the add-on is running in unprotected mode and exits if not.
# ------------------------------------------------------------------------------
function bashio::require.unprotected() {
local protected
protected=$(bashio::addon.protected 'self')
if bashio::var.false "${protected}"; then
return "${__BASHIO_EXIT_OK}"
fi
bashio::log.fatal "PROTECTION MODE IS ENABLED!"
bashio::log.fatal
bashio::log.fatal "To be able to use this add-on, you'll need to disable"
bashio::log.fatal "protection mode on this add-on. Without it, the add-on"
bashio::log.fatal "is unable to access Docker."
bashio::log.fatal
bashio::log.fatal "Steps:"
bashio::log.fatal " - Go to the Supervisor Panel."
bashio::log.fatal " - Click on this add-on."
bashio::log.fatal " - Set the 'Protection mode' switch to off."
bashio::log.fatal " - Restart the add-on."
bashio::log.fatal
bashio::log.fatal "Access to Docker allows you to do really powerful things"
bashio::log.fatal "including complete destruction of your system."
bashio::log.fatal "Please, be sure you know what you are doing before"
bashio::log.fatal "enabling this feature (and this add-on)!"
bashio::log.fatal
bashio::exit.nok
}