zabbix_ipsec_pfsense
zabbix_ipsec_pfsense copied to clipboard
zabbix-ipsec.py doesn't parse swanctl.conf with more than 11 ikeids
I have a swanctl.conf with more than 20 con I facing an issue by using zabbix-ipsec.py at reg_descr = re.compile('(?<=# P1 (ikeid [0-9]): ).*') It parses the first ikeid 1 to 9 but at the 10th it does not parse anymore
following is how I fix it, any better ideas how we can fix it?
`#!/usr/local/bin/python3.8
import itertools import re import sys import xml.etree.cElementTree as ET
IPSEC_CONF = '/var/etc/ipsec/swanctl.conf'
rtt_time_warn = 200 rtt_time_error = 300
def parseConf(): reg_conn = re.compile('con[0-9]+') reg_local = re.compile('(?<=local_addrs = ).') reg_remote = re.compile('(?<=remote_addrs = ).') reg_descr = re.compile('(?<=# P1 (ikeid [0-9]): ).') reg_descr2 = re.compile('(?<=# P1 (ikeid [0-9][0-9]): ).') reg_descr3 = re.compile('(?<=# P1 (ikeid [0-9][0-9][0-9]): ).*')
data = {}
with open(IPSEC_CONF, 'r') as f:
soubor = f.read()
groups = re.findall('(con[0-9]+\ .*?)(?=^\s*dpd_action.*?}.*?}.*?})', soubor, flags=re.DOTALL|re.MULTILINE)
for g in groups:
conn_tmp = list()
m = re.search(reg_conn, g)
m = m.group(0)
if m:
conn_tmp.append(m)
local_tmp = list()
m1 = re.search(reg_local, g)
if m1 is None:
return None
m1 = m1.group(0)
if m1:
local_tmp.append(m1)
remote_tmp = list()
m2 = re.search(reg_remote, g)
m2 = m2.group(0)
if m2:
remote_tmp.append(m2)
descr_tmp = list()
m3 = re.search(reg_descr, g)
if m3:
m3 = m3.group(0)
descr_tmp.append(m3)
elif len(conn_tmp[0]) == 5:
m3 = re.search(reg_descr2, g)
m3 = m3.group(0)
descr_tmp.append(m3)
elif len(conn_tmp[0]) == 6:
m3 = re.search(reg_descr3, g)
m3 = m3.group(0)
descr_tmp.append(m3)
else:
descr_tmp = "Not found"
if conn_tmp and local_tmp and remote_tmp and descr_tmp:
data[conn_tmp[0]] = [local_tmp[0], remote_tmp[0], descr_tmp]
return data
def getTemplate(): template = """ {{ "{{#TUNNEL}}":"{0}","{{#TARGETIP}}":"{1}","{{#SOURCEIP}}":"{2}","{{#DESCRIPTION}}":"{3}" }}"""
return template
def getPayload(): final_conf = """{{ "data":[{0} ] }}"""
conf = ''
data = parseConf().items()
for key,value in data:
tmp_conf = getTemplate().format(
key,
value[1],
value[0],
value[2],
rtt_time_warn,
rtt_time_error
)
if len(data) > 1:
conf += '%s,' % (tmp_conf)
else:
conf = tmp_conf
if conf[-1] == ',':
conf=conf[:-1]
return final_conf.format(conf)
if name == "main": ret = getPayload() sys.exit(ret)`