#!/bin/sh
#
# Version 2.0 (C) '2015-2023 by Uwe Langhammer
# creates and deletes a pseudo TTY mapped to a TCP port for CUxD
#
# usage:
#   pty2tcp start ttyTCP<x> [-ssl] <ip>:<port> [<options>]
#   pty2tcp stop ttyTCP<x>
#

SOCATP=/usr/local/addons/cuxd/extra/socat

kill_pid() {
  kill -0 $1 2>/dev/null
  if [ $? -eq 0 ]
  then
    echo "kill ($1)"
logger -p daemon.info -t cuxd.pty2tcp "kill -HUP ($1)"
    kill -HUP $1
    sleep 1
    kill -0 $1 2>/dev/null
    if [ $? -eq 0 ]
    then
logger -p daemon.info -t cuxd.pty2tcp "kill -TERM ($1)"
      kill -TERM $1 2>/dev/null
      sleep 1
      kill -0 $1 2>/dev/null
      if [ $? -eq 0 ]
      then
logger -p daemon.info -t cuxd.pty2tcp "kill -KILL ($1)"
        kill -KILL $1
        sleep 1
      fi
    fi
  fi
}

check_device() {
#logger -p daemon.info -t cuxd.pty2tcp "check_device start $1 $2 $3"
while [ -f $2 ]
do
  pid=`cat $2 2>/dev/null`
  if [ "$1" = "$pid" ]
  then
    if [ ! -e $3 ]
    then
      sleep 10
      if [ ! -e $3 ]
      then
logger -p daemon.err -t cuxd.pty2tcp "$3 not found"
        kill_pid $1
      fi
    else
      sleep 2
    fi
  else
    break
  fi
done
#logger -p daemon.info -t cuxd.pty2tcp "check_device done $1 $2 $3"
}

SSL=0
for arg do
  shift
  if [ `echo "$arg" | grep "-"` ]
  then
    if [ "$arg" = "-ssl" ]
    then
      SSL=1
    fi
    continue
  fi
  set -- "$@" "$arg"
done

#logger -p daemon.info -t cuxd.pty2tcp $*

if [ \( -n "$1" \) -a \( -n "$2" \) ]
then
  pid=0
  pidfile="/var/run/pty.$2.pid"
  if [ -f $pidfile ]
  then
    pid=`cat $pidfile`
#   echo "$pidfile ($pid)"
    if [ $pid -gt 1 ]
    then
      kill -0 $pid 2>/dev/null
      if [ $? -ne 0 ]
      then
        rm -f $pidfile
        pid=0
      fi
    else
      rm -f $pidfile
      pid=0
    fi
  fi
logger -p daemon.info -t cuxd.pty2tcp "$1 $2"
  case "$1" in
    start|restart|reconnect)
      if [ "$1" = "reconnect" ]
      then
        if [ $pid -ne 0 ]
        then
          kill_pid $pid
        else
          echo "no process"
          exit 1
        fi
      else
        if [ -n "$3" ]
        then
          if [ $pid -ne 0 ]
          then
            rm -f $pidfile
            kill_pid $pid
          fi
          echo -n "starting"
          echo $$ >$pidfile
          ( while [ -f $pidfile ]
            do
              if [ $SSL -ne 0 ]
              then
                $SOCATP pty,link=/dev/$2,wait-slave openssl-connect:$3,forever,$4 &
              else
                $SOCATP pty,link=/dev/$2,wait-slave tcp:$3,forever,$4 &
              fi
              pid=$!
              echo $pid >$pidfile
logger -p daemon.info -t cuxd.pty2tcp "start ($pid) $pidfile"
              check_device $pid $pidfile /dev/$2 &
              pid2=$!
              wait %1
#logger -p daemon.info -t cuxd.pty2tcp "kill check_device($pid2)"
              kill -0 $pid2 2>/dev/null
              if [ $? -eq 0 ]
              then
                kill -KILL $pid2
              fi
            done
          )&
          echo " ok"
        fi
      fi
    ;;
    stop)
      if [ $pid -ne 0 ]                                                                             
      then                                                                                          
        rm -f $pidfile
        kill_pid $pid
      fi                                                                                            
    ;;
  esac
else
  echo "usage: $0 (start|stop|restart|reconnect) ttyTCP<x> [-ssl] <ip>:<port>" 
fi

