| Jagpal Singh Gill | 2168bbd | 2025-10-22 19:48:59 -0700 | [diff] [blame^] | 1 | #!/bin/bash |
| 2 | |
| 3 | set -e |
| 4 | set -u |
| 5 | set -o pipefail |
| 6 | |
| 7 | function cleanup() { |
| 8 | echo -e "\nCaught EXIT signal. Terminating background processes." |
| 9 | jobs -p | xargs -r kill 2>/dev/null |
| 10 | echo "Cleanup complete." |
| 11 | } |
| 12 | trap cleanup EXIT |
| 13 | |
| 14 | DEFAULT_COUNT=2 |
| 15 | MODBUS_SERVER="/usr/libexec/phosphor-modbus/mock-modbus-server" |
| 16 | |
| 17 | if [ "$#" -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 |
| 20 | elif [ "$#" -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." |
| 27 | else |
| 28 | echo "Error: Too many arguments." >&2 |
| 29 | echo "Usage: $0 [<count>]" >&2 |
| 30 | exit 1 |
| 31 | fi |
| 32 | |
| 33 | # Create the necessary directory structure for serial ports |
| 34 | echo "Creating directory /dev/serial/by-path" |
| 35 | mkdir -p /dev/serial/by-path |
| 36 | |
| 37 | # Remove old symlinks to prevent conflicts |
| 38 | echo "Removing old symlinks from /dev/serial/by-path/..." |
| 39 | rm -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 |
| 42 | echo "Starting $SERVER_COUNT virtual serial port pairs and $MODBUS_SERVER instances." |
| 43 | for (( 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 & |
| 60 | done |
| 61 | |
| 62 | echo "All background processes have been started." |
| 63 | echo "Press Ctrl+C to terminate all processes gracefully." |
| 64 | |
| 65 | # Keep the script running to manage background jobs |
| 66 | wait |