import netifaces import optparse import sys import socket import time import paho.mqtt.client as mqtt is_connected = False def on_connect(client, userdata, flags, rc): global is_connected if(rc == 0): is_connected = True hostname = socket.gethostname() parser = optparse.OptionParser() parser.add_option('-i', '--interface', action="store", dest="interface", help="Network Interface", default="") parser.add_option('-q', '--quite', action="store_true", dest="quite", help="No output") parser.add_option('-4', '--match4', action="store", dest="match4", help="IPv4 MUST start with this argument", default="") parser.add_option('-6', '--match6', action="store", dest="match6", help="IPv6 MUST start with this argument", default="") parser.add_option('--host', action="store", dest="mqqt_host", help="MQTT Host", default="") parser.add_option('--port', action="store", dest="mqqt_port", help="MQTT Port", default="1883") parser.add_option('--username', action="store", dest="mqqt_user", help="MQTT Username (optional)", default="") parser.add_option('--password', action="store", dest="mqqt_pass", help="MQTT Password (optional)", default="") options, args = parser.parse_args() client_enabled = not(not options.mqqt_host) if client_enabled: client = mqtt.Client() client.connect(options.mqqt_host, int(options.mqqt_port), 60) if options.mqqt_user and options.mqqt_pass: client.username_pw_set(username=options.mqqt_user, password=options.mqqt_pass) client.on_connect = on_connect client.loop_start() else: print("Warning: no MQTT server defined") if client_enabled: timeout = 10 while (not is_connected) and (timeout > 0): timeout -= 1 time.sleep(0.5) if timeout <= 0: print("MQTT timeout") sys.exit(-1) try: addrs = netifaces.ifaddresses(options.interface) except ValueError as ex: print("Invalid interface " + options.interface) sys.exit(-1) if not options.quite: print("Checking network interface " + options.interface + " on " + hostname) if not options.match4 and not options.quite: print("Warning: no IPv4-Match set") if not options.match6 and not options.quite: print("Warning: no IPv6-Match set") ipv4 = "" for addr in addrs[netifaces.AF_INET]: if addr["addr"].startswith(options.match4): ipv4 = addr["addr"] break ipv6 = "" for addr in addrs[netifaces.AF_INET6]: if addr["addr"].startswith(options.match6): ipv6 = addr["addr"] break if not options.quite: print("") print("Found IPv4 " + ipv4 + " and IPv6 " + ipv6) if client_enabled: client.publish("network/" + hostname + "/hostname", hostname) client.publish("network/" + hostname + "/ipv4", ipv4) client.publish("network/" + hostname + "/ipv6", ipv6) client.loop_stop()