addresserver/scanner.py

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()