sane-ip-check: implement a retry loop
This commit is contained in:
@@ -14,11 +14,16 @@ import logging
|
|||||||
import requests
|
import requests
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
from sane_ssdp import get_any_wan
|
from sane_ssdp import get_any_wan
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# retry on failure to get IP address until this much time has elapsed.
|
||||||
|
# not a strict deadline/timeout
|
||||||
|
MAX_DURATION = 45.0
|
||||||
|
|
||||||
def get_wan_fallback():
|
def get_wan_fallback():
|
||||||
"untrusted method in which to get the WAN IP"
|
"untrusted method in which to get the WAN IP"
|
||||||
r = requests.get("https://ipinfo.io/ip")
|
r = requests.get("https://ipinfo.io/ip")
|
||||||
@@ -29,13 +34,28 @@ def get_wan_fallback():
|
|||||||
else:
|
else:
|
||||||
return ip
|
return ip
|
||||||
|
|
||||||
def main(format: str, try_upnp: bool, expect: str|None) -> None:
|
def try_get_once(try_upnp: bool) -> tuple[str|None, str]:
|
||||||
upnp_details = get_any_wan() if try_upnp else None
|
upnp_details = get_any_wan() if try_upnp else None
|
||||||
if upnp_details:
|
if upnp_details:
|
||||||
root_dev, _lan_ip, wan_ip = upnp_details
|
root_dev, _lan_ip, wan_ip = upnp_details
|
||||||
else:
|
else:
|
||||||
root_dev, wan_ip = "", get_wan_fallback()
|
root_dev, wan_ip = "", get_wan_fallback()
|
||||||
|
|
||||||
|
return root_dev, wan_ip
|
||||||
|
|
||||||
|
def get_fault_tolerant(try_upnp: bool) -> tuple[str|None, str]:
|
||||||
|
start = time.time()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
return try_get_once(try_upnp)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(e)
|
||||||
|
if time.time() - start > MAX_DURATION:
|
||||||
|
raise
|
||||||
|
|
||||||
|
def main(format: str, try_upnp: bool, expect: str|None) -> None:
|
||||||
|
root_dev, wan_ip = get_fault_tolerant(try_upnp)
|
||||||
|
|
||||||
if expect:
|
if expect:
|
||||||
assert wan_ip == expect, f"actual IP {wan_ip} != expected IP {expect}"
|
assert wan_ip == expect, f"actual IP {wan_ip} != expected IP {expect}"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user