diff --git a/Dockerfile b/Dockerfile index 6e62ae4..5035573 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,6 @@ RUN apt-get update && apt-get install -y \ net-tools \ bridge-utils \ iptables \ - supervisor \ traceroute \ nmap \ tcpdump \ @@ -29,15 +28,9 @@ RUN cp target/release/xbnet /usr/local/bin/xbnet COPY ./scripts/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -# Copy the supervisor config file -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - # Copy the health check script COPY ./scripts/health_check.sh /health_check.sh RUN chmod +x /health_check.sh -# # Start supervisord as the main command -# CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] - # Add healthcheck HEALTHCHECK CMD /health_check.sh || exit 1 diff --git a/docker-compose-run-single.yml b/docker-compose-run-single.yml index e72b13a..48d6f8d 100644 --- a/docker-compose-run-single.yml +++ b/docker-compose-run-single.yml @@ -68,7 +68,8 @@ services: container_name: xbnet_node privileged: true env_file: .env - command: /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf + command: bash /entrypoint.sh + # command: /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf # command: tail -f /dev/null # networks: # xbee_net: diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 1e747a4..fbbb664 100755 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,179 +1,3 @@ -# #!/bin/bash - -# # entrypoint.sh -# # -# # This script is responsible for setting up and maintaining an XBee network interface within a Docker container. -# # It performs several key tasks, including checking for root privileges, setting up the XBee network interface, -# # configuring network bridges, and monitoring both the XBee device and Wi-Fi interface for connectivity. -# # The script runs in a loop to ensure continuous operation, retrying the setup process if any steps fail. -# # -# # 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. - -# # Source the get_connected_wifi_info.sh script -# source /scripts/get_connected_wifi_info.sh - -# # Check if the script is running with root privileges -# check_root() { -# if [ "$(id -u)" -ne 0 ]; then -# echo "This script must be run as root. Exiting..." -# exit 1 -# fi -# } - -# # Clean up resources -# # - Kill the background process used to create the xbnet interface -# # - Clean up any resources created or copied over. This includes: -# # - Bridge interface -# # - xbnet interface -# cleanup() { -# echo "Cleaning up resources..." -# pkill -f "xbnet -d --serial-speed $XBEE_BAUDRATE $XBEE_PORT tap" - -# if ip link show br0 > /dev/null 2>&1; then -# ip link set br0 down -# brctl delbr br0 -# fi - -# 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 -# } - -# # Function to check if the XBee device is connected -# # - Ensures that the XBee device is present at the specified port before proceeding -# check_xbee_device() { -# if [ -e "$XBEE_PORT" ]; then -# echo "XBee device found at $XBEE_PORT. Proceeding with setup..." -# return 0 -# else -# echo "Error: No XBee device found at $XBEE_PORT. Please connect the device." -# return 1 -# fi -# } - -# # Start the xbnet interface -# # - Attempts to start the xbnet interface in tap mode -# # - Verifies if the interface is successfully created and returns the appropriate status code -# start_xbnet_interface() { -# echo "Starting XBee network interface..." -# xbnet -d --serial-speed $XBEE_BAUDRATE $XBEE_PORT tap & - -# # Wait until the xbnet interface is created -# while [ ! -d "/sys/class/net/$XBEE_NET_IFACE_NAME" ]; do -# echo "Waiting for interface $XBEE_NET_IFACE_NAME to be created..." -# sleep 1 -# done - -# # Get the xbnet interface name (e.g., xbnet0) automatically -# XBEE_NET_IFACE_NAME=$(ls /sys/class/net | grep 'xbnet') - -# # Check if the xbnet interface is found -# if [ -z "$XBEE_NET_IFACE_NAME" ]; then -# echo "Error: No XBee network interface found. Retrying setup..." -# cleanup -# return 1 -# else -# echo "XBee network interface $XBEE_NET_IFACE_NAME created successfully." -# return 0 -# fi -# } - -# # Configure the network interface and bridge -# # - Creates the network interface with the name specified by XBEE_NET_IFACE_NAME in .env file -# # - Creates a bridge interface and attaches the xbnet interface to it -# # - Brings up the bridge interface -# configure_network_and_bridge() { -# ip addr add $XBEE_NET_SRC_IP/24 dev $XBEE_NET_IFACE_NAME -# ip link set dev $XBEE_NET_IFACE_NAME up - -# brctl addbr br0 -# brctl addif br0 $XBEE_NET_IFACE_NAME - -# # # Add the main network interface (e.g., eth0) to the bridge -# # if ip link show eth0 > /dev/null 2>&1; then -# # brctl addif br0 eth0 -# # else -# # echo "Warning: eth0 not found. Skipping adding eth0 to bridge." -# # fi - -# ip link set dev br0 up -# } - -# # Monitor and bridge Wi-Fi -# # - Continuously checks for a connected Wi-Fi interface -# # - Bridges the Wi-Fi interface with the xbnet interface when found -# # - If no Wi-Fi interface is found, continues checking every 5 seconds -# monitor_and_bridge_wifi() { -# while true; do -# HOST_WIFI_IFACE=$(get_connected_wifi_device) - -# if [ -n "$HOST_WIFI_IFACE" ]; then -# echo "Wi-Fi interface found: $HOST_WIFI_IFACE. Bridging with $XBEE_NET_IFACE_NAME..." -# brctl addif br0 $HOST_WIFI_IFACE - -# # iptables -t nat -A POSTROUTING -s ${DEFAULT_SUBNET}.0/24 -o $HOST_WIFI_IFACE -j MASQUERADE -# # iptables -A FORWARD -i $HOST_WIFI_IFACE -o docker0 -j ACCEPT -# # iptables -A FORWARD -i docker0 -o $HOST_WIFI_IFACE -j ACCEPT - -# echo "Bridge configured. Monitoring for changes..." -# break -# else -# echo "No Wi-Fi interface found. Rechecking in 5 seconds..." -# sleep 5 -# fi -# done -# } - -# # Function to monitor the XBee device and restart setup if disconnected -# # - Periodically checks if the XBee device is still connected -# # - If the device is disconnected, triggers cleanup and restarts the setup process -# monitor_xbee_device() { -# while [ -e "$XBEE_PORT" ]; do -# sleep 5 -# done - -# echo "XBee device at $XBEE_PORT was removed. Cleaning up..." -# cleanup -# } - -# # Main function to set up the XBee network -# # - Runs the setup process in a loop to ensure continuous operation -# # - If any step fails, it retries the entire process after a short delay -# setup_xbee_network() { -# while true; do -# check_xbee_device -# if [ $? -ne 0 ]; then -# sleep 5 -# continue -# fi - -# start_xbnet_interface -# if [ $? -ne 0 ]; then -# cleanup -# sleep 5 -# continue -# fi - -# configure_network_and_bridge -# monitor_and_bridge_wifi -# monitor_xbee_device -# done -# } - -# # Run the setup only if the script is executed as root -# check_root -# setup_xbee_network - - - -############################################# - - - - #!/bin/bash # entrypoint.sh @@ -207,8 +31,12 @@ loop() { create_tap_interface fi + sleep 0.5 + # Log messages sent and received over xbnet - # log_xbnet_messages + log_xbnet_messages + + sleep 0.5 done } @@ -234,7 +62,6 @@ check_network_state() { # Function to create a TAP network interface create_tap_interface() { # Start xbnet and run it in the background - echo "Triggering xbnet cmd" xbnet -d --serial-speed ${XBEE_BAUDRATE} ${XBEE_PORT} tap --iface-name ${XBEE_NET_IFACE_NAME} & # Wait until the interface is created @@ -242,21 +69,49 @@ create_tap_interface() { sleep 1 done - echo "Triggering ip addr add cmd" + # Create and bring up xbnet interface ip addr add $XBEE_NET_SRC_IP/24 dev $XBEE_NET_IFACE_NAME - - echo "Triggering ip link set cmd" ip link set $XBEE_NET_IFACE_NAME up - echo "Tap interface created." + 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..." diff --git a/supervisord.conf b/supervisord.conf deleted file mode 100644 index b103c2c..0000000 --- a/supervisord.conf +++ /dev/null @@ -1,31 +0,0 @@ -[supervisord] -nodaemon=true - -[program:xbnet] -command=/bin/bash /entrypoint.sh -autostart=true -autorestart=true -startretries=3 -stderr_logfile=/var/log/supervisor/xbnet.err.log -stdout_logfile=/var/log/supervisor/xbnet.out.log -user=root -environment=HOME="/root",USER="root",PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -# Cmd line tool to check supervisor status -# Usage: -# eg. supervisorctl -c /etc/supervisor/conf.d/supervisord.conf status -# supervisorctl -c /etc/supervisor/conf.d/supervisord.conf restart -# supervisorctl -c /etc/supervisor/conf.d/supervisord.conf stop -[supervisorctl] -serverurl=unix:///var/run/supervisor.sock - -# HTTP server used to monitor supervisorctl -# Usage: -# eg. curl --unix-socket /var/run/supervisor.sock http://localhost -[unix_http_server] -file=/var/run/supervisor.sock -chmod=0700 - -# RPC interface required for supervisorctl to communciate with supervisor -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface