#!/usr/bin/python
#
# Script for translating console output (from STDIN) into Autotest
# warning messages.

import gzip, optparse, os, signal, sys, time
import common
from autotest_lib.client.common_lib import time_utils
from autotest_lib.server.hosts.monitors import monitors_util

PATTERNS_PATH = os.path.join(os.path.dirname(__file__), 'console_patterns')

usage = 'usage: %prog [options] logfile_name warn_fd'
parser = optparse.OptionParser(usage=usage)
parser.add_option(
    '-t', '--log_timestamp_format',
    default='[%s]' % time_utils.TIME_FMT,
    help='Timestamp format for log messages')
parser.add_option(
    '-p', '--pattern_paths',
    default=PATTERNS_PATH,
    help='Path to alert hook patterns file')


def _open_logfile(logfile_base_name):
    """Opens an output file using the given name.

    A timestamp and compression is added to the name.

    @param logfile_base_name - The log file path without a compression suffix.
    @returns An open file like object.  Its close method must be called before
            exiting or data may be lost due to internal buffering.
    """
    timestamp = int(time.time())
    while True:
        logfile_name = '%s.%d-%d.gz' % (logfile_base_name,
                                        timestamp, os.getpid())
        if not os.path.exists(logfile_name):
            break
        timestamp += 1
    logfile = gzip.GzipFile(logfile_name, 'w')
    return logfile


def _set_logfile_close_signal_handler(logfile):
    """Setup a signal handler to explicitly call logfile.close() and exit.

    Because we are writing a compressed file we need to make sure we properly
    close to flush our internal buffer on exit. logfile_monitor.py sends us
    a SIGTERM and waits 5 seconds for before sending a SIGKILL so we have
    plenty of time to do this.

    @param logfile - An open file object to be closed on SIGTERM.
    """
    def _on_signal_close_logfile_before_exit(unused_signal_no, unused_frame):
        logfile.close()
        os.exit(1)
    signal.signal(signal.SIGTERM, _on_signal_close_logfile_before_exit)


def _unset_signal_handler():
    signal.signal(signal.SIGTERM, signal.SIG_DFL)


def main():
    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.print_help()
        sys.exit(1)

    logfile = _open_logfile(args[0])
    warnfile = os.fdopen(int(args[1]), 'w', 0)
    # For now we aggregate all the alert_hooks.
    alert_hooks = []
    for patterns_path in options.pattern_paths.split(','):
        alert_hooks.extend(monitors_util.build_alert_hooks_from_path(
                patterns_path, warnfile))

    _set_logfile_close_signal_handler(logfile)
    try:
        monitors_util.process_input(
            sys.stdin, logfile, options.log_timestamp_format, alert_hooks)
    finally:
        logfile.close()
        _unset_signal_handler()


if __name__ == '__main__':
    main()
