mycroft-core/mycroft/util/network_utils.py

78 lines
2.1 KiB
Python

import requests
import socket
from urllib.request import urlopen
from urllib.error import URLError
from .log import LOG
def connected():
"""Check connection by connecting to 8.8.8.8 and if google.com is
reachable if this fails, Check Microsoft NCSI is used as a backup.
Returns:
True if internet connection can be detected
"""
if _connected_dns():
# Outside IP is reachable check if names are resolvable
return _connected_google()
else:
# DNS can't be reached, do a complete fetch in case it's blocked
return _connected_ncsi()
def _connected_ncsi():
"""Check internet connection by retrieving the Microsoft NCSI endpoint.
Returns:
True if internet connection can be detected
"""
try:
r = requests.get('http://www.msftncsi.com/ncsi.txt')
if r.text == 'Microsoft NCSI':
return True
except Exception:
pass
return False
def _connected_dns(host="8.8.8.8", port=53, timeout=3):
"""Check internet connection by connecting to DNS servers
Returns:
True if internet connection can be detected
"""
# Thanks to 7h3rAm on
# Host: 8.8.8.8 (google-public-dns-a.google.com)
# OpenPort: 53/tcp
# Service: domain (DNS/TCP)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
s.connect((host, port))
return True
except IOError:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
s.connect(("8.8.4.4", port))
return True
except IOError:
return False
def _connected_google():
"""Check internet connection by connecting to www.google.com
Returns:
True if connection attempt succeeded
"""
connect_success = False
try:
urlopen('https://www.google.com', timeout=3)
except URLError as ue:
LOG.debug('Attempt to connect to internet failed: ' + str(ue.reason))
else:
connect_success = True
return connect_success