#!/usr/bin/python

import os
import re
import sys
import syslog
import datetime
import tempfile
import traceback
import subprocess

try:
    ## write statistics
    logfd = file('/var/log/ifstats.log', 'a')

    ifstat = subprocess.Popen([ 'ip', '-s', 'link' ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    regname = re.compile('^[0-9]+: ([^:]+): ')
    reglink = re.compile('^[ ]+link[/]([^ ]+) ')
    regrxtx = re.compile('^[ ]+(RX|TX): ')
    regstat = re.compile('^[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)')

    stout, sterr = ifstat.communicate()

    ifdata = {}

    ifname = None

    for ln in stout.splitlines():
        m1 = regname.match(ln)
        if m1 is not None:
            ifname = m1.group(1)
            ifdata[ifname] = []
            continue

        m2 = reglink.match(ln)
        if m2 is not None:
            if m2.group(1) <> 'ether':
                if ifname is not None:
                    del ifdata[ifname]
                    ifname = None
                continue

        if ifname is None:
            continue

        m3 = regrxtx.match(ln)
        if m3 is not None:
            flow = m3.group(1)
            continue

        m4 = regstat.match(ln)
        if m4 is not None:
            if flow == 'RX':
                ext1, ext2 = 'r', 'm'
            else:
                ext1, ext2 = 'c', 'o'

            ifdata[ifname].append('%s {b=%012xh,p=%08xh,e=%03xh,d=%03xh,%s=%03xh,%s=%03xh}' % (flow,
                int(m4.group(1)), int(m4.group(2)), int(m4.group(3)), int(m4.group(4)),
                    ext1, int(m4.group(5)), ext2, int(m4.group(6))))

    ## get interrupt info
    ifintr = file('/proc/interrupts')

    regintr = re.compile('^[ ]*([0-9]+): ([0-9 \t]+) ([A-Za-z][^ ]+)[ \t]+(.+)')

    for ln in ifintr.readlines():
        m1 = regintr.match(ln)
        if m1 is not None:
            lst = re.split('[,\t ]+', m1.group(4).strip())
            ifs = [v for v in lst if v in ifdata.keys()]

            if len(ifs) <> 0:
                intrs = re.split('[\t ]+', m1.group(2).strip())
                numbs = [ int(v) for v in intrs ]
                for iface in ifs:
                    text = 'IRQ_' + m1.group(1) + '=' + str(sum(numbs))
                    if len(intrs) > 1:
                        text = text + ' (' + '+'.join(intrs) + ']\n'
                    ifdata[iface].append(text)

    for iface in ifdata.keys():
        logfd.write(datetime.datetime.now().strftime('%F %T ') + iface + ' ' + ' '.join(ifdata[iface]))

    logfd.close()

except Exception, e:
    syslog.openlog('sng-watchdog-test', syslog.LOG_USER)
    syslog.syslog(syslog.LOG_CRIT, 'Interfaces log failed: ' + str(e))
    for ln in traceback.format_list(traceback.extract_tb(sys.exc_traceback)):
        syslog.syslog(syslog.LOG_CRIT, '    ' + ln)
    syslog.closelog()
    print >> sys.stderr, 'interfaces log failed: ' + str(e)

## TEST: write to / and /var
try:
    f1 = tempfile.TemporaryFile(dir='/', prefix='.watchdog')
    f2 = tempfile.TemporaryFile(dir='/var', prefix='.watchdog')
    f1.write('x')
    f2.write('x')
    f1.close()
    f2.close()

except Exception, e:
    syslog.openlog('sng-watchdog-test', syslog.LOG_USER)
    syslog.syslog(syslog.LOG_CRIT, 'Write test failed: ' + str(e))
    for ln in traceback.format_list(traceback.extract_tb(sys.exc_traceback)):
        syslog.syslog(syslog.LOG_CRIT, '    ' + ln)
    syslog.closelog()
    print >> sys.stderr, 'error: ' + str(e)
    sys.exit(-10)

sys.exit(0)
