#!/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"
      ;;
    *)
      sleep .2
      $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"
bts="osmo-bts-virtual"
virtphy="virtphy"
ms="mobile -c mobile.cfg"

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
  term "$stp4cn" STP
else
  term "$stp4cn" STP4CN
  term "$stp4ran" STP4RAN
  term "$bscnat" BSCNAT
fi

term "$hlr" HLR
term "$sgsn" SGSN
term "$gbproxy" GBPROXY
term "$mgw4msc" MGW4MSC
term "$msc" MSC
term "$hnbgw" HNBGW


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

${foreach(BTS)}
if [ "${BTSn_RUN_IN_OSMO_DEV}" = 1 ]; then
  term "$bts -c osmo-bts-${BTSn}.cfg" BTS${BTSn}
fi
${foreach_end}

if [ "${MS_RUN_IN_OSMO_DEV}" = 1 ]; then
  term "$virtphy" VIRTPHY
  term "$ms" MS
fi

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

  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
