#!/usr/bin/python

import os
import re
import sys
import syslog
import tempfile
import traceback
import xml.dom.minidom as xml

options_values = {
         'admin': '',
      'interval': '20',
       'logtick': '3',
    'min-memory': '64000',
      'priority': '1',
      'realtime': 'yes',
 'repair-binary': '/usr/local/sng/scripts/sng-watchdog-repair',
   'test-binary': '/usr/local/sng/scripts/sng-watchdog-test',
}

def setup_options(fo, fn, vals):
    rstr = '^[ \t]*([#][^a-zA-Z]*)?[ \t]*(' + '|'.join(vals.keys()) + ')[ \t]*[=][ \t]*([^\n]*[^\n\t ])?[ \t\n]*'
    reg = re.compile(rstr)
    exc = re.compile('^[#]+ sng-update-watchdog -')

    data = []
    done = set()

    for ln in file(fn).readlines():
        if exc.match(ln):
            break

        m = reg.match(ln)

        if m is not None:
            commented = False

            if m.group(1) is not None:
                if m.group(1).find('#') == 0:
                    commented = True

            key = m.group(2)

            if not commented and key.find('#') == 0:
                commented = True
                key = key[1:]

            if key in done:
                continue

            if m.group(3) is not None:
                if m.group(3) <> vals[key]:
                    if not commented:
                        data.append('#' + ln.rstrip() + '\n')
                        continue
                else:
                    if not commented:
                        done.add(key)
            else:
                if vals[key] <> '':
                    if not commented:
                        data.append('#' + ln.rstrip() + '\n')
                        continue
                else:
                    if not commented:
                        done.add(key)

        data.append(ln)

    for ln in data:
        fo.write(ln)
        m = reg.match(ln)

        if m is None:
            continue

        key = m.group(2)
        if key in done:
            continue

        fo.write(key + ' \t\t= ' + vals[key] + '\n')
        done.add(key)

    for key in vals.keys():
        if key in done:
            continue
        fo.write(key + ' \t\t= ' + vals[key] + '\n')

def setup_vocallo(fo, fn):
    vocallo = xml.parse(fn)

    ifaces = set()
    modules = set()

    for devnode in vocallo.documentElement.getElementsByTagName('device'):
        ifaces.add(devnode.getElementsByTagName('ifname')[0].childNodes[0].data)
        for ipnode in devnode.getElementsByTagName('ip'):
            modules.add(ipnode.childNodes[0].data)

    if len(ifaces) <> 0 or len(modules) <> 0:
        fo.write('## sng-update-watchdog - the lines below were automatically generated.\n')
        fo.write('## everything below this comment will be erased after next update.\n\n')

    for iface in ifaces:
        fo.write('interface \t\t= ' + iface + '\n')

    for module in modules:
        fo.write('ping \t\t\t= ' + module + '\n')

cfgname = '/etc/watchdog.conf'
tmpname = None

vocalloxml = '/usr/local/nsc/conf/mod_sangoma_media_servire/vocallo.xml'

try:
    tmpfd, tmpname = tempfile.mkstemp(prefix='watchdog') # delete=False
    tmpfile = os.fdopen(tmpfd, 'w')

    setup_options(tmpfile, cfgname, options_values)

    if os.access(vocalloxml, os.F_OK):
        setup_vocallo(tmpfile, vocalloxml)

    tmpfile.close()

    bakname = cfgname + '.orig'

    if not os.access(bakname, os.F_OK):
        os.rename(cfgname, bakname)

    os.rename(tmpname, cfgname)

except Exception, e:
    syslog.openlog('sng-update-watchdog', syslog.LOG_USER)
    syslog.syslog(syslog.LOG_CRIT, 'unable update watchdog configuration: ' + 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)

    os.unlink(tmpname)
    sys.exit(1)

sys.exit(0)
