mirror of https://github.com/Icinga/icinga2.git
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
|
from __future__ import unicode_literals
|
||
|
|
||
|
import os
|
||
|
import subprocess
|
||
|
|
||
|
__all__ = ['parse_statusdata', 'run_mysql_query', 'run_pgsql_query']
|
||
|
|
||
|
|
||
|
MYSQL_PARAMS = b"-t -D icinga -u icinga --password=icinga -e".split()
|
||
|
MYSQL_SEPARATOR = '|'
|
||
|
|
||
|
PGSQL_PARAMS = b"-nq -U icinga -d icinga -c".split()
|
||
|
PGSQL_SEPARATOR = '|'
|
||
|
PGSQL_ENVIRONMENT = {
|
||
|
b'PGPASSWORD': b'icinga'
|
||
|
}
|
||
|
|
||
|
|
||
|
def parse_statusdata(data, intelligent_cast=True):
|
||
|
parsed_data, data_type, type_data = {}, '', {}
|
||
|
for line in (l for l in data.split(os.linesep)
|
||
|
if l and not l.startswith('#')):
|
||
|
if '{' in line:
|
||
|
data_type = line.partition('{')[0].strip()
|
||
|
elif '}' in line:
|
||
|
parsed_data.setdefault(data_type, []).append(type_data)
|
||
|
else:
|
||
|
key, _, value = line.partition('=')
|
||
|
|
||
|
if intelligent_cast:
|
||
|
value = _cast_status_value(value)
|
||
|
|
||
|
type_data[key.strip()] = value
|
||
|
|
||
|
return parsed_data
|
||
|
|
||
|
|
||
|
def _cast_status_value(value):
|
||
|
try:
|
||
|
return int(value)
|
||
|
except ValueError:
|
||
|
try:
|
||
|
return float(value)
|
||
|
except ValueError:
|
||
|
return value
|
||
|
|
||
|
|
||
|
def run_mysql_query(query, path):
|
||
|
p = subprocess.Popen([path] + MYSQL_PARAMS + [query.encode('utf-8')],
|
||
|
stdout=subprocess.PIPE)
|
||
|
return _parse_mysql_result([l.decode('utf-8') for l in p.stdout.readlines()])
|
||
|
|
||
|
|
||
|
def _parse_mysql_result(resultset):
|
||
|
result, header = [], None
|
||
|
for line in (l for l in resultset if MYSQL_SEPARATOR in l):
|
||
|
columns = [c.strip() for c in line[1:-3].split(MYSQL_SEPARATOR)]
|
||
|
if header is None:
|
||
|
header = columns
|
||
|
else:
|
||
|
result.append(dict((header[i], v) for i, v in enumerate(columns)))
|
||
|
return result
|
||
|
|
||
|
|
||
|
def run_pgsql_query(query, path):
|
||
|
p = subprocess.Popen([path] + PGSQL_PARAMS + [query.encode('utf-8')],
|
||
|
stdout=subprocess.PIPE, env=PGSQL_ENVIRONMENT)
|
||
|
return _parse_pgsql_result([l.decode('utf-8') for l in p.stdout.readlines()])
|
||
|
|
||
|
|
||
|
def _parse_pgsql_result(resultset):
|
||
|
result, header = [], None
|
||
|
for line in (l for l in resultset if PGSQL_SEPARATOR in l):
|
||
|
columns = [c.strip() for c in line.split(PGSQL_SEPARATOR)]
|
||
|
if header is None:
|
||
|
header = columns
|
||
|
else:
|
||
|
result.append(dict((header[i], v) for i, v in enumerate(columns)))
|
||
|
return result
|
||
|
|