#!/usr/bin/env bash # # helper script to patch the docker environment of homeassistant so that # the openccu will be additionally connected via a macvlan interface # to be able to connect a HmIP-HAP/HmIPW-DRAP. # # Can be called in full interactive mode by just calling it via: # # ./patch-ha-addon-macvlan.sh # # or via overriding certain settings like: # # CCU_NETWORK_INTERFACE=eth1 CCU_CONTAINER_IP=192.168.178.20 ./patch-ha-addon-macvlan.sh # # or in full non-interactive mode accepting all defaults with # allowing to partly override certain defaults: # # CCU_CONTAINER_IP=192.168.178.30 ./patch-ha-addon-macvlan.sh -n # # Copyright (c) 2023-2024 Jens Maus # Apache 2.0 License applies # ############################################################# # Settings # ############################################################# # network interface (e.g. 'eth0') : "${CCU_NETWORK_INTERFACE:=""}" # network subnet (e.g. '192.168.178.0/24') : "${CCU_NETWORK_SUBNET:=""}" # network gateway (e.g. '192.168.178.1') : "${CCU_NETWORK_GATEWAY:=""}" # openccu container name (e.g. '5422eb72-openccu') : "${CCU_CONTAINER_NAME:=""}" # openccu container ip (e.g. '192.168.178.4') : "${CCU_CONTAINER_IP:=""}" ############################################################# # Main App # ############################################################# echo "OpenCCU HA-Addon macvlan patch script v1.2" echo "Copyright (c) 2023-2024 Jens Maus " echo # check if non-interactive mode is requested if [[ "${1}" == "-n" ]]; then NON_INTERACTIVE=true fi # network calc helper functions tonum() { if [[ ${1} =~ ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+) ]]; then addr=$(( (BASH_REMATCH[1] << 24) + (BASH_REMATCH[2] << 16) + (BASH_REMATCH[3] << 8) + BASH_REMATCH[4] )) echo "${addr}" fi } toaddr() { b1=$(( (${1} & 0xFF000000) >> 24)) b2=$(( (${1} & 0xFF0000) >> 16)) b3=$(( (${1} & 0xFF00) >> 8)) b4=$(( ${1} & 0xFF )) echo "${b1}.${b2}.${b3}.${b4}" } cidr2network() { if [[ ${1} =~ ^([0-9\.]+)/([0-9]+)$ ]]; then ipaddr=${BASH_REMATCH[1]} netlen=${BASH_REMATCH[2]} zeros=$((32-netlen)) netnum=0 for (( i=0; i < zeros; i++ )); do netnum=$(( (netnum << 1) ^ 1 )) done netnum=$((netnum ^ 0xFFFFFFFF)) netmask=$(toaddr ${netnum}) ipaddrnum=$(tonum "${ipaddr}") netmasknum=$(tonum "${netmask}") networknum=$(( ipaddrnum & netmasknum )) network=$(toaddr ${networknum}) echo "${network}/${netlen}" fi } echo -n "HomeAssistant Main Ethernet Interface (e.g. eth0): " if [[ -z "${CCU_NETWORK_INTERFACE}" ]]; then CCU_NETWORK_INTERFACE=$(ip -o -f inet route | grep -e "^default" | awk '{print $5}') if [[ -z "${NON_INTERACTIVE}" ]]; then read -r -e -i "${CCU_NETWORK_INTERFACE}" CCU_NETWORK_INTERFACE /dev/null 2>&1; then echo "ERROR: OpenCCU isn't running or hostname incorrect." exit 1 fi # remove old macvlan if docker network inspect ccu >/dev/null 2>&1; then echo "Removing docker macvlan ccu network bridge" docker network disconnect ccu "${CCU_CONTAINER_NAME}" docker network rm ccu fi # re-create docker macvlan network echo "Creating docker macvlan network" docker network create -d macvlan \ --opt parent="${CCU_NETWORK_INTERFACE}" \ --subnet "${CCU_NETWORK_SUBNET}" \ --gateway "${CCU_NETWORK_GATEWAY}" \ ccu echo "Connecting add-on to macvlan network" docker network connect --ip "${CCU_CONTAINER_IP}" ccu "${CCU_CONTAINER_NAME}" echo "Stopping add-on (${CCU_CONTAINER_NAME})" docker stop --time 120 "${CCU_CONTAINER_NAME}" echo "Starting add-on (${CCU_CONTAINER_NAME})" docker start "${CCU_CONTAINER_NAME}" exit 0