#!/usr/bin/env python
import os
import sys
import time
import socket
import json
import fcntl
import util

conf, lock, logger = util.initialize('shipper')

seq = util.get_log_seq()
for path in os.listdir('.'):
    fields = path.split('.')
    if (len(fields) != 2) or ('log' != fields[0]):
        continue

    file_seq = int(fields[1])
    if file_seq < (seq-12):
        os.remove(path)
        log('removed log file({0})'.format(path))
    elif os.fork() == 0:
        util.release_lock(lock)
        os.setsid()
        
        fd   = os.open(path, os.O_RDONLY)
        fcntl.flock(fd, fcntl.LOCK_EX|fcntl.LOCK_NB)

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((conf['collector_host'], conf['collector_port']))
        logger.log('connected to collector {0}'.format(sock.getpeername()))

        sock.sendall('%s' % (path))
        reply = sock.recv(10)

        if (len(reply) < 10) or (int(reply) < 0):
            exit(0)

        logger.log('filename({0}) size({1})'.format(path, int(reply)))
        os.lseek(fd, int(reply), os.SEEK_SET)

        while True:
            buffer = os.read(fd, 1024*1024*1024)

            if len(buffer) > 0:
                sock.sendall(buffer)
            else:
                time.sleep(1)
                if util.get_log_seq() > (file_seq+12):
                    logger.log('stopping monitoring file({0})'.format(path))
                    exit(0)
