#!/usr/bin/python3

import json
import paho.mqtt.publish as publish
import re
import subprocess
import sys

msg = list()

def append_msg(topic, tag, meas):
    global msg
    msg.append({'topic' : topic,
                'payload' : re.sub(r"[\n\t\s]*", "", tag)
                + ' ' + re.sub(r"[\n\t\s]*", "", meas)})


def cli(argv=sys.argv[1:]):
    result = subprocess.run(["/bin/hostname"], capture_output=True, text=True)
    hostname = str(result.stdout)
    result = subprocess.run(["/bin/date", "--utc", "+%D %T"], capture_output=True, text=True)
    datetime = str(result.stdout).split()
    date = datetime[0]
    timestamp = datetime[1]
    
    tag = 'hostname=' + hostname
    tag += ',date=' + date
    tag += ',timestamp=' + timestamp

    result = subprocess.run(["/usr/bin/nstat", "-z", "--json"], capture_output=True, text=True)
    txt = str(result.stdout).split()
    txt = ' '.join(txt)

    j = json.loads(txt)
    stats = j['kernel']
    
    
    fields = ['IpInHdrErrors',
              'IpInAddrErrors',
              'IpForwDatagrams',
              'IpInUnknownProtos',
              'IpInDiscards',
              'IpInDelivers',
              'IpOutRequests',
              'IpOutDiscards',
              'IpOutNoRoutes',
              'IpReasmTimeout',
              'IpReasmReqds',
              'IpReasmOKs',
              'IpReasmFails',
              'IpFragOKs',
              'IpFragFails',
              'IpFragCreates']

    meas = 'IpInReceives=' + str(stats['IpInReceives'])
    for f in fields:
        meas += (',' + f + '=' + str(stats[f]))
    append_msg('v1/ipv4', tag, meas)
    
    fields = ['Ip6InHdrErrors',
              'Ip6InTooBigErrors',
              'Ip6InNoRoutes',
              'Ip6InAddrErrors',
              'Ip6InUnknownProtos',
              'Ip6InTruncatedPkts',
              'Ip6InDiscards',
              'Ip6InDelivers',
              'Ip6OutForwDatagrams',
              'Ip6OutRequests',
              'Ip6OutDiscards',
              'Ip6OutNoRoutes',
              'Ip6ReasmTimeout',
              'Ip6ReasmReqds',
              'Ip6ReasmOKs',
              'Ip6ReasmFails',
              'Ip6FragOKs',
              'Ip6FragFails',
              'Ip6FragCreates',
              'Ip6InMcastPkts',
              'Ip6OutMcastPkts',
              'Ip6InOctets',
              'Ip6OutOctets',
              'Ip6InMcastOctets',
              'Ip6OutMcastOctets',
              'Ip6InBcastOctets',
              'Ip6OutBcastOctets',
              'Ip6InNoECTPkts',
              'Ip6InECT1Pkts',
              'Ip6InECT0Pkts',
              'Ip6InCEPkts']

    meas = 'Ip6InReceives=' + str(stats['Ip6InReceives'])
    for f in fields:
        meas += (',' + f + '=' + str(stats[f]))
    append_msg('v1/ipv6', tag, meas)

    publish.multiple(msg)


if __name__ == "__main__":
    cli()

