#!/usr/bin/with-contenv bashio # shellcheck shell=bash set -e #################### # Update structure # #################### bashio::log.info "Update structure" # In the addon script, make symlinks on the fly echo "Creating symlinks" for folder in config db; do echo "Creating for $folder" # Create symlinks mkdir -p /config/"$folder" if [ -d /app/"$folder" ] && [ "$(ls -A /app/"$folder")" ]; then cp -rn /app/"$folder"/* /config/"$folder"/ fi rm -r /app/"$folder" ln -sf /config/"$folder" /app/"$folder" done sudo chown -R nginx:www-data /config/db/ sudo chown -R nginx:www-data /config/config/ if [ -f /config/db/app.db ]; then chmod a+rwx /config/db/app.db fi ##################### # Configure network # ##################### # Configuration file path config_file="/config/config/app.conf" # Function to execute the main logic execute_main_logic() { bashio::log.info "Initiating scan of Home Assistant network configuration..." # Get the local IPv4 address local_ip="$(bashio::network.ipv4_address)" local_ip="${local_ip%/*}" # Remove CIDR notation echo "... Detected local IP: $local_ip" echo "... Scanning network for changes" # Ensure arp-scan is installed if ! command -v arp-scan &> /dev/null; then bashio::log.error "arp-scan command not found. Please install arp-scan to proceed." exit 1 fi # Get current settings if ! grep -q "^SCAN_SUBNETS" "$config_file"; then bashio::log.fatal "SCAN_SUBNETS is not found in your $config_file, please correct your file first" fi # Iterate over network interfaces for interface in $(bashio::network.interfaces); do echo "Scanning interface: $interface" # Check if the interface is already configured if grep -q "$interface" "$config_file"; then echo "... $interface is already configured in app.conf" else # Update SCAN_SUBNETS in app.conf SCAN_SUBNETS="$(grep "^SCAN_SUBNETS" "$config_file" | head -1)" if [[ "$SCAN_SUBNETS" != *"$local_ip"*"$interface"* ]]; then # Add to the app.conf NEW_SCAN_SUBNETS="${SCAN_SUBNETS%]}, '${local_ip}/24 --interface=${interface}']" sed -i "/^SCAN_SUBNETS/c\\$NEW_SCAN_SUBNETS" "$config_file" # Check availability of hosts VALUE="$(arp-scan --interface="$interface" "${local_ip}/24" 2> /dev/null \ | grep "responded" \ | awk -F'.' '{print $NF}' \ | awk '{print $1}' || true)" echo "... $interface is available in Home Assistant (with $VALUE devices), added to app.conf" fi fi done bashio::log.info "Network scan completed." } # Function to wait for the config file wait_for_config_file() { echo "Waiting for $config_file to become available..." while [ ! -f "$config_file" ]; do sleep 5 # Wait for 5 seconds before checking again done echo "$config_file is now available. Starting the script." execute_main_logic } # Main script logic if [ -f "$config_file" ]; then execute_main_logic else wait_for_config_file & true fi