diff options
| author | antialias <antialias@leap.se> | 2012-11-19 16:16:01 -0800 | 
|---|---|---|
| committer | kali <kali@leap.se> | 2013-01-15 22:42:17 +0900 | 
| commit | 14f433c16de60753d122d5946df68e8e82285ca3 (patch) | |
| tree | 14ad5d77836d4458855737740f42fd089035dda0 | |
| parent | 348eb0852d6f1b8b2b72baba8a236bc30a6f2a4e (diff) | |
implemented abstracted layer with matching and passed callback.
tests as well.
| -rw-r--r-- | src/leap/base/checks.py | 21 | ||||
| -rw-r--r-- | src/leap/base/network.py | 9 | ||||
| -rw-r--r-- | src/leap/base/tests/test_checks.py | 38 | ||||
| -rw-r--r-- | src/leap/baseapp/eip.py | 4 | 
4 files changed, 62 insertions, 10 deletions
| diff --git a/src/leap/base/checks.py b/src/leap/base/checks.py index 4d4a5d8b..587012fb 100644 --- a/src/leap/base/checks.py +++ b/src/leap/base/checks.py @@ -12,6 +12,9 @@ from leap.base import exceptions  logger = logging.getLogger(name=__name__) +#EVENTS OF NOTE +EVENT_CONNECT_REFUSED = "[ECONNREFUSED]: Connection refused (code=111)" +  class LeapNetworkChecker(object):      """ @@ -34,6 +37,8 @@ class LeapNetworkChecker(object):          if self.provider_gateway:              checker.ping_gateway(self.provider_gateway) +        checker.parse_log_and_react([], ()) +      def check_internet_connection(self):          try:              # XXX remove this hardcoded random ip @@ -136,3 +141,19 @@ class LeapNetworkChecker(object):              return True          except socket.gaierror:              raise exceptions.CannotResolveDomainError + +    def parse_log_and_react(self, log, error_matrix=None): +        """ +        compares the recent openvpn status log to +        strings passed in and executes the callbacks passed in. +        @param log: openvpn log +        @type log: list of strings +        @param error_matrix: tuples of strings and tuples of callbacks +        @type error_matrix: tuples strings and call backs +        """ +        for line in log: +            for each in error_matrix: +                error, callbacks = each +                if error in line: +                    for cb in callbacks: +                        cb() diff --git a/src/leap/base/network.py b/src/leap/base/network.py index bd8f15c7..765d8ea0 100644 --- a/src/leap/base/network.py +++ b/src/leap/base/network.py @@ -14,9 +14,6 @@ from time import sleep  logger = logging.getLogger(name=__name__) -#EVENTS OF NOTE -EVENT_CONNECT_REFUSED = "[ECONNREFUSED]: Connection refused (code=111)" -  class NetworkCheckerThread(object):      """ @@ -57,12 +54,6 @@ class NetworkCheckerThread(object):      def run_checks(self):          pass -    def parse_log(self, log): -        for line in log: -            if EVENT_CONNECT_REFUSED in line: -                #fire cb to stop openvpn server -                pass -      #private methods      #here all the observers in fail_callbacks expect one positional argument, diff --git a/src/leap/base/tests/test_checks.py b/src/leap/base/tests/test_checks.py index 7a694f89..645e615c 100644 --- a/src/leap/base/tests/test_checks.py +++ b/src/leap/base/tests/test_checks.py @@ -37,6 +37,8 @@ class LeapNetworkCheckTest(BaseLeapTest):                          "missing meth")          self.assertTrue(hasattr(checker, "ping_gateway"),                          "missing meth") +        self.assertTrue(hasattr(checker, "parse_log_and_react"), +                        "missing meth")      def test_checker_should_actually_call_all_tests(self):          checker = checks.LeapNetworkChecker() @@ -45,6 +47,7 @@ class LeapNetworkCheckTest(BaseLeapTest):          self.assertTrue(mc.check_internet_connection.called, "not called")          self.assertTrue(mc.check_tunnel_default_interface.called, "not called")          self.assertTrue(mc.is_internet_up.called, "not called") +        self.assertTrue(mc.parse_log_and_react.called, "not called")          # ping gateway only called if we pass provider_gw          checker = checks.LeapNetworkChecker(provider_gw="0.0.0.0") @@ -54,6 +57,7 @@ class LeapNetworkCheckTest(BaseLeapTest):          self.assertTrue(mc.check_tunnel_default_interface.called, "not called")          self.assertTrue(mc.ping_gateway.called, "not called")          self.assertTrue(mc.is_internet_up.called, "not called") +        self.assertTrue(mc.parse_log_and_react.called, "not called")      def test_get_default_interface_no_interface(self):          checker = checks.LeapNetworkChecker() @@ -134,6 +138,40 @@ class LeapNetworkCheckTest(BaseLeapTest):                      mock_ping.side_effect = exceptions.NoConnectionToGateway                      checker.check_internet_connection() +    def test_parse_log_and_react(self): +        checker = checks.LeapNetworkChecker() +        to_call = Mock() +        log = [("leap.openvpn - INFO - Mon Nov 19 13:36:24 2012 " +                "read UDPv4 [ECONNREFUSED]: Connection refused (code=111)"] +        err_matrix = [(checks.EVENT_CONNECT_REFUSED, (to_call, ))] +        checker.parse_log_and_react(log, err_matrix) +        self.assertTrue(to_call.called) + +        log = [("2012-11-19 13:36:26,177 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:24 2012 ERROR: Linux route delete command " +                "failed: external program exited"), +               ("2012-11-19 13:36:26,178 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:24 2012 ERROR: Linux route delete command " +                "failed: external program exited"), +               ("2012-11-19 13:36:26,180 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:24 2012 ERROR: Linux route delete command " +                "failed: external program exited"), +               ("2012-11-19 13:36:26,181 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:24 2012 /sbin/ifconfig tun0 0.0.0.0"), +               ("2012-11-19 13:36:26,182 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:24 2012 Linux ip addr del failed: external " +                "program exited with error stat"), +               ("2012-11-19 13:36:26,183 - leap.openvpn - INFO - " +                "Mon Nov 19 13:36:26 2012 SIGTERM[hard,] received, process" +                "exiting"), ] +        to_call.reset_mock() +        checker.parse_log_and_react(log, err_matrix) +        self.assertFalse(to_call.called) + +        to_call.reset_mock() +        checker.parse_log_and_react([], err_matrix) +        self.assertFalse(to_call.called) +      @unittest.skipUnless(_uid == 0, "root only")      def test_ping_gateway(self):          checker = checks.LeapNetworkChecker() diff --git a/src/leap/baseapp/eip.py b/src/leap/baseapp/eip.py index f18a62e7..4fcbee3f 100644 --- a/src/leap/baseapp/eip.py +++ b/src/leap/baseapp/eip.py @@ -9,6 +9,7 @@ from leap.baseapp.dialogs import ErrorDialog  from leap.baseapp import constants  from leap.eip import exceptions as eip_exceptions  from leap.eip.eipconnection import EIPConnection +from leap.base.checks import EVENT_CONNECT_REFUSED  logger = logging.getLogger(name=__name__) @@ -176,7 +177,8 @@ class EIPConductorAppMixin(object):          # connection information via management interface          log = self.conductor.get_log() -        self.network_checker.parse_log(log) +        error_matrix = [(EVENT_CONNECT_REFUSED, (self.start_or_stopVPN, ))] +        self.network_checker.checker.parse_log_and_react(log, error_matrix)      @QtCore.pyqtSlot()      def start_or_stopVPN(self): | 
