sane-scripts: UPnP retrieves LAN IP from the gateway
This commit is contained in:
parent
37995e23c2
commit
a33950da62
Binary file not shown.
|
@ -62,8 +62,11 @@ def get_root_devices():
|
||||||
logger.info(f"root desc: {root_desc}")
|
logger.info(f"root desc: {root_desc}")
|
||||||
yield root_desc
|
yield root_desc
|
||||||
|
|
||||||
def get_wan_from_location(location: str):
|
def get_ips_from_location(location: str):
|
||||||
""" location = URI from the Location header, e.g. http://10.78.79.1:2189/rootDesc.xml """
|
"""
|
||||||
|
location = URI from the Location header, e.g. http://10.78.79.1:2189/rootDesc.xml
|
||||||
|
returns (lan, wan)
|
||||||
|
"""
|
||||||
|
|
||||||
# get connection [s]tatus
|
# get connection [s]tatus
|
||||||
cmd = ["upnpc", "-u", location, "-s"]
|
cmd = ["upnpc", "-u", location, "-s"]
|
||||||
|
@ -75,28 +78,27 @@ def get_wan_from_location(location: str):
|
||||||
status = res.stdout.decode("utf-8")
|
status = res.stdout.decode("utf-8")
|
||||||
logger.debug(f"got status: {status}")
|
logger.debug(f"got status: {status}")
|
||||||
|
|
||||||
|
lan = None
|
||||||
|
wan = None
|
||||||
for line in [l.strip() for l in status.split("\n")]:
|
for line in [l.strip() for l in status.split("\n")]:
|
||||||
sentinel = "ExternalIPAddress ="
|
wan_sentinel = "ExternalIPAddress ="
|
||||||
if line.startswith(sentinel):
|
lan_sentinel = "Local LAN ip address :"
|
||||||
ip = line[len(sentinel):].strip()
|
if line.startswith(wan_sentinel):
|
||||||
logger.info(f"got ExternalIPAddress = {ip} from {location}")
|
wan = line[len(wan_sentinel):].strip()
|
||||||
return ip
|
logger.info(f"got WAN = {wan} from {location}")
|
||||||
|
if line.startswith(lan_sentinel):
|
||||||
|
lan = line[len(lan_sentinel):].strip()
|
||||||
|
logger.info(f"got LAN = {lan} from {location}")
|
||||||
|
return lan, wan
|
||||||
|
|
||||||
def get_any_wan():
|
def get_any_wan():
|
||||||
""" return (location, WAN IP) for the first device seen which has a WAN IP """
|
""" return (location, LAN IP, WAN IP) for the first device seen which has a WAN IP """
|
||||||
for location in get_root_devices():
|
for location in get_root_devices():
|
||||||
wan = get_wan_from_location(location)
|
lan, wan = get_ips_from_location(location)
|
||||||
if wan:
|
if lan and wan:
|
||||||
return location, wan
|
return location, lan, wan
|
||||||
|
|
||||||
def get_lan_ip() -> str:
|
def forward_port(root_device: str, proto: str, port: int, lan_ip: str, reason: str = "", duration: int = 86400):
|
||||||
ips = subprocess.check_output(["hostname", "-i"]).decode("utf-8").strip().split(" ")
|
|
||||||
ips = [i for i in ips if i.startswith("10.") or i.startswith("192.168.")]
|
|
||||||
assert len(ips) == 1, ips
|
|
||||||
return ips[0]
|
|
||||||
|
|
||||||
def forward_port(root_device: str, proto: str, port: int, reason: str, duration: int = 86400, lan_ip: str = None):
|
|
||||||
lan_ip = lan_ip or get_lan_ip()
|
|
||||||
args = [
|
args = [
|
||||||
"upnpc",
|
"upnpc",
|
||||||
"-u", root_device,
|
"-u", root_device,
|
||||||
|
|
|
@ -23,5 +23,5 @@ if __name__ == '__main__':
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError(f"invalid CLI argument {arg!r}")
|
raise RuntimeError(f"invalid CLI argument {arg!r}")
|
||||||
_rootdev, wan_ip = get_any_wan()
|
_rootdev, _lan_ip, wan_ip = get_any_wan()
|
||||||
print(wan_ip)
|
print(wan_ip)
|
||||||
|
|
|
@ -86,7 +86,7 @@ if __name__ == '__main__':
|
||||||
print(e)
|
print(e)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
root_device, _wan = get_any_wan()
|
root_device, lan, _wan = get_any_wan()
|
||||||
hostname = subprocess.check_output(["hostname"]).decode("utf-8").strip()
|
hostname = subprocess.check_output(["hostname"]).decode("utf-8").strip()
|
||||||
for (proto, port) in forwards:
|
for (proto, port) in forwards:
|
||||||
forward_port(root_device, proto, port, f"colin-{hostname}", duration=duration)
|
forward_port(root_device, proto, port, lan_ip=lan, reason=f"colin-{hostname}", duration=duration)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user