Testing deploying xbnet directly on OS without docker
This commit is contained in:
parent
6e3d464ae8
commit
c2e84c0d6d
10
.env
10
.env
|
@ -1,14 +1,14 @@
|
||||||
# Base params
|
# Base params
|
||||||
BASE_SUBNET=192.168.1
|
BASE_SUBNET=10.10.10
|
||||||
XBEE_INDEX=1
|
XBEE_INDEX=1
|
||||||
|
|
||||||
# Default params
|
# Default params
|
||||||
DEFAULT_GATEWAY=192.168.1.1
|
DEFAULT_GATEWAY=10.10.10.1
|
||||||
DEFAULT_IPVLAN_IP=192.168.1.20 # Required only when running ipvlan net (look in docker compose)
|
DEFAULT_IPVLAN_IP=10.10.10.20 # Required only when running ipvlan net (look in docker compose)
|
||||||
DEFAULT_MACVLAN_IP=192.168.1.30 # Required only when running macvlan net (look in docker compose)
|
DEFAULT_MACVLAN_IP=10.10.10.30 # Required only when running macvlan net (look in docker compose)
|
||||||
|
|
||||||
# Configuration for xbnet0
|
# Configuration for xbnet0
|
||||||
XBEE_PORT=/dev/ttyUSB0
|
XBEE_PORT=/dev/ttyUSB0
|
||||||
XBEE_BAUDRATE=230400
|
XBEE_BAUDRATE=230400
|
||||||
XBEE_NET_SRC_IP=192.168.1.201 # Ensure this IP matches the network range
|
XBEE_NET_SRC_IP=10.10.10.201 # Ensure this IP matches the network range
|
||||||
XBEE_NET_IFACE_NAME=xbnet0
|
XBEE_NET_IFACE_NAME=xbnet0
|
||||||
|
|
69
Dockerfile
69
Dockerfile
|
@ -1,3 +1,61 @@
|
||||||
|
# # Use an official Rust image as the base
|
||||||
|
# FROM rust:latest
|
||||||
|
|
||||||
|
# # Install necessary packages
|
||||||
|
# RUN apt-get update && apt-get install -y \
|
||||||
|
# libudev-dev \
|
||||||
|
# iproute2 \
|
||||||
|
# iputils-ping \
|
||||||
|
# net-tools \
|
||||||
|
# bridge-utils \
|
||||||
|
# iptables \
|
||||||
|
# supervisor \
|
||||||
|
# traceroute \
|
||||||
|
# nmap \
|
||||||
|
# tcpdump \
|
||||||
|
# vim \
|
||||||
|
# && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# # Clone the xbnet repository
|
||||||
|
# # The xbnet repository contains the source code needed to set up and manage the XBee network
|
||||||
|
# RUN git clone https://github.com/jgoerzen/xbnet.git /usr/src/xbnet
|
||||||
|
|
||||||
|
# # Build xbnet
|
||||||
|
# # We build the xbnet project from source using Cargo, Rust's package manager and build system
|
||||||
|
# WORKDIR /usr/src/xbnet
|
||||||
|
# RUN cargo build --release
|
||||||
|
|
||||||
|
# # Copy the built binary to /usr/local/bin
|
||||||
|
# # The xbnet binary will be placed in /usr/local/bin to be accessible system-wide
|
||||||
|
# RUN cp target/release/xbnet /usr/local/bin/xbnet
|
||||||
|
|
||||||
|
# # Copy the entrypoint script
|
||||||
|
# # The entrypoint script handles the setup and monitoring of the XBee network
|
||||||
|
# COPY ./scripts/entrypoint.sh /entrypoint.sh
|
||||||
|
# RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
# # Copy the supervisor config file
|
||||||
|
# # Supervisor configuration ensures that the XBee network service is managed and stays running
|
||||||
|
# COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
|
|
||||||
|
# # Copy the health check script
|
||||||
|
# # The health check script will be used by Docker to monitor the health of the container
|
||||||
|
# COPY ./scripts/health_check.sh /health_check.sh
|
||||||
|
# RUN chmod +x /health_check.sh
|
||||||
|
|
||||||
|
# # Start supervisord as the main command
|
||||||
|
# # Supervisord will manage and monitor the services, including the XBee network
|
||||||
|
# CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||||
|
|
||||||
|
# # Add healthcheck
|
||||||
|
# # The health check command periodically checks the health of the container using a custom script
|
||||||
|
# HEALTHCHECK CMD /health_check.sh || exit 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
|
||||||
|
|
||||||
# Use an official Rust image as the base
|
# Use an official Rust image as the base
|
||||||
FROM rust:latest
|
FROM rust:latest
|
||||||
|
|
||||||
|
@ -11,39 +69,34 @@ RUN apt-get update && apt-get install -y \
|
||||||
iptables \
|
iptables \
|
||||||
supervisor \
|
supervisor \
|
||||||
traceroute \
|
traceroute \
|
||||||
|
nmap \
|
||||||
|
tcpdump \
|
||||||
|
vim \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Clone the xbnet repository
|
# Clone the xbnet repository
|
||||||
# The xbnet repository contains the source code needed to set up and manage the XBee network
|
|
||||||
RUN git clone https://github.com/jgoerzen/xbnet.git /usr/src/xbnet
|
RUN git clone https://github.com/jgoerzen/xbnet.git /usr/src/xbnet
|
||||||
|
|
||||||
# Build xbnet
|
# Build xbnet
|
||||||
# We build the xbnet project from source using Cargo, Rust's package manager and build system
|
|
||||||
WORKDIR /usr/src/xbnet
|
WORKDIR /usr/src/xbnet
|
||||||
RUN cargo build --release
|
RUN cargo build --release
|
||||||
|
|
||||||
# Copy the built binary to /usr/local/bin
|
# Copy the built binary to /usr/local/bin
|
||||||
# The xbnet binary will be placed in /usr/local/bin to be accessible system-wide
|
|
||||||
RUN cp target/release/xbnet /usr/local/bin/xbnet
|
RUN cp target/release/xbnet /usr/local/bin/xbnet
|
||||||
|
|
||||||
# Copy the entrypoint script
|
# Copy the entrypoint script
|
||||||
# The entrypoint script handles the setup and monitoring of the XBee network
|
|
||||||
COPY ./scripts/entrypoint.sh /entrypoint.sh
|
COPY ./scripts/entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod +x /entrypoint.sh
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
# Copy the supervisor config file
|
# Copy the supervisor config file
|
||||||
# Supervisor configuration ensures that the XBee network service is managed and stays running
|
|
||||||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
|
|
||||||
# Copy the health check script
|
# Copy the health check script
|
||||||
# The health check script will be used by Docker to monitor the health of the container
|
|
||||||
COPY ./scripts/health_check.sh /health_check.sh
|
COPY ./scripts/health_check.sh /health_check.sh
|
||||||
RUN chmod +x /health_check.sh
|
RUN chmod +x /health_check.sh
|
||||||
|
|
||||||
# Start supervisord as the main command
|
# Start supervisord as the main command
|
||||||
# Supervisord will manage and monitor the services, including the XBee network
|
|
||||||
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||||
|
|
||||||
# Add healthcheck
|
# Add healthcheck
|
||||||
# The health check command periodically checks the health of the container using a custom script
|
|
||||||
HEALTHCHECK CMD /health_check.sh || exit 1
|
HEALTHCHECK CMD /health_check.sh || exit 1
|
||||||
|
|
|
@ -10,7 +10,7 @@ services:
|
||||||
container_name: xbnet0
|
container_name: xbnet0
|
||||||
privileged: true
|
privileged: true
|
||||||
env_file:
|
env_file:
|
||||||
- .env-run-multiple
|
- .env
|
||||||
devices:
|
devices:
|
||||||
- "${XBEE0_PORT}:${XBEE0_PORT}"
|
- "${XBEE0_PORT}:${XBEE0_PORT}"
|
||||||
command: >
|
command: >
|
||||||
|
|
|
@ -1,3 +1,65 @@
|
||||||
|
# version: '3.8'
|
||||||
|
|
||||||
|
# services:
|
||||||
|
# xbnet-node:
|
||||||
|
# build: .
|
||||||
|
# container_name: xbnet_node
|
||||||
|
# privileged: true
|
||||||
|
# env_file: .env
|
||||||
|
# networks:
|
||||||
|
# # xbee_net:
|
||||||
|
# # ipv4_address: ${XBEE0_NET_SRC_IP} # Ensure this IP belongs to the xbee_net subnet
|
||||||
|
# # ipvlan_net:
|
||||||
|
# # ipv4_address: ${DEFAULT_IPVLAN_IP} # Assign an IP within the same range as your host's Wi-Fi
|
||||||
|
# macvlan_net:
|
||||||
|
# ipv4_address: ${DEFAULT_MACVLAN_IP} # Assign an IP within the same range as your host's Wi-Fi
|
||||||
|
|
||||||
|
|
||||||
|
# networks:
|
||||||
|
# # 1. Docker's internal way of communicating between host and containers - Support 2 way comms
|
||||||
|
# # xbee_net:
|
||||||
|
# # driver: bridge
|
||||||
|
# # ipam:
|
||||||
|
# # config:
|
||||||
|
# # - subnet: 192.168.2.0/24 # Ensure your xbnet IPs are in this range
|
||||||
|
|
||||||
|
# # 2. ipvlan working ok for comms from container to host, but not host to container
|
||||||
|
# # ipvlan_net:
|
||||||
|
# # driver: ipvlan
|
||||||
|
# # driver_opts:
|
||||||
|
# # mode: l3 # Use L3 mode, which is simpler for most setups
|
||||||
|
# # parent: wlp0s20f3 # This should be your host's Wi-Fi or Ethernet interface
|
||||||
|
# # ipam:
|
||||||
|
# # config:
|
||||||
|
# # - subnet: ${BASE_SUBNET}.0/24 # Match the Wi-Fi network range
|
||||||
|
# # gateway: ${DEFAULT_GATEWAY} # Your router's gateway
|
||||||
|
|
||||||
|
# # 3. macvlan not working for some reason
|
||||||
|
# macvlan_net:
|
||||||
|
# driver: macvlan
|
||||||
|
# driver_opts:
|
||||||
|
# parent: wlp0s20f3 # This should be your host's Wi-Fi interface
|
||||||
|
# ipam:
|
||||||
|
# config:
|
||||||
|
# - subnet: ${BASE_SUBNET}.0/24 # Match the Wi-Fi network range
|
||||||
|
# gateway: ${DEFAULT_GATEWAY} # Your router's gateway
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
@ -7,39 +69,14 @@ services:
|
||||||
privileged: true
|
privileged: true
|
||||||
env_file: .env
|
env_file: .env
|
||||||
networks:
|
networks:
|
||||||
# xbee_net:
|
xbee_net:
|
||||||
# ipv4_address: ${XBEE0_NET_SRC_IP} # Ensure this IP belongs to the xbee_net subnet
|
ipv4_address: 192.168.2.201 # IP for the xbnet in the Docker network
|
||||||
ipvlan_net:
|
|
||||||
ipv4_address: ${DEFAULT_IPVLAN_IP} # Assign an IP within the same range as your host's Wi-Fi
|
|
||||||
# macvlan_net:
|
|
||||||
# ipv4_address: ${DEFAULT_MACVLAN_IP} # Assign an IP within the same range as your host's Wi-Fi
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
# 1. Docker's internal way of communicating between host and containers - Support 2 way comms
|
xbee_net:
|
||||||
# xbee_net:
|
driver: bridge
|
||||||
# driver: bridge
|
|
||||||
# ipam:
|
|
||||||
# config:
|
|
||||||
# - subnet: 192.168.2.0/24 # Ensure your xbnet IPs are in this range
|
|
||||||
|
|
||||||
# 2. ipvlan working ok for comms from container to host, but not host to container
|
|
||||||
ipvlan_net:
|
|
||||||
driver: ipvlan
|
|
||||||
driver_opts:
|
|
||||||
mode: l3 # Use L3 mode, which is simpler for most setups
|
|
||||||
parent: wlp0s20f3 # This should be your host's Wi-Fi or Ethernet interface
|
|
||||||
ipam:
|
ipam:
|
||||||
config:
|
config:
|
||||||
- subnet: ${BASE_SUBNET}.0/24 # Match the Wi-Fi network range
|
- subnet: 192.168.2.0/24 # Docker network on 192.168.2.x
|
||||||
gateway: ${DEFAULT_GATEWAY} # Your router's gateway
|
gateway: 192.168.2.1
|
||||||
|
ip_range: 192.168.2.200/29
|
||||||
# 3. macvlan not working for some reason
|
|
||||||
# macvlan_net:
|
|
||||||
# driver: macvlan
|
|
||||||
# driver_opts:
|
|
||||||
# parent: wlp0s20f3 # This should be your host's Wi-Fi interface
|
|
||||||
# ipam:
|
|
||||||
# config:
|
|
||||||
# - subnet: ${BASE_SUBNET}.0/24 # Match the Wi-Fi network range
|
|
||||||
# gateway: ${DEFAULT_GATEWAY} # Your router's gateway
|
|
|
@ -1,12 +1,14 @@
|
||||||
# run-single.sh
|
# run-single.sh
|
||||||
#
|
#
|
||||||
# This script sets up the environment for running a Docker Compose configuration with XBee networks.
|
# This script sets up the environment for running a Docker Compose configuration with XBee networks.
|
||||||
# It accepts an optional --index=<int> argument to specify the XBEE_INDEX value.
|
# It accepts optional --index=<int> and --subnet=<subnet> arguments to specify the XBEE_INDEX and BASE_SUBNET values.
|
||||||
# If no index is provided, it defaults to 1.
|
# If no index is provided, it defaults to 1. If no subnet is provided, it defaults to 192.168.1.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./run-single.sh # Runs with default index (1)
|
# ./run-single.sh # Runs with default index (1) and default subnet (192.168.1)
|
||||||
# ./run-single.sh --index=2 # Runs with index 2
|
# ./run-single.sh --index=2 # Runs with index 2 and default subnet (192.168.1)
|
||||||
|
# ./run-single.sh --subnet=192.168.50 # Runs with default index (1) and subnet 192.168.50
|
||||||
|
# ./run-single.sh --index=3 --subnet=192.168.50 # Runs with index 3 and subnet 192.168.50
|
||||||
#
|
#
|
||||||
# IPs assigned:
|
# IPs assigned:
|
||||||
# BASE_SUBNET: eg.: 192.168.1
|
# BASE_SUBNET: eg.: 192.168.1
|
||||||
|
@ -17,8 +19,9 @@
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Default index value
|
# Default values
|
||||||
index=1
|
index=1
|
||||||
|
BASE_SUBNET="192.168.1"
|
||||||
|
|
||||||
# Parse command-line arguments
|
# Parse command-line arguments
|
||||||
for arg in "$@"
|
for arg in "$@"
|
||||||
|
@ -28,14 +31,15 @@ do
|
||||||
index="${arg#*=}"
|
index="${arg#*=}"
|
||||||
shift # Remove --index=<int> from processing
|
shift # Remove --index=<int> from processing
|
||||||
;;
|
;;
|
||||||
|
--subnet=*)
|
||||||
|
BASE_SUBNET="${arg#*=}"
|
||||||
|
shift # Remove --subnet=<subnet> from processing
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# Set BASE_SUBNET
|
|
||||||
BASE_SUBNET="192.168.1"
|
|
||||||
|
|
||||||
# Create a .env file with the specified parameters
|
# Create a .env file with the specified parameters
|
||||||
cat <<EOF > .env
|
cat <<EOF > .env
|
||||||
# Base params
|
# Base params
|
||||||
|
@ -54,7 +58,6 @@ XBEE_NET_SRC_IP=${BASE_SUBNET}.20${index} # Ensure this IP matches the net
|
||||||
XBEE_NET_IFACE_NAME=xbnet0
|
XBEE_NET_IFACE_NAME=xbnet0
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Restart Docker Compose services
|
||||||
# Restart Docker Composes services
|
|
||||||
docker compose -f docker-compose-run-single.yml down
|
docker compose -f docker-compose-run-single.yml down
|
||||||
docker compose -f docker-compose-run-single.yml up --build
|
docker compose -f docker-compose-run-single.yml up --build
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# create_tap_device.sh
|
||||||
|
#
|
||||||
|
# This script sets up an XBee network interface (xbnet) in tap mode. It creates a virtual Ethernet interface
|
||||||
|
# that runs over the XBee radio network, assigns it an IP address, and brings the interface up.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./create_tap_device.sh --index=<int> --subnet=<value> --port=<device> --serial-speed=<baudrate>
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# ./create_tap_device.sh --index=1 --subnet=10.10.10 --port=/dev/ttyUSB0 --serial-speed=230400
|
||||||
|
# - Creates a tap interface with IP 10.10.10.1 using /dev/ttyUSB0 at 230400 baudrate.
|
||||||
|
#
|
||||||
|
# ./create_tap_device.sh --index=2 --subnet=192.168.2 --port=/dev/ttyUSB1 --serial-speed=115200
|
||||||
|
# - Creates a tap interface with IP 192.168.2.2 using /dev/ttyUSB1 at 115200 baudrate.
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
INDEX=1
|
||||||
|
SUBNET="10.10.10"
|
||||||
|
PORT="/dev/ttyUSB0"
|
||||||
|
SERIAL_SPEED=230400
|
||||||
|
|
||||||
|
export RUST_BACKTRACE=full
|
||||||
|
|
||||||
|
# Parse command-line arguments
|
||||||
|
for arg in "$@"
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
--index=*)
|
||||||
|
INDEX="${arg#*=}"
|
||||||
|
shift # Remove --index=<int> from processing
|
||||||
|
;;
|
||||||
|
--subnet=*)
|
||||||
|
SUBNET="${arg#*=}"
|
||||||
|
shift # Remove --subnet=<value> from processing
|
||||||
|
;;
|
||||||
|
--port=*)
|
||||||
|
PORT="${arg#*=}"
|
||||||
|
shift # Remove --port=<value> from processing
|
||||||
|
;;
|
||||||
|
--serial-speed=*)
|
||||||
|
SERIAL_SPEED="${arg#*=}"
|
||||||
|
shift # Remove --serial-speed=<value> from processing
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid argument: $arg"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Assign IP and interface name
|
||||||
|
IP="${SUBNET}.${INDEX}"
|
||||||
|
IFACE_NAME="xbnet${INDEX}"
|
||||||
|
|
||||||
|
# Run xbnet command
|
||||||
|
echo "Starting xbnet on ${PORT} with IP ${IP} on interface ${IFACE_NAME}"
|
||||||
|
xbnet -d --serial-speed ${SERIAL_SPEED} ${PORT} tap --iface-name ${IFACE_NAME} &
|
||||||
|
|
||||||
|
# Wait until the interface is created and up
|
||||||
|
echo "Waiting for interface ${IFACE_NAME} to be up..."
|
||||||
|
while ! ip link show ${IFACE_NAME} > /dev/null 2>&1; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# Assign IP address to the interface
|
||||||
|
sudo ip addr add ${IP}/24 dev ${IFACE_NAME}
|
||||||
|
sudo ip link set ${IFACE_NAME} up
|
||||||
|
|
||||||
|
echo "Interface ${IFACE_NAME} created with IP ${IP}"
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# kill_tap_device.sh
|
||||||
|
#
|
||||||
|
# This script stops and cleans up resources for an XBee network interface (xbnet) in tap mode.
|
||||||
|
# It terminates the xbnet process, removes the virtual Ethernet interface, and releases associated resources.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./kill_tap_device.sh --index=<int>
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# ./kill_tap_device.sh --index=1 # Terminates and cleans up resources for xbnet1
|
||||||
|
|
||||||
|
# Default value
|
||||||
|
INDEX=1
|
||||||
|
|
||||||
|
# Parse command-line arguments
|
||||||
|
for arg in "$@"
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
--index=*)
|
||||||
|
INDEX="${arg#*=}"
|
||||||
|
shift # Remove --index=<int> from processing
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid argument: $arg"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Define interface name
|
||||||
|
IFACE_NAME="xbnet${INDEX}"
|
||||||
|
|
||||||
|
# Terminate xbnet process associated with the interface
|
||||||
|
echo "Stopping xbnet on interface ${IFACE_NAME}..."
|
||||||
|
pkill -f "xbnet .* --iface-name ${IFACE_NAME}"
|
||||||
|
|
||||||
|
# Wait for the interface to go down
|
||||||
|
echo "Waiting for interface ${IFACE_NAME} to go down..."
|
||||||
|
while ip link show ${IFACE_NAME} > /dev/null 2>&1; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# Clean up the interface
|
||||||
|
echo "Cleaning up interface ${IFACE_NAME}..."
|
||||||
|
sudo ip link delete ${IFACE_NAME}
|
||||||
|
|
||||||
|
echo "Interface ${IFACE_NAME} and associated resources cleaned up successfully."
|
|
@ -1,19 +1,192 @@
|
||||||
|
# #!/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
|
||||||
|
|
||||||
|
# # sudo iptables -t nat -A POSTROUTING -s ${DEFAULT_SUBNET}.0/24 -o $HOST_WIFI_IFACE -j MASQUERADE
|
||||||
|
# # sudo iptables -A FORWARD -i $HOST_WIFI_IFACE -o docker0 -j ACCEPT
|
||||||
|
# # sudo 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
|
#!/bin/bash
|
||||||
|
|
||||||
# entrypoint.sh
|
# entrypoint.sh
|
||||||
#
|
#
|
||||||
# This script is responsible for setting up and maintaining an XBee network interface within a Docker container.
|
# 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,
|
# 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.
|
# configuring network bridges, and monitoring the XBee device. The script runs in a loop to ensure continuous
|
||||||
# The script runs in a loop to ensure continuous operation, retrying the setup process if any steps fail.
|
# operation, retrying the setup process if any steps fail.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# - This script is intended to be run as the entrypoint for a Docker container.
|
# - 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.
|
# - 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 if the script is running with root privileges
|
||||||
check_root() {
|
check_root() {
|
||||||
if [ "$(id -u)" -ne 0 ]; then
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
@ -91,34 +264,10 @@ configure_network_and_bridge() {
|
||||||
|
|
||||||
brctl addbr br0
|
brctl addbr br0
|
||||||
brctl addif br0 $XBEE_NET_IFACE_NAME
|
brctl addif br0 $XBEE_NET_IFACE_NAME
|
||||||
|
|
||||||
ip link set dev br0 up
|
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 -o $HOST_WIFI_IFACE -j MASQUERADE
|
|
||||||
iptables -A FORWARD -i br0 -o $HOST_WIFI_IFACE -j ACCEPT
|
|
||||||
iptables -A FORWARD -i $HOST_WIFI_IFACE -o br0 -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
|
# Function to monitor the XBee device and restart setup if disconnected
|
||||||
# - Periodically checks if the XBee device is still connected
|
# - Periodically checks if the XBee device is still connected
|
||||||
# - If the device is disconnected, triggers cleanup and restarts the setup process
|
# - If the device is disconnected, triggers cleanup and restarts the setup process
|
||||||
|
@ -150,7 +299,6 @@ setup_xbee_network() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
configure_network_and_bridge
|
configure_network_and_bridge
|
||||||
monitor_and_bridge_wifi
|
|
||||||
monitor_xbee_device
|
monitor_xbee_device
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
# IP forwarding and NAT rules
|
||||||
|
|
||||||
|
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o wlp0s20f3 -j MASQUERADE
|
||||||
|
iptables -A FORWARD -i wlp0s20f3 -o docker0 -j ACCEPT
|
||||||
|
iptables -A FORWARD -i docker0 -o wlp0s20f3 -j ACCEPT
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in New Issue