Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- ########///////////////////////////////////////########
- #
- # This is a bash script which uses minimodem, fifos,
- # cat, and netcat to serve a telnet BBS over an audio
- # line. The server and the client each run a pair of
- # minimodem instances which read and write to transmit
- # and receive fifos.
- #
- # With mic/phones splitters and some USB sound cards
- # a person could connect to a BBS over the audio
- # of a pair of cell phones.
- #
- # Also, just by crossing headphone and mic jacks
- # to connect two computers over soundcards for
- # tests...
- #
- # Theoretically could work over radio but
- # would add complexity and noise so probably
- # not.
- #
- # Call this script as a server or client from within its
- # own directory where only it exists.
- #
- # As a server:
- # $ ./minimodembbs.sh server [bbsaddress] [bbsport]
- #
- # As a client:
- # $ ./minimodembbs.sh client [optional: speed] [optional: squeltch]
- #
- # The "server" side connects to a designated telnet
- # BBS and then serves it via minimodem to the client.
- # The client receives it via a receiving minimodem
- # and sends commands back to the server (and BBS) via
- # a transmitting minimodem instance.
- #
- # A pair of people could set both of their copy of
- # this script to "client" mode and directly chat
- # that way as well.
- #
- # Phillip J Rhoades 2022-02-17
- #
- ########///////////////////////////////////////########
- ###########################################
- # Set some variables for configuration
- # and check to see if we are a server
- # or a client using command line arguments
- ###########################################
- #----------------------------------------------
- # Speed and squeltch. Set as needed for
- # line noise conditions.
- # (Speed "rtty" has no lower case)
- # Can use any of the speeds/formats
- # minimodem allows, (baudrate, SAME, RTTY,etc)
- #----------------------------------------------
- defaultspeed=100
- defaultsqueltch=2.00
- #----------------------------------------------
- # Check if server or client and adjust things
- # as needed.
- #----------------------------------------------
- if [ -z "$1" ]; then
- echo ""
- echo "Call this script as a server or client."
- echo ""
- echo "As a server:"
- echo " $ ./minimodembbs.sh server [bbsaddress] [bbsport] [optional speed] [optional squeltch]"
- echo ""
- echo "As a client:"
- echo " $ ./minimodembbs.sh client [optional speed] [optional squeltch]"
- echo ""
- echo "-->Note: If you manually set the speed, you have to manually set the squeltch."
- echo ""
- exit
- fi
- if [ "$1" = "server" ]; then
- if [ -z "$2" ] && [ -z "$3" ]; then
- echo ""
- echo "To serve a BBS over twin minimodems, please include"
- echo "a server address and port number of a Telnet BBS to"
- echo "connect to:"
- echo " $ ./minimodembbs.sh server [bbsaddress] [bbsport] [optional speed] [optional squeltch]"
- echo "-->Note: If you manually set the speed, you have to manually set the squeltch."
- echo ""
- exit
- else
- #----------------------------------------------
- # Telnet address and port of BBS you are
- # connecting to over the audio channels...
- #----------------------------------------------
- bbsaddress=$2
- bbsport=$3
- fi
- if [ -z "$4" ] && [ -z "$5" ]; then
- speed=$defaultspeed
- squeltch=$defaultsqueltch
- else
- speed=$4
- squeltch=$5
- fi
- echo "Starting as Telnet BBS Over Minimodems Server"
- fi
- if [ "$1" = "client" ]; then
- if [ -z "$2" ] && [ -z "$3" ]; then
- speed=$defaultspeed
- squeltch=$defaultsqueltch
- else
- speed=$2
- squeltch=$3
- fi
- fi
- ###########################################
- # Trap ctrl-c for cleanup before exiting.
- ###########################################
- trap ctrl_c INT
- function ctrl_c() {
- echo "#################"
- echo "Cleaning up before exit..."
- echo "#################"
- echo "#################"
- echo "Deleting fifos..."
- rm $rpipe
- rm $tpipe
- echo "#################"
- echo "Exiting..."
- echo "#################"
- kill 0
- } 2>/dev/null
- ###########################################
- # When working as a server, we need to not
- # transmit until there is a client so we
- # wait for the client to say it is ready
- # to connect to the BBS by listening for
- # a short initial transmit from the client
- ###########################################
- function hello_wait() {
- echo "Waiting for a blip from a connecting client"
- head -n 1 $rpipe
- }
- ###########################################
- # Make a temp fifo for
- # transmitting via a first minimodem
- ###########################################
- tpipe=$(mktemp -u)
- mkfifo -m 600 "$tpipe"
- ###########################################
- # Make a temp fifo for
- # receiving via a second minimodem
- ###########################################
- rpipe=$(mktemp -u)
- mkfifo -m 600 "$rpipe"
- ###########################################
- # Tell the user what the receive pipe
- # and the transmit pipe are...
- ###########################################
- echo "Receive pipe: $rpipe"
- echo "Transmit pipe: $tpipe"
- ###########################################
- # Start the receive minimodem which
- # seems to continue until the script
- # comes to a stop.
- ###########################################
- echo "Starting receive"
- minimodem -q --print-filter -c $squeltch -r $speed | cat >$rpipe &
- # Don't move forward until we hear from a client
- if [ "$1" = "server" ]; then
- hello_wait
- fi
- ###########################################
- # Start the transmit minimodem which
- # seems to exit after every successful
- # fifo read. So, we keep restarting it
- # whenever it stops...
- ###########################################
- while true; do
- echo "(Re)starting transmit"
- minimodem -t $speed <$tpipe &
- transmitPID=$!
- wait $transmitPID
- done &
- ###########################################
- # Use netcat to open a Telnet BBS and
- # connect it through the minimodems running
- # here with the minimodems running on a
- # different machine through the fifos
- ###########################################
- #----------------------------------------------
- # What to do if called as a server
- #----------------------------------------------
- if [ "$1" = "server" ]; then
- echo "Serving telnet BBS at $bbsaddress $bbsport over double minimodems"
- cat $rpipe |while true; do netcat $bbsaddress $bbsport | cat >$tpipe; hello_wait; done;
- #cat $rpipe |netcat $bbsaddress $bbsport >$tpipe
- fi
- #----------------------------------------------
- # What to do if called as a client
- #----------------------------------------------
- if [ "$1" = "client" ]; then
- echo "Starting client and connecting to double minimodems BBS server"
- echo "1" >$tpipe
- cat $rpipe & cat >$tpipe
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement