diff options
author | Kali Kaneko (leap communications) <kali@leap.se> | 2017-02-04 17:01:25 +0100 |
---|---|---|
committer | Kali Kaneko (leap communications) <kali@leap.se> | 2017-02-23 00:40:37 +0100 |
commit | 701fe5ebc70fb49bb32e81e6d6605f27ad09925b (patch) | |
tree | 0763df29131f3abe4604fc3626f51ed4360b5ff1 /src/leap/bitmask/vpn/_status.py | |
parent | 409a4c663ec3c0b4a394fcaa6d4b1c6b527f8522 (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.py | 77 |
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()) |