#!/usr/bin/env bash

# tmux: start this script inside a new session
tmux_session="CN"
if [ "${TERMINAL}" = "tmux" ] && [ "$1" != "inside-tmux" ]; then
  echo "Starting tmux session '$tmux_session'"
  unset TMUX
  exec tmux new-session -s "$tmux_session" -n "RUN" "$0" "inside-tmux"
fi

if ! ../fill_config.py --check-stale; then
	echo
	echo "WARNING: STALE CONFIGS - your net configs are older than the templates they should be based on!"
	echo " * Hit enter to continue, and use the stale config files"
	echo " * Hit ^C and run 'make regen' to regenerate your configs"
	read enter_to_continue
fi

dev="${ETH_DEV}"
apn="${APN_DEV}"

sudo true || exit 1

if ! sudo iptables -t nat -C POSTROUTING -s ${GGSN_NET} -o $dev -j MASQUERADE 2>/dev/null; then
  echo "Adding iptables rule for masquerade"
  sudo iptables -t nat -I POSTROUTING -s ${GGSN_NET} -o $dev -j MASQUERADE
fi

if [ "$(sudo cat /proc/sys/net/ipv4/ip_forward)" = "0" ]; then
  sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
fi

if [ -z "$(ip tuntap show | grep $apn)" ]; then
  sudo ip tuntap add dev $apn mode tun user $USER group $USER
  sudo ip addr add ${GGSN_NET} dev $apn
  sudo ip link set $apn up
fi

if [ -z "$(ip addr show | grep "${TO_RAN_IP}")" ]; then
  echo "No interface has IP address ${TO_RAN_IP}! Hit enter to continue anyway."
  read enter_to_continue
fi
if [ -z "$(ip addr show | grep "${TO_RAN_IU_IP}")" ]; then
  echo "No interface has IP address ${TO_RAN_IU_IP}! Hit enter to 'ip addr add ${TO_RAN_IU_IP}/32 dev $dev'"
  read enter_to_continue
  sudo ip addr add ${TO_RAN_IU_IP}/32 dev $dev
fi

logdir="current_log"
piddir="run/pids"
launcherdir="run/launchers"
rm -rf "$launcherdir"
mkdir -p "$logdir" "$piddir" "$launcherdir"

find_term() {
  # Find a terminal program and write to the global "terminal" variable
  local programs="urxvt xterm tmux"

  if [ -z "${TERMINAL}" ]; then
    echo "ERROR: TERMINAL is not defined in your osmo-dev net config file. Please add it."
    exit 1
  fi

  case " $programs " in
    *" ${TERMINAL} "*)
      terminal="${TERMINAL}"

      if command -v "$terminal" >/dev/null; then
        echo "Terminal: ${TERMINAL}"
        return
      fi

      echo "ERROR: Terminal '${TERMINAL}' is configured, but not installed"
      exit 1
      ;;
  esac

  echo "ERROR: Terminal '${TERMINAL}' is not in list of supported terminals ($programs)"
  exit 1
}

pidfiles_must_not_exist() {
  local pidfile

  for pidfile in "$@"; do
    if [ -e "$pidfile" ]; then
      echo
      echo "ERROR: pidfile exists: $pidfile"
      echo
      kill_pids
      exit 1
    fi
  done
}

term() {
  title="$2"
  if [ -z "$title" ]; then
    title="$(basename $@)"
  fi

  local pidfile="$piddir/$title.pid"
  local pidfile_term="$piddir/$title.term.pid"
  pidfiles_must_not_exist "$pidfile" "$pidfile_term"

  local launcher="$launcherdir/$title.sh"

  cat << EOF > "$launcher"
#!/bin/sh

export LD_LIBRARY_PATH='/usr/local/lib'

$1 &
echo \$! > $pidfile
wait

echo

while true; do
  echo 'q Enter to close'
  read q_to_close < /dev/tty
  if [ "x\$q_to_close" = xq ]; then
    break
  fi
done
EOF
  chmod +x "$launcher"

  case "$terminal" in
    tmux)
      tmux new-window -d -n "$title" "$launcher &; echo \$! > $pidfile_term; wait"
      ;;
    *)
      $terminal \
        -title "CN:$title" \
        -e sh -c "$launcher" \
        &

      echo "$!" > "$pidfile_term"
      ;;
  esac
}

