From 15b017656e6865b7b85ae389ab3b462c562a1e42 Mon Sep 17 00:00:00 2001 From: antialias Date: Tue, 25 Sep 2012 16:05:02 -0400 Subject: moved LeapNetworkChecker and test in base. --- src/leap/base/checks.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/leap/base/checks.py (limited to 'src/leap/base/checks.py') diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py new file mode 100644 index 00000000..c5438b09 --- /dev/null +++ b/src/leap/base/checks.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +import platform + +import ping +import requests + +from leap.base import constants +from leap.base import exceptions + + +class LeapNetworkChecker(object): + """ + all network related checks + """ + # TODO eventually, use a more portable solution + # like psutil + + def run_all(self, checker=None): + if not checker: + checker = self + self.error = None # ? + + # for MVS + checker.check_internet_connection() + checker.is_internet_up() + checker.ping_gateway() + + def check_internet_connection(self): + try: + # XXX remove this hardcoded random ip + requests.get('http://216.172.161.165') + except (requests.HTTPError, requests.RequestException) as e: + raise exceptions.NoInternetConnection(e.message) + except requests.ConnectionError as e: + error = "Unidentified Connection Error" + if e.message == "[Errno 113] No route to host": + if not self.is_internet_up(): + error = "No valid internet connection found." + else: + error = "Provider server appears to be down." + raise exceptions.NoInternetConnection(error) + + def is_internet_up(self): + iface, gateway = self.get_default_interface_gateway() + self.ping_gateway(self) + + def get_default_interface_gateway(self): + """only impletemented for linux so far.""" + if not platform.system() == "Linux": + raise NotImplementedError + + f = open("/proc/net/route") + route_table = f.readlines() + f.close() + #toss out header + route_table.pop(0) + + default_iface = None + gateway = None + while route_table: + line = route_table.pop(0) + iface, destination, gateway = line.split('\t')[0:3] + if destination == '00000000': + default_iface = iface + break + + if not default_iface: + raise exceptions.NoDefaultInterfaceFoundError + + if default_iface not in netifaces.interfaces(): + raise exceptions.InterfaceNotFoundError + + return default_iface, gateway + + def ping_gateway(self, gateway): + #TODO: Discuss how much packet loss (%) is acceptable. + packet_loss = ping.quiet_ping(gateway)[0] + if packet_loss > constants.MAX_ICMP_PACKET_LOSS: + raise exceptions.NoConnectionToGateway -- cgit v1.2.3 From 202345940e12d4633c5d46d5ed21c3a433573d48 Mon Sep 17 00:00:00 2001 From: antialias Date: Fri, 28 Sep 2012 18:15:47 -0400 Subject: Added check that default route is tun0. --- src/leap/base/checks.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/leap/base/checks.py') diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py index c5438b09..a775e162 100644 --- a/src/leap/base/checks.py +++ b/src/leap/base/checks.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +import logging import platform import ping @@ -8,6 +9,7 @@ import requests from leap.base import constants from leap.base import exceptions +logger = logging.getLogger(name=__name__) class LeapNetworkChecker(object): """ @@ -22,6 +24,7 @@ class LeapNetworkChecker(object): self.error = None # ? # for MVS + checker.check_tunnel_default_interface() checker.check_internet_connection() checker.is_internet_up() checker.ping_gateway() @@ -40,11 +43,35 @@ class LeapNetworkChecker(object): else: error = "Provider server appears to be down." raise exceptions.NoInternetConnection(error) + logger.debug('Network appears to be up.') def is_internet_up(self): iface, gateway = self.get_default_interface_gateway() self.ping_gateway(self) + def check_tunnel_default_interface(self): + """ + Raises an TunnelNotDefaultRouteError + (including when no routes are present) + """ + if not platform.system() == "Linux": + raise NotImplementedError + + f = open("/proc/net/route") + route_table = f.readlines() + f.close() + #toss out header + route_table.pop(0) + + if not route_table: + raise exceptions.TunnelNotDefaultRouteError() + + line = route_table.pop(0) + iface, destination = line.split('\t')[0:2] + if not destination == '00000000' or not iface == 'tun0': + raise exceptions.TunnelNotDefaultRouteError() + + def get_default_interface_gateway(self): """only impletemented for linux so far.""" if not platform.system() == "Linux": -- cgit v1.2.3 From 31c0afa5eb9bc7566ca39099520e8adc7b531e22 Mon Sep 17 00:00:00 2001 From: kali Date: Fri, 5 Oct 2012 20:15:12 +0900 Subject: pep8 --- src/leap/base/checks.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/leap/base/checks.py') diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py index a775e162..d02c9a3d 100644 --- a/src/leap/base/checks.py +++ b/src/leap/base/checks.py @@ -3,6 +3,7 @@ import logging import platform +import netifaces import ping import requests @@ -11,6 +12,7 @@ from leap.base import exceptions logger = logging.getLogger(name=__name__) + class LeapNetworkChecker(object): """ all network related checks @@ -51,7 +53,7 @@ class LeapNetworkChecker(object): def check_tunnel_default_interface(self): """ - Raises an TunnelNotDefaultRouteError + Raises an TunnelNotDefaultRouteError (including when no routes are present) """ if not platform.system() == "Linux": @@ -71,7 +73,6 @@ class LeapNetworkChecker(object): if not destination == '00000000' or not iface == 'tun0': raise exceptions.TunnelNotDefaultRouteError() - def get_default_interface_gateway(self): """only impletemented for linux so far.""" if not platform.system() == "Linux": -- cgit v1.2.3 From 1cbf954d9eda71cabfa58811c09bc63cfe9465d5 Mon Sep 17 00:00:00 2001 From: kali Date: Fri, 5 Oct 2012 21:21:22 +0900 Subject: add comments to netchecks --- src/leap/base/checks.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'src/leap/base/checks.py') diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py index d02c9a3d..0dbb2846 100644 --- a/src/leap/base/checks.py +++ b/src/leap/base/checks.py @@ -17,8 +17,15 @@ class LeapNetworkChecker(object): """ all network related checks """ - # TODO eventually, use a more portable solution - # like psutil + # TODO refactor to use psutil --- + + # #718 + # XXX get provider gateway as a parameter + # for constructor. + # def __init__(self, *args, **kwargs): + # ... + # provider_gw = kwargs.pop('provider_gw', None) + # self.provider_gateway = provider_gw def run_all(self, checker=None): if not checker: @@ -29,12 +36,23 @@ class LeapNetworkChecker(object): checker.check_tunnel_default_interface() checker.check_internet_connection() checker.is_internet_up() + + # XXX We are pinging the default gateway for our connection right? + # kali: 2012-10-05 20:59 -- I think we should get + # also the default gateway and ping it instead. checker.ping_gateway() + # something like: ? + # see __init__ above + # if self.provider_gateway: + # checker.ping_gateway(self.provider_gateway) + def check_internet_connection(self): try: # XXX remove this hardcoded random ip + # ping leap.se or eip provider instead...? requests.get('http://216.172.161.165') + except (requests.HTTPError, requests.RequestException) as e: raise exceptions.NoInternetConnection(e.message) except requests.ConnectionError as e: @@ -44,6 +62,7 @@ class LeapNetworkChecker(object): error = "No valid internet connection found." else: error = "Provider server appears to be down." + logger.error(error) raise exceptions.NoInternetConnection(error) logger.debug('Network appears to be up.') @@ -78,6 +97,7 @@ class LeapNetworkChecker(object): if not platform.system() == "Linux": raise NotImplementedError + # XXX use psutil f = open("/proc/net/route") route_table = f.readlines() f.close() @@ -102,7 +122,21 @@ class LeapNetworkChecker(object): return default_iface, gateway def ping_gateway(self, gateway): - #TODO: Discuss how much packet loss (%) is acceptable. + # TODO: Discuss how much packet loss (%) is acceptable. + + # XXX -- validate gateway + # -- is it a valid ip? (there's something in util) + # -- is it a domain? + # -- can we resolve? -- raise NoDNSError if not. packet_loss = ping.quiet_ping(gateway)[0] if packet_loss > constants.MAX_ICMP_PACKET_LOSS: raise exceptions.NoConnectionToGateway + + # XXX check for name resolution servers + # dunno what's the best way to do this... + # check for etc/resolv entries or similar? + # just try to resolve? + # is there something in psutil? + + # def check_name_resolution(self): + # pass -- cgit v1.2.3 From 6728eb9afb21bad867e4052a6190a9bdb34c928a Mon Sep 17 00:00:00 2001 From: kali Date: Mon, 8 Oct 2012 07:50:24 +0900 Subject: popup dialog error when network error happens we are shutting down for now. we should be acting upon failures in the near future. lowered the recurrent checks interval to 10 seconds. --- src/leap/base/checks.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/leap/base/checks.py') diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py index 0dbb2846..84f9dd46 100644 --- a/src/leap/base/checks.py +++ b/src/leap/base/checks.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- - import logging import platform @@ -17,8 +16,6 @@ class LeapNetworkChecker(object): """ all network related checks """ - # TODO refactor to use psutil --- - # #718 # XXX get provider gateway as a parameter # for constructor. -- cgit v1.2.3