#!/usr/bin/python
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2015-2017 Lenovo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import codecs
from datetime import datetime as dt
import optparse
import os
import signal
import sys

try:
    signal.signal(signal.SIGPIPE, signal.SIG_DFL)
except AttributeError:
    pass
path = os.path.dirname(os.path.realpath(__file__))
path = os.path.realpath(os.path.join(path, '..', 'lib', 'python'))
if path.startswith('/opt'):
    sys.path.append(path)

import confluent.client as client

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

argparser = optparse.OptionParser(
    usage="Usage: %prog [options] noderange [clear]")
(options, args) = argparser.parse_args()
try:
    noderange = args[0]
except IndexError:
    argparser.print_help()
    sys.exit(1)

deletemode = False
if len(sys.argv) == 3:
    if sys.argv[2] == 'clear':
        deletemode = True

session = client.Command()
exitcode = 0

def format_event(evt):
    retparts = []
    if 'timestamp' in evt and evt['timestamp'] is not None:
        display = dt.strptime(evt['timestamp'], '%Y-%m-%dT%H:%M:%S')
        retparts.append(display.strftime('%m/%d/%Y %H:%M:%S'))
    dscparts = []
    if 'component_type' in evt and evt['component_type'] is not None:
        dscparts.append(evt['component_type'])
    if 'component' in evt and evt['component'] is not None:
        dscparts.append(evt['component'])
    if 'event' in evt and evt['event'] and evt['event'] is not None:
        evttext = evt['event']
        try:
            if evttext.startswith(evt['component'] + ' - '):
                evttext = evt['event'].replace(evt['component'] + ' - ', '')
        except (KeyError, TypeError):
            pass
        dscparts.append(evttext)
    retparts.append(' - '.join(dscparts))
    return ' '.join(retparts)


if deletemode:
    func = session.delete
else:
    func = session.read
for rsp in func('/noderange/{0}/events/hardware/log'.format(noderange)):
    if 'error' in rsp:
        sys.stderr.write(rsp['error'] + '\n')
        exitcode |= rsp['errorcode']
    if 'databynode' in rsp:
        nodedata = rsp['databynode']
        for node in nodedata:
            thisdata = nodedata[node]
            if 'error' in thisdata:
               sys.stderr.write('{0}: {1}\n'.format(node, thisdata['error']))
               exitcode |= 1
            if 'events' in thisdata:
               evtdata = thisdata['events']
               for evt in evtdata:
                   print '{0}: {1}'.format(node, format_event(evt))