kill_pids() {
  local pidfile
  local pid

  for pidfile in "$piddir"/*.pid; do
    if ! [ -e "$pidfile" ]; then
      continue
    fi

    pid="$(cat "$pidfile")"

    echo "killing $(basename "$pidfile") ($pid)"
    sudo kill "$pid"
    rm "$pidfile"
  done
}

find_term
kill_pids

hnbgw="osmo-hnbgw"
msc="gdb -ex run --args $(which osmo-msc)"
# To enable udtrace on osmo-msc MNCC socket, use this with adjusted /path/to/udtrace:
# - LD_LIBRARY_PATH allows linking to titan if udtrace was compiled with titan support.
# - LD_PRELOAD of libasan allows building osmo-msc with the sanitize.opts.
# - the tee saves the stderr logging as well as the udtrace output to new file current_log/osmo-msc.out, since udtrace
#   will not show in osmo-msc.log
#msc="LD_LIBRARY_PATH=/usr/lib/titan LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5:/path/to/udtrace/libudtrace.so osmo-msc 2>&1 | tee -a current_log/osmo-msc.out"
gbproxy="osmo-gbproxy"
sgsn="osmo-sgsn"
ggsn="osmo-ggsn"
mgw4msc="osmo-mgw -c osmo-mgw-for-msc.cfg"
#mgw4bsc="gdb -ex run --args osmo-mgw"
#mgw4bsc="strace osmo-mgw"
mgw4bsc="osmo-mgw"
hlr="LD_LIBRARY_PATH=/usr/local/lib gdb -ex run --args osmo-hlr --db-upgrade"
stp4cn="osmo-stp -c osmo-stp-cn.cfg"
stp4ran="osmo-stp -c osmo-stp-ran.cfg"
bsc="LD_LIBRARY_PATH=/usr/local/lib gdb -ex run --args osmo-bsc"
bscnat="osmo-bsc-nat"

if [ "x${MSC_MNCC}" != "xinternal" ]; then
  sipcon="osmo-sip-connector -c osmo-sip-connector.cfg"

  case "${PBX_SERVER}" in
    "kamailio")
      # Require kamailio (PATH hack is needed for Debian)
      kamailio="$(PATH="$PATH:/usr/sbin:/sbin" which kamailio)"
      if [ -z "$kamailio" ]; then
        echo "ERROR: kamailio is not installed."
        echo "After installing it, make sure that it does *not* run as daemon."
        exit 1
      fi
      kamailio="$kamailio -f kamailio.cfg -D -e -E"
      ;;
   "freeswitch")
      if [ -z "$(which freeswitch)" ]; then
        echo "ERROR: freeswitch is not installed."
        echo "Guide: https://freeswitch.org/confluence/display/FREESWITCH/Debian+10+Buster"
        echo "After installing it, make sure that it does *not* run as daemon."
        exit 1
      fi
      ;;
   "none")
      ;;
   *)
     echo "ERROR: unknown value ${PBX_SERVER} for SIPCON_SERVER!"
     exit 1
     ;;
  esac
fi

PIDFILE_TCPDUMP_DEV="$piddir/tcpdump.$dev.pid"
PIDFILE_TCPDUMP_LO="$piddir/tcpdump.lo.pid"
pidfiles_must_not_exist "$PIDFILE_TCPDUMP_DEV" "$PIDFILE_TCPDUMP_LO"

sudo tcpdump -i $dev -n -w current_log/$dev.single.pcap -U not port 22 &
echo "$!" > "$PIDFILE_TCPDUMP_DEV"
sudo tcpdump -i lo -n -w current_log/lo.single.pcap -U not port 22 &
echo "$!" > "$PIDFILE_TCPDUMP_LO"

term "$ggsn" GGSN

if [ "${STP_CN_IP}" = "${STP_RAN_IP}" ]; then
  sleep .2
  term "$stp4cn" STP
else
  sleep .2
  term "$stp4cn" STP4CN

  sleep .2
  term "$stp4ran" STP4RAN

  sleep .2
  term "$bscnat" BSCNAT
fi

sleep .2
term "$hlr" HLR

sleep .2
term "$sgsn" SGSN

sleep .2
term "$gbproxy" GBPROXY

sleep .2
term "$mgw4msc" MGW4MSC

sleep .2
term "$msc" MSC

sleep 2
term "$hnbgw" HNBGW

sleep .2

if [ "$BSC_COUNT" = 1 ]; then
  term "$mgw4bsc -c osmo-mgw-for-bsc-0.cfg" MGW4BSC
  sleep .2
  term "$bsc -c osmo-bsc-0.cfg" BSC
else
  term "$mgw4bsc -c osmo-mgw-for-bsc-0.cfg" MGW4BSC0
  sleep .2
  term "$mgw4bsc -c osmo-mgw-for-bsc-1.cfg" MGW4BSC1
  sleep .2
  term "$bsc -c osmo-bsc-0.cfg" BSC0
  sleep .2
  term "$bsc -c osmo-bsc-1.cfg" BSC1
fi

if [ "x${MSC_MNCC}" != "xinternal" ]; then
  sleep .2
  term "$sipcon" SIPCON

  sleep .2
  case "${PBX_SERVER}" in
    "kamailio")
      term "$kamailio" KAMAILIO
      ;;
    "freeswitch")
      term "./freeswitch/freeswitch.sh" FREESWITCH
      ;;
  esac
fi

#ssh bts rm /tmp/bts.log /tmp/pcu.log
#ssh bts neels/run_remote.sh &

echo enter to close
read enter_to_close
echo Closing...

#ssh bts neels/stop_remote.sh

kill_pids

set +e
cp *.cfg "$logdir"/

echo
echo enter name to save log
read log_name
if [ -n "$log_name" ]; then
  newlogdir="log/$log_name"
  #scp "bts:/tmp/{bts,pcu}.log" "bts:neels/osmo-{bts,pcu}.cfg" "$logdir"
else
  log_name="log_$(date +%Y-%m-%d_%H-%M-%S)"
  newlogdir="autolog/$log_name"
fi
mkdir -p "$(dirname "$newlogdir")"

mergecap -w "$logdir/trace.pcap" "$logdir/"*.single.pcap && rm -f "$logdir/"*.single.pcap
mv "$logdir/trace.pcap" "$logdir/trace-$log_name.pcap"

if [ -x "$newlogdir" ]; then
  echo "already exists, move it manually: $newlogdir"
else
  echo mv "$logdir" "$newlogdir"
  mv "$logdir" "$newlogdir"
  mkdir -p "$logdir"
  logdir="$newlogdir"
fi
rm lastlog
ln -s "$logdir" lastlog
