xref: /openbmc/phosphor-modbus/mocked_test_device/start_mock_server.sh (revision 2168bbd050af3c68d820f96054a939dda02688c6)
1#!/bin/bash
2
3set -e
4set -u
5set -o pipefail
6
7function cleanup() {
8    echo -e "\nCaught EXIT signal. Terminating background processes."
9    jobs -p | xargs -r kill 2>/dev/null
10    echo "Cleanup complete."
11}
12trap cleanup EXIT
13
14DEFAULT_COUNT=2
15MODBUS_SERVER="/usr/libexec/phosphor-modbus/mock-modbus-server"
16
17if [ "$#" -eq 0 ]; then
18    echo "No count provided. Starting with default count of $DEFAULT_COUNT servers and serial port pairs."
19    SERVER_COUNT=$DEFAULT_COUNT
20elif [ "$#" -eq 1 ]; then
21    SERVER_COUNT=$1
22    if ! [[ "$SERVER_COUNT" =~ ^[0-9]+$ ]]; then
23        echo "Error: Count must be a non-negative integer." >&2
24        exit 1
25    fi
26    echo "Starting $SERVER_COUNT $MODBUS_SERVER instances and virtual port pairs."
27else
28    echo "Error: Too many arguments." >&2
29    echo "Usage: $0 [<count>]" >&2
30    exit 1
31fi
32
33# Create the necessary directory structure for serial ports
34echo "Creating directory /dev/serial/by-path"
35mkdir -p /dev/serial/by-path
36
37# Remove old symlinks to prevent conflicts
38echo "Removing old symlinks from /dev/serial/by-path/..."
39rm -f /dev/serial/by-path/platform-1e6a1000.usb-usb-0:1:1.*-port0
40
41# Loop to create virtual serial port pairs and start modbus servers
42echo "Starting $SERVER_COUNT virtual serial port pairs and $MODBUS_SERVER instances."
43for (( i=0; i<SERVER_COUNT; i++ )); do
44    TTY_USB="/dev/ttyUSB$i"
45    TTY_V="/dev/ttyV$i"
46
47    # Start the socat process for this pair
48    echo "  - Starting socat for $TTY_USB and $TTY_V."
49    socat -v -x -d -d pty,link="$TTY_USB",rawer,echo=0,b115200 pty,rawer,echo=0,link="$TTY_V",b115200 &
50
51    # Wait a moment for socat to create the devices
52    sleep 0.5
53
54    echo "  - Creating symlink for $TTY_USB..."
55    ln -sf $TTY_USB "/dev/serial/by-path/platform-1e6a1000.usb-usb-0:1:1.$i-port0"
56
57    # Start the $MODBUS_SERVER instance
58    echo "  - Starting $MODBUS_SERVER instance $i."
59    $MODBUS_SERVER $i &
60done
61
62echo "All background processes have been started."
63echo "Press Ctrl+C to terminate all processes gracefully."
64
65# Keep the script running to manage background jobs
66wait
67