#!/usr/bin/python3

from paho.mqtt import client as mqtt_cl
import time, random, json, configparser
import systemd.daemon

def system_id(ethdev):
	with open('/sys/class/net/{}/address'.format(ethdev), 'r') as f:
		data = f.read().split(':')
		return ''.join(data[:3] + ['ff', 'fe'] + data[3:]).strip().upper()

def connect_mqtt(config):
	def on_connect(client, userdata, flags, rc, properties):
		if rc == 0:
			print('Connected to MQTT Broker, subscribe topic {}'.format(config['mqtt.broker']['topic']))
			client.subscribe(config['mqtt.broker']['topic'])
			systemd.daemon.notify('READY=1')
		else:
			print("Failed to connect, return code %d\n", rc)
	def on_message(client, userdata, message):
		for gw in json.loads(message.payload)['uplink_message']['rx_metadata']:
			if gw['gateway_ids']['eui'] == system_id(config['lora.gateway']['NetDev']):
				systemd.daemon.notify('WATCHDOG=1')
	client_id = 'network_checker-{}'.format(system_id(config['lora.gateway']['NetDev']))
	client = mqtt_cl.Client(mqtt_cl.CallbackAPIVersion.VERSION2, client_id)
	client.on_connect = on_connect
	client.on_message = on_message
	client.connect(config['mqtt.broker']['Host'], int(config['mqtt.broker']['Port']))
	return client

if __name__ == '__main__':
	config = configparser.ConfigParser()
	config.read('/etc/network_checker.conf')
	mqtt_client = connect_mqtt(config)
	if mqtt_client != None:
		mqtt_client.loop_start()
	print("network_checker started")
	try:
		while True:
			time.sleep(0.1)
	except KeyboardInterrupt:
		print("stopped by SIGINT")
	if mqtt_client != None:
		mqtt_client.loop_stop()
	print('network_checker stopped')
