/usr/lib/python2.7/dist-packages/shinken/misc/perfdata.py is in shinken-common 1.4-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2009-2012:
# Gabes Jean, naparuba@gmail.com
# Gerhard Lausser, Gerhard.Lausser@consol.de
# Gregory Starck, g.starck@gmail.com
# Hartmut Goebel, h.goebel@goebel-consult.de
#
# This file is part of Shinken.
#
# Shinken is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Shinken is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Shinken. If not, see <http://www.gnu.org/licenses/>.
import re
from shinken.util import to_best_int_float
perfdata_split_pattern = re.compile('([^=]+=\S+)')
metric_pattern = re.compile('^([^=]+)=([\d\.\-]+)([\w\/%]*);?([\d\.\-:~@]+)?;?([\d\.\-:~@]+)?;?([\d\.\-]+)?;?([\d\.\-]+)?;?\s*')
# If we can return an int or a float, or None
# if we can't
def guess_int_or_float(val):
try:
return to_best_int_float(val)
except Exception, exp:
return None
# Class for one metric of a perf_data
class Metric:
def __init__(self, s):
self.name = self.value = self.uom = self.warning = self.critical = self.min = self.max = None
s = s.strip()
#print "Analysis string", s
r = metric_pattern.match(s)
if r:
# Get the name but remove all ' in it
self.name = r.group(1).replace("'", "")
self.value = guess_int_or_float(r.group(2))
self.uom = r.group(3)
self.warning = guess_int_or_float(r.group(4))
self.critical = guess_int_or_float(r.group(5))
self.min = guess_int_or_float(r.group(6))
self.max = guess_int_or_float(r.group(7))
#print 'Name', self.name
#print "Value", self.value
#print "Res", r
#print r.groups()
if self.uom == '%':
self.min = 0
self.max = 100
def __str__(self):
s = "%s=%s%s" % (self.name, self.value, self.uom)
if self.warning:
s = s + ";%s" % (self.warning)
if self.critical:
s = s + ";%s" % (self.critical)
return s
class PerfDatas:
def __init__(self, s):
elts = perfdata_split_pattern.findall(s)
elts = [e for e in elts if e != '']
self.metrics = {}
for e in elts:
m = Metric(e)
if m.name is not None:
self.metrics[m.name] = m
def __iter__(self):
return self.metrics.itervalues()
def __len__(self):
return len(self.metrics)
def __getitem__(self, key):
return self.metrics[key]
def __contains__(self, key):
return key in self.metrics
|