Version 1.8.0.0
[socat.git] / socat-broker.sh
blobec2377491287d03ab10f2784e6818d11ee9c3d17
1 #! /usr/bin/env bash
2 # Copyright Gerhard Rieger and contributors (see file CHANGES)
3 # Published under the GNU General Public License V.2, see file COPYING
5 # Shell script to perform group communications, sometimes called brokering.
6 # It starts a Socat instance that forks a child process for each
7 # connected client; the clients communicate via IPv4 broadcast
9 # Examples:
11 # socat-broker.sh TCP-L:1234
12 # Now connect with an arbitrary number of clients like TCP:<server>:1234
14 # socat-broker.sh SSL-L:1234,cert=server.pem,cafile=clients.crt
15 # Now connect with an arbitrary number of clients like SSL:<server>:1234,cafile=server.cert=clients.pem
17 ECHO="echo -e"
19 usage () {
20 $ECHO "Usage: $0 <options> <listener>"
21 $ECHO " <listener> is a passive address like TCP4-L or SSL-L"
22 $ECHO " <options>:"
23 $ECHO " -d* -S -t <timeout> -T <timeout> are passed to socat"
24 $ECHO " -V prints the socat command before starting it"
25 $ECHO "For example:"
26 $ECHO " $0 \\"
27 $ECHO " TCP4-L:1234"
28 $ECHO "Then connect with clients to port 1234"
29 $ECHO "Data sent by any client is forwarded to all other clients"
32 VERBOSE= QUIET= OPTS=
33 while [ "$1" ]; do
34 case "X$1" in
35 X-h) usage; exit ;;
36 X-V) VERBOSE=1 ;;
37 X-q) QUIET=1; OPTS="-d0" ;;
38 X-d*|X-l?*) OPTS="$OPTS $1" ;;
39 X-b|X-S|X-t|X-T|X-l) OPT=$1; shift; OPTS="$OPTS $OPT $1" ;;
40 X-) break ;;
41 X-*) echo "Unknown option \"$1\"" >&2
42 usage >&2
43 exit 1 ;;
44 *) break ;;
45 esac
46 shift
47 done
49 LISTENER="$1"
51 if [ -z "$LISTENER" ]; then
52 echo "$0: Missing parameter" >&2
53 usage >&2
54 exit 1
57 shopt -s nocasematch
58 if ! [[ "$LISTENER" =~ .*,fork ]] || [[ "$LISTENER" =~ .*,fork, ]]; then
59 LISTENER="$LISTENER,fork"
62 case "$0" in
63 */*) SOCAT=${0%/*}/socat ;;
64 *) SOCAT=socat ;;
65 esac
67 PORT=$($SOCAT -d -d -T 0.000001 UDP4-RECV:0 /dev/null 2>&1 |grep bound |sed 's/.*:\([1-9][0-9]*\)$/\1/')
68 if [ -z "$PORT" ]; then
69 echo "$0: Failed to determine free UDP port" >&2
70 exit 1
73 BCADDR=127.255.255.255
75 if [ "$VERBOSE" ]; then
76 echo -e "$SOCAT -lp socat-broker $OPTS \\
77 $LISTENER \
78 UDP4-DATAGRAM:$BCADDR:$PORT,bind=:$PORT,so-broadcast,so-reuseaddr"
79 fi
80 $SOCAT -lp socat-broker $OPTS \
81 "$LISTENER" \
82 "UDP4-DATAGRAM:$BCADDR:$PORT,bind=:$PORT,so-broadcast,so-reuseaddr"