#!/usr/bin/env python

usage="""\
TCP/IP delay script

This script acts as a proxy to delay TCP/IP data.  For example, if you
want 60-second delayed RTCM data then put this script in between two
receivers:
  Receiver 10.1.150.2 generating corrs on port 5017
  Receiver 10.1.150.3 has an open port 5018
./tcp_delay.py 10.1.150.2:5017 10.1.150.3:5018
"""

import socket
import time
from multiprocessing import Process, Queue
import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,description=usage)
parser.add_argument('src',
                    help='Source of data, e.g. 10.1.150.2:5017')
parser.add_argument('dst',
                    help='Destination for data, e.g. 10.1.150.3:5018')
parser.add_argument('--delay',
                    help='# of seconds to delay the data (default 60 secs)',
                    default="60")
args = parser.parse_args()

delay_secs = int(args.delay)
src_addr = args.src.split(':')
src_addr = (src_addr[0], int(src_addr[1]))
dst_addr = args.dst.split(':')
dst_addr = (dst_addr[0], int(dst_addr[1]))

src = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
src.connect( src_addr )
src.settimeout(1)

def dest_thread(q):
    dst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    dst.connect( dst_addr )
    while True:
        t, msg = q.get()
        while time.time() - t < delay_secs:
            time.sleep(1)
        dst.send(msg)

q = Queue()
p = Process(target=dest_thread, args=(q,))
p.start()

print("Connected..")
while True:
    try:
        msg = src.recv(128)
    except socket.timeout:
        time.sleep(0.1)
        continue
    if len(msg) == 0:
        break
    q.put( (time.time(), msg) )
