diff options
author | Aaron LI <aaronly.me@outlook.com> | 2016-11-03 17:41:06 +0800 |
---|---|---|
committer | Aaron LI <aaronly.me@outlook.com> | 2016-11-03 17:41:06 +0800 |
commit | 8d653b602b8e75011e031a4018625dd4ab203da0 (patch) | |
tree | 8734c90a813f42e6c418388e14d7c708f501a4d8 /fg21sim/webui/utils.py | |
parent | a28ad462495b2a41ce5a1c2501dab3678cf3c22f (diff) | |
download | fg21sim-8d653b602b8e75011e031a4018625dd4ab203da0.tar.bz2 |
webui: Add "utils.py" to get the IP address
FIXME/TODO:
How to determine the WebSocket origin is in the same subnet as the
server? An additional network mask required to determine this.
How does this additional mask passed?
Diffstat (limited to 'fg21sim/webui/utils.py')
-rw-r--r-- | fg21sim/webui/utils.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/fg21sim/webui/utils.py b/fg21sim/webui/utils.py new file mode 100644 index 0000000..1cea69f --- /dev/null +++ b/fg21sim/webui/utils.py @@ -0,0 +1,72 @@ +# Copyright (c) 2016 Weitian LI <liweitianux@live.com> +# MIT license + +""" +Utilities for the Web UI +""" + + +from urllib.parse import urlparse +import socket + + +def get_host_ip(url): + """ + This function parses the input URL to get the hostname (or an IP), + then the hostname is further resolved to its IP address. + + Parameters + ---------- + url : str + An URL string, which generally has the following format: + ``scheme://netloc/path;parameters?query#fragment`` + while the ``netloc`` may look like ``user:pass@example.com:port`` + + Returns + ------- + ip : str + An IPv4 address string. + If something wrong happens (e.g., ``gaierror``), then ``None`` + is returned. + """ + netloc = urlparse(url).netloc + hostname = netloc.split("@")[-1].split(":")[0] + try: + ip = socket.gethostbyname(hostname) + except socket.gaierror: + ip = None + return ip + + +def get_local_ip(host="localhost", timeout=3.0): + """ + Get the local IP address of this machine where this script runs. + + A dummy socket will be created and connects to the given host, then + the valid local IP address used in this connection can be obtained. + + Parameters + ---------- + host : str + The host to which will be connected by a dummy socket, in order + to determine the valid IP address. + timeout : float + Timeout (in seconds) on the blocking socket operations (e.g., + ``connect()``) + + Returns + ------- + ip : str + The local IPv4 address of this machine as a string. + If something wrong happens (e.g., ``gaierror``), then ``None`` + is returned. + """ + with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: + try: + s.settimeout(timeout) + # Use 0 as the port will let OS determine the free port + s.connect((host, 0)) + ip = s.getsockname()[0] + except (socket.gaierror, socket.timeout): + ip = None + return ip |