mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-03-25 23:41:45 +01:00
103 lines
4.5 KiB
Bash
Executable File
103 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/with-contenv bashio
|
|
# shellcheck shell=bash
|
|
set -e
|
|
|
|
WIREGUARD_STATE_DIR="/var/run/wireguard"
|
|
QBT_CONFIG_FILE="/config/qBittorrent/qBittorrent.conf"
|
|
declare wireguard_config=""
|
|
declare wireguard_runtime_config=""
|
|
declare interface_name=""
|
|
|
|
if bashio::fs.directory_exists "${WIREGUARD_STATE_DIR}"; then
|
|
bashio::log.warning "Previous WireGuard state directory found, cleaning up."
|
|
rm -Rf "${WIREGUARD_STATE_DIR}"
|
|
fi
|
|
|
|
if ! bashio::config.true 'wireguard_enabled'; then
|
|
bashio::exit.ok 'WireGuard is disabled.'
|
|
elif bashio::config.true 'openvpn_enabled'; then
|
|
bashio::log.fatal 'OpenVPN and WireGuard cannot be enabled simultaneously. Disable one of them.'
|
|
bashio::addon.stop
|
|
fi
|
|
|
|
mkdir -p "${WIREGUARD_STATE_DIR}"
|
|
|
|
bashio::log.info "------------------------------"
|
|
bashio::log.info "Wireguard enabled, configuring"
|
|
bashio::log.info "------------------------------"
|
|
|
|
if bashio::config.has_value "wireguard_config"; then
|
|
wireguard_config="$(bashio::config 'wireguard_config')"
|
|
wireguard_config="${wireguard_config##*/}"
|
|
if [[ ! "${wireguard_config}" =~ ^[A-Za-z0-9._-]+\.conf$ ]]; then
|
|
bashio::log.fatal "Invalid wireguard_config filename '${wireguard_config}'. Allowed characters: letters, numbers, dot, underscore, dash. Extension must be .conf."
|
|
bashio::addon.stop
|
|
fi
|
|
fi
|
|
if [[ -z "${wireguard_config}" ]]; then
|
|
bashio::log.info 'wireguard_config option left empty. Attempting automatic selection.'
|
|
mapfile -t configs < <(find /config/wireguard -maxdepth 1 -type f -name '*.conf' -print)
|
|
if [ "${#configs[@]}" -eq 0 ]; then
|
|
bashio::log.fatal 'WireGuard is enabled but no .conf file was found in /config/wireguard.'
|
|
bashio::addon.stop
|
|
elif [ "${#configs[@]}" -eq 1 ]; then
|
|
wireguard_config="${configs[0]}"
|
|
bashio::log.info "WireGuard configuration not specified. Using ${wireguard_config##*/}."
|
|
elif bashio::fs.file_exists '/config/wireguard/config.conf'; then
|
|
wireguard_config='/config/wireguard/config.conf'
|
|
bashio::log.info 'Using default WireGuard configuration config.conf.'
|
|
else
|
|
bashio::log.fatal "Multiple WireGuard configuration files detected. Please set the 'wireguard_config' option."
|
|
bashio::addon.stop
|
|
fi
|
|
elif bashio::fs.file_exists "/config/wireguard/${wireguard_config}"; then
|
|
wireguard_config="/config/wireguard/${wireguard_config}"
|
|
else
|
|
bashio::log.fatal "WireGuard configuration '/config/wireguard/${wireguard_config}' not found."
|
|
bashio::addon.stop
|
|
fi
|
|
|
|
interface_name="$(basename "${wireguard_config}" .conf)"
|
|
if [[ -z "${interface_name}" ]]; then
|
|
interface_name='wg0'
|
|
fi
|
|
if [[ ${#interface_name} -gt 15 ]]; then
|
|
bashio::log.warning "WireGuard interface name '${interface_name}' exceeds 15 characters; truncating to '${interface_name:0:15}'."
|
|
interface_name="${interface_name:0:15}"
|
|
fi
|
|
|
|
wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf"
|
|
|
|
cp "${wireguard_config}" "${wireguard_runtime_config}"
|
|
chmod 600 "${wireguard_runtime_config}"
|
|
|
|
dos2unix "${wireguard_runtime_config}" >/dev/null 2>&1 || true
|
|
sed -i '/^[[:space:]]*[;#]/d' "${wireguard_runtime_config}"
|
|
sed -i 's/#.*//' "${wireguard_runtime_config}"
|
|
sed -i '/^[[:space:]]*$/d' "${wireguard_runtime_config}"
|
|
sed -i '/^[[:blank:]]*$/d' "${wireguard_runtime_config}"
|
|
sed -i '/DNS/d' "${wireguard_runtime_config}"
|
|
sed -i '/PostUp/d' "${wireguard_runtime_config}"
|
|
sed -i '/PostDown/d' "${wireguard_runtime_config}"
|
|
sed -i '/SaveConfig/d' "${wireguard_runtime_config}"
|
|
sed -i "\$q" "${wireguard_runtime_config}"
|
|
|
|
bashio::log.info 'Prepared WireGuard runtime configuration for initial connection attempt.'
|
|
|
|
echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config"
|
|
echo "${interface_name}" > "${WIREGUARD_STATE_DIR}/interface"
|
|
|
|
bashio::log.info "Using interface binding in the qBittorrent app"
|
|
|
|
if bashio::fs.file_exists "${QBT_CONFIG_FILE}"; then
|
|
sed -i '/Interface/d' "${QBT_CONFIG_FILE}"
|
|
sed -i "/\\[Preferences\\]/ i\\Connection\\\\Interface=${interface_name}" "${QBT_CONFIG_FILE}"
|
|
sed -i "/\\[Preferences\\]/ i\\Connection\\\\InterfaceName=${interface_name}" "${QBT_CONFIG_FILE}"
|
|
sed -i "/\\[BitTorrent\\]/a \\Session\\\\Interface=${interface_name}" "${QBT_CONFIG_FILE}"
|
|
sed -i "/\\[BitTorrent\\]/a \\Session\\\\InterfaceName=${interface_name}" "${QBT_CONFIG_FILE}"
|
|
else
|
|
bashio::log.warning "qBittorrent config file not found. Bind the client manually to interface ${interface_name}."
|
|
fi
|
|
|
|
bashio::log.info "WireGuard prepared with interface ${interface_name} using configuration ${wireguard_config##*/}."
|