93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
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() |