Source code for duct.sources.linux.ipsec

"""
.. module:: ipsec
   :platform: unix
   :synopsis: Some monitoring stuff for IPSEC tunnels

.. moduleauthor:: Colin Alston <colin@tamvera.com>
"""
from zope.interface import implementer

from duct.interfaces import IDuctSource
from duct.objects import Source


[docs] @implementer(IDuctSource) class StrongSwan(Source): """Returns the status of strongSwan IPSec tunnels **Metrics:** :(service name).(peer name): Tunnel status """ ssh = True
[docs] async def get(self): out, _err, _code = await self.fork('/usr/bin/sudo', args=( 'ipsec', 'statusall')) connections = {} s = 0 for l in out.strip('\n').split('\n'): if l == "Connections:": s = 1 continue elif l == "Routed Connections:": s = 2 elif "Security Associations" in l: s = 3 elif l[0] == ' ' and ':' in l: if s == 1: con, detail = l.strip().split(': ', 1) detail = detail.strip() if con not in connections: connections[con] = { 'source': detail.split('...')[0], 'destination': detail.split('...')[1].split()[0], 'up': False } elif s == 3: con, detail = l.strip().split(': ', 1) detail = detail.strip() if '[' in con: con = con.split('[')[0] else: con = con.split('{')[0] if 'ESTABLISHED' in detail: connections[con]['up'] = True events = [] for k, v in connections.items(): if v['up']: events.append(self.createEvent('ok', f'IPSec tunnel {k} up', 1, prefix=k)) else: events.append(self.createEvent('critical', f'IPSec tunnel {k} down', 0, prefix=k)) return events