summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/vpn/_status.py
diff options
context:
space:
mode:
authorKali Kaneko (leap communications) <kali@leap.se>2017-02-04 17:01:25 +0100
committerKali Kaneko (leap communications) <kali@leap.se>2017-02-23 00:40:37 +0100
commit701fe5ebc70fb49bb32e81e6d6605f27ad09925b (patch)
tree0763df29131f3abe4604fc3626f51ed4360b5ff1 /src/leap/bitmask/vpn/_status.py
parent409a4c663ec3c0b4a394fcaa6d4b1c6b527f8522 (diff)
[feature] parse status
- simple status parsing - add separate firewall status - set status for abnormal termination
Diffstat (limited to 'src/leap/bitmask/vpn/_status.py')
-rw-r--r--src/leap/bitmask/vpn/_status.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/leap/bitmask/vpn/_status.py b/src/leap/bitmask/vpn/_status.py
new file mode 100644
index 0000000..11d564f
--- /dev/null
+++ b/src/leap/bitmask/vpn/_status.py
@@ -0,0 +1,77 @@
+from itertools import chain, repeat
+from twisted.logger import Logger
+
+logger = Logger()
+
+
+# TODO implement a state machine in this class
+
+
+class VPNStatus(object):
+ """
+ A class containing different patterns in the openvpn output that
+ we can react upon.
+ """
+
+ _events = {
+ 'NETWORK_UNREACHABLE': (
+ 'Network is unreachable (code=101)',),
+ 'PROCESS_RESTART_TLS': (
+ "SIGTERM[soft,tls-error]",),
+ 'PROCESS_RESTART_PING': (
+ "SIGTERM[soft,ping-restart]",),
+ 'INITIALIZATION_COMPLETED': (
+ "Initialization Sequence Completed",),
+ }
+
+ def __init__(self):
+ self.status = 'OFFLINE'
+ self._traffic_down = None
+ self._traffic_up = None
+
+ def watch(self, line):
+ """
+ Inspects line searching for the different patterns. If a match
+ is found, try to emit the corresponding signal.
+
+ :param line: a line of openvpn output
+ :type line: str
+ """
+ chained_iter = chain(*[
+ zip(repeat(key, len(l)), l)
+ for key, l in self._events.iteritems()])
+ for event, pattern in chained_iter:
+ if pattern in line:
+ break
+ else:
+ return
+
+ status, errcode = self._status_codes(event)
+ self.set_status(status, errcode)
+
+
+ def set_status(self, status, errcode):
+ self.status = status
+ self.errcode = errcode
+
+ def set_traffic_status(self, status):
+ down, up = status
+ self._traffic_up = up
+ self._traffic_down = down
+
+ def get_traffic_status(self):
+ # XXX return Human readable too
+ return {'down': self._traffic_down,
+ 'up': self._traffic_up}
+
+ def _status_codes(self, event):
+ # TODO check good transitions
+ # TODO check valid states
+
+ _table = {
+ "network_unreachable": ('OFFLINE', 'network unreachable'),
+ "process_restart_tls": ('RESTARTING', 'restart tls'),
+ "process_restart_ping": ('CONNECTING', None),
+ "initialization_completed": ('ONLINE', None)
+ }
+ return _table.get(event.lower())