#!/bin/bash # entrypoint.sh # # This script is responsible for setting up and maintaining an XBee network interface within a Docker container. # It checks if a device is connected to the specified port, creates a TAP network interface, and monitors the connection. # If the device is disconnected, it cleans up and retries the connection process. # # Usage: # - This script is intended to be run as the entrypoint for a Docker container. # - Ensure that the script has executable permissions (`chmod +x entrypoint.sh`) before running it. echo "Starting entrypoint.sh" loop() { while true; do # Check if the XBee device is connected check_device_port if [ $? -ne 0 ]; then echo "No XBee device found at $XBEE_PORT. Waiting for device connection..." cleanup continue fi sleep 0.5 # Check if the network interface is up check_network_state if [ $? -ne 0 ]; then echo "Network interface $XBEE_NET_IFACE_NAME not found. Creating TAP interface..." create_tap_interface fi sleep 0.5 # Log messages sent and received over xbnet log_xbnet_messages sleep 0.5 done } # Function to check if the XBee device is connected check_device_port() { if [ -e "$XBEE_PORT" ]; then return 0 else return 1 fi } # Function to check if the network interface is up check_network_state() { if ip link show $XBEE_NET_IFACE_NAME > /dev/null 2>&1; then return 0 else return 1 fi } # Function to create a TAP network interface create_tap_interface() { # Start xbnet and run it in the background xbnet -d --serial-speed ${XBEE_BAUDRATE} ${XBEE_PORT} tap --iface-name ${XBEE_NET_IFACE_NAME} & # Wait until the interface is created while ! check_network_state; do sleep 1 done # Create and bring up xbnet interface ip addr add $XBEE_NET_SRC_IP/24 dev $XBEE_NET_IFACE_NAME ip link set $XBEE_NET_IFACE_NAME up echo "-------------------------------------------" echo "********** Tap interface created **********" echo "-------------------------------------------" echo "Name: ${XBEE_NET_IFACE_NAME}" echo "Gateway: ${DEFAULT_GATEWAY}" echo "IP: ${XBEE_NET_SRC_IP}" echo "Device port: ${XBEE_PORT}" echo "Device baudrate: ${XBEE_BAUDRATE}" echo "-------------------------------------------" return 0 } # Function to log messages sent and received over xbnet using netstat log_xbnet_messages() { echo "Monitoring messages on $XBEE_NET_IFACE_NAME..." # Continuously monitor the interface for packet statistics while true; do RX_PACKETS_BEFORE=$(cat /sys/class/net/$XBEE_NET_IFACE_NAME/statistics/rx_packets) TX_PACKETS_BEFORE=$(cat /sys/class/net/$XBEE_NET_IFACE_NAME/statistics/tx_packets) sleep 1 RX_PACKETS_AFTER=$(cat /sys/class/net/$XBEE_NET_IFACE_NAME/statistics/rx_packets) TX_PACKETS_AFTER=$(cat /sys/class/net/$XBEE_NET_IFACE_NAME/statistics/tx_packets) RX_DIFF=$((RX_PACKETS_AFTER - RX_PACKETS_BEFORE)) TX_DIFF=$((TX_PACKETS_AFTER - TX_PACKETS_BEFORE)) if [[ $RX_DIFF -gt 0 ]]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - $RX_DIFF packets received on $XBEE_NET_IFACE_NAME" fi if [[ $TX_DIFF -gt 0 ]]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - $TX_DIFF packets sent on $XBEE_NET_IFACE_NAME" fi done } # Function to clean up resources and exit the script cleanup() { echo "Cleaning up resources..." pkill -f "xbnet -d --serial-speed $XBEE_BAUDRATE $XBEE_PORT tap" if ip link show $XBEE_NET_IFACE_NAME > /dev/null 2>&1; then ip link set $XBEE_NET_IFACE_NAME down ip link delete $XBEE_NET_IFACE_NAME fi } # Trap signals to clean up properly trap cleanup EXIT # Start the loop to monitor the network and device loop