Module: check_mk
Branch: master
Commit: e39f93de5607dc0d0d94231e49210aad05317387
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=e39f93de5607dc…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Mar 30 11:30:12 2016 +0200
3349 FIX Added rule to disable Inline-SNMP per host
Some SNMP hosts have problems with the Inline-SNMP implemenation. Till this change
it was only possible to enable/disable Inline-SNMP for all hosts at once which was
a bit to unflexible when only a single or some devices have trouble with Inline-SNMP.
---
.werks/3349 | 12 ++++++++++++
ChangeLog | 2 +-
modules/check_mk.py | 14 ++++++++++----
modules/check_mk_base.py | 4 ++--
modules/config.py | 3 +++
modules/nagios.py | 4 ++--
modules/snmp.py | 2 +-
web/plugins/wato/check_mk_configuration.py | 9 +++++++++
8 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/.werks/3349 b/.werks/3349
new file mode 100644
index 0000000..0f3aed8
--- /dev/null
+++ b/.werks/3349
@@ -0,0 +1,12 @@
+Title: Added rule to disable Inline-SNMP per host
+Level: 1
+Component: core
+Class: fix
+Compatible: compat
+State: unknown
+Version: 1.2.9i1
+Date: 1459330124
+
+Some SNMP hosts have problems with the Inline-SNMP implemenation. Till this change
+it was only possible to enable/disable Inline-SNMP for all hosts at once which was
+a bit to unflexible when only a single or some devices have trouble with Inline-SNMP.
diff --git a/ChangeLog b/ChangeLog
index 7958693..e99cc25 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,7 +11,7 @@
* 3008 FIX: Fixed exception in logwatch config generation when using Nagios...
* 3105 FIX: fixed crash in cmk --dump for services containing non-ascii characters
* 3343 FIX: MKP: Verifying minimal version of packages during installation...
-
+ * 3349 FIX: Added rule to disable Inline-SNMP per host...
Checks & Agents:
* 3183 aruba_wlc_aps: new check which monitors the provisioned accesspoints of an Aruba Network WLAN Controller
diff --git a/modules/check_mk.py b/modules/check_mk.py
index c9b3d5c..f203315 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -1538,6 +1538,12 @@ def is_snmpv2c_host(hostname):
def is_usewalk_host(hostname):
return in_binary_hostlist(hostname, usewalk_hosts)
+
+def is_inline_snmp_host(hostname):
+ return has_inline_snmp and use_inline_snmp \
+ and not in_binary_hostlist(hostname, non_inline_snmp_hosts)
+
+
def snmp_timing_of(hostname):
timing = host_extra_conf(hostname, snmp_timing)
if len(timing) > 0:
@@ -1711,7 +1717,7 @@ def get_single_oid(hostname, ipaddress, oid):
else:
try:
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
value = inline_snmp_get_oid(hostname, oid)
else:
value = snmp_get_oid(hostname, ipaddress, oid)
@@ -3557,7 +3563,7 @@ def do_snmpwalk_on(hostname, filename):
try:
verbose("Walk on \"%s\"..." % oid)
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
rows = inline_snmpwalk_on_suboid(hostname, None, oid)
rows = inline_convert_rows_for_stored_walk(rows)
else:
@@ -3746,7 +3752,7 @@ def dump_host(hostname):
if is_usewalk_host(hostname):
agenttypes.append("SNMP (use stored walk)")
else:
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
inline = "yes"
else:
inline = "no"
@@ -4567,7 +4573,7 @@ def cleanup_globals():
global g_timeout
g_timeout = None
- if has_inline_snmp and use_inline_snmp:
+ if has_inline_snmp:
cleanup_inline_snmp_globals()
diff --git a/modules/check_mk_base.py b/modules/check_mk_base.py
index feeba70..64a457d 100644
--- a/modules/check_mk_base.py
+++ b/modules/check_mk_base.py
@@ -1244,7 +1244,7 @@ def do_check(hostname, ipaddress, only_check_types = None):
else:
output += "execution time %.1f sec|execution_time=%.3f\n" % (run_time, run_time)
- if record_inline_snmp_stats and has_inline_snmp and use_inline_snmp:
+ if record_inline_snmp_stats and is_inline_snmp_host(hostname):
save_snmp_stats()
if opt_keepalive:
@@ -1592,7 +1592,7 @@ def create_crash_dump_info_file(crash_dir, hostname, check_type, item, params, d
"item" : item,
"params" : params,
"uses_snmp" : check_uses_snmp(check_type),
- "inline_snmp" : has_inline_snmp and use_inline_snmp,
+ "inline_snmp" : is_inline_snmp_host(hostname),
"manual_check" : is_manual_check(hostname, check_type, item),
},
}
diff --git a/modules/config.py b/modules/config.py
index b46450f..0d97d2c 100644
--- a/modules/config.py
+++ b/modules/config.py
@@ -55,6 +55,9 @@ fallback_agent_output_encoding = 'latin1'
# SNMP communities and encoding
has_inline_snmp = False # is set to True by inline_snmp module, when available
use_inline_snmp = True
+non_inline_snmp_hosts = [] # Ruleset to disable Inline-SNMP per host when
+ # use_inline_snmp is enabled.
+
snmp_limit_oid_range = [] # Ruleset to recduce fetched OIDs of a check, only inline SNMP
record_inline_snmp_stats = False
snmp_default_community = 'public'
diff --git a/modules/nagios.py b/modules/nagios.py
index bc43972..2b152d1 100644
--- a/modules/nagios.py
+++ b/modules/nagios.py
@@ -1055,7 +1055,7 @@ no_discovery_possible = None
if need_snmp_module:
output.write(stripped_python_file(modules_dir + "/snmp.py"))
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
output.write(stripped_python_file(modules_dir + "/inline_snmp.py"))
output.write("\ndef oid_range_limits_of(hostname):\n return %r\n" % oid_range_limits_of(hostname))
else:
@@ -1128,7 +1128,7 @@ no_discovery_possible = None
output.write("def is_tcp_host(hostname):\n return % r\n\n" % is_tcp_host(hostname))
output.write("def is_usewalk_host(hostname):\n return % r\n\n" % is_usewalk_host(hostname))
output.write("def snmpv3_contexts_of_host(hostname):\n return % r\n\n" % snmpv3_contexts_of_host(hostname))
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
output.write("def is_snmpv2c_host(hostname):\n return % r\n\n" % is_snmpv2c_host(hostname))
output.write("def is_bulkwalk_host(hostname):\n return % r\n\n" % is_bulkwalk_host(hostname))
output.write("def snmp_timing_of(hostname):\n return % r\n\n" % snmp_timing_of(hostname))
diff --git a/modules/snmp.py b/modules/snmp.py
index 6892abd..f7815f5 100644
--- a/modules/snmp.py
+++ b/modules/snmp.py
@@ -235,7 +235,7 @@ def perform_snmpwalk(hostname, ip, check_type, base_oid, fetchoid):
snmp_contexts = [None]
for context_name in snmp_contexts:
- if has_inline_snmp and use_inline_snmp:
+ if is_inline_snmp_host(hostname):
rows = inline_snmpwalk_on_suboid(hostname, check_type, fetchoid, base_oid,
context_name=context_name)
else:
diff --git a/web/plugins/wato/check_mk_configuration.py b/web/plugins/wato/check_mk_configuration.py
index ebbeee0..64c783e 100644
--- a/web/plugins/wato/check_mk_configuration.py
+++ b/web/plugins/wato/check_mk_configuration.py
@@ -2097,6 +2097,15 @@ register_rule(group,
match = "dict")
+register_rule(group,
+ "non_inline_snmp_hosts",
+ title = _("Hosts not using Inline-SNMP"),
+ help = _("Check_MK has an efficicient SNMP implementation called Inline-SNMP which reduces the "
+ "load produced by SNMP monitoring on the monitoring host significant. This option is "
+ "enabled by default for all SNMP hosts and it is a good idea to keep this default "
+ "settings. However, there are SNMP devices which have problems with this SNMP "
+ "implementation. You can use this rule to disable Inline-SNMP for these hosts."))
+
register_rule(group,
"usewalk_hosts",
Module: check_mk
Branch: master
Commit: ebd9312b17b1e24b18d27f71c4d7bd68c3f66005
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ebd9312b17b1e2…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Tue Mar 29 13:08:08 2016 +0200
3347 FIX Improved performance when having a lot of users
When having a lot of users (>1000) configured via WATO, e.g. created by the LDAP sync,
the GUI was getting too slow since some versions. This has now been improved.
---
.werks/3347 | 11 +++++++++
ChangeLog | 1 +
web/htdocs/pagetypes.py | 6 ++---
web/htdocs/userdb.py | 61 ++++++++++++++++++++++++++++++++---------------
web/htdocs/visuals.py | 8 +++----
5 files changed, 61 insertions(+), 26 deletions(-)
diff --git a/.werks/3347 b/.werks/3347
new file mode 100644
index 0000000..288940c
--- /dev/null
+++ b/.werks/3347
@@ -0,0 +1,11 @@
+Title: Improved performance when having a lot of users
+Level: 1
+Component: multisite
+Class: fix
+Compatible: compat
+State: unknown
+Version: 1.2.9i1
+Date: 1459249594
+
+When having a lot of users (>1000) configured via WATO, e.g. created by the LDAP sync,
+the GUI was getting too slow since some versions. This has now been improved.
diff --git a/ChangeLog b/ChangeLog
index 072a9c3..457cd8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -140,6 +140,7 @@
* 3339 FIX: Fixed exception on "Aggregations Affected by Service" page when no host/service given
* 3344 FIX: Removed host inventory painters and sorters from non host based views
* 3345 FIX: Fixed exception when inventory painter was used as group painter
+ * 3347 FIX: Improved performance when having a lot of users...
WATO:
* 3244 WATO BI Module: swap order of aggregation function and child node selection...
diff --git a/web/htdocs/pagetypes.py b/web/htdocs/pagetypes.py
index 3045a53..9583d99 100644
--- a/web/htdocs/pagetypes.py
+++ b/web/htdocs/pagetypes.py
@@ -634,14 +634,14 @@ class Overridable:
# Now scan users subdirs for files "user_$type_name.mk"
subdirs = os.listdir(config.config_dir)
for user in subdirs:
- if not userdb.user_exists(user):
- continue
-
try:
path = "%s/%s/user_%ss.mk" % (config.config_dir, user, self.type_name())
if not os.path.exists(path):
continue
+ if not userdb.user_exists(user):
+ continue
+
user_pages = eval(file(path).read())
for name, page_dict in user_pages.items():
page_dict["owner"] = user
diff --git a/web/htdocs/userdb.py b/web/htdocs/userdb.py
index d17678a..61123ba 100644
--- a/web/htdocs/userdb.py
+++ b/web/htdocs/userdb.py
@@ -170,11 +170,32 @@ def create_non_existing_user(connection_id, username):
# Call the sync function for this new user
hook_sync(connection_id = connection_id, only_username = username)
-# FIXME: Can we improve this easily? Would be nice not to have to call "load_users".
-# Maybe a directory listing of profiles or a list of a small file would perform better
-# than having to load the users, contacts etc. during each http request to multisite
+
+# This function is called very often during regular page loads so it has to be efficient
+# even when having a lot of users.
+#
+# When using the multisite authentication with just by WATO created users it would be
+# easy, but we also need to deal with users which are only existant in the htpasswd
+# file and don't have a profile directory yet.
def user_exists(username):
- return username in load_users().keys()
+ if _user_exists_according_to_profile(username):
+ return True
+
+ return _user_exists_htpasswd(username)
+
+
+def _user_exists_according_to_profile(username):
+ base_path = config.config_dir + "/" + username + "/"
+ return os.path.exists(base_path + "transids.mk") \
+ or os.path.exists(base_path + "serial.mk")
+
+
+def _user_exists_htpasswd(username):
+ for line in open(defaults.htpasswd_file):
+ if line.startswith("%s:" % username):
+ return True
+ return False
+
def user_locked(username):
users = load_users()
@@ -469,7 +490,6 @@ def split_dict(d, keylist, positive):
return dict([(k,v) for (k,v) in d.items() if (k in keylist) == positive])
def save_users(profiles):
-
# Add custom macros
core_custom_macros = [ k for k,o in user_attributes.items() if o.get('add_custom_macro') ]
for user in profiles.keys():
@@ -578,24 +598,27 @@ def save_users(profiles):
if 'last_seen' in user:
save_custom_attr(user_id, 'last_seen', repr(user['last_seen']))
- # Remove settings directories of non-existant users.
- # Beware: we removed this since it leads to violent destructions
- # if the user database is out of the scope of Check_MK. This is
- # e.g. the case, if mod_ldap is used for user authentication.
- # dir = defaults.var_dir + "/web"
- # for e in os.listdir(dir):
- # if e not in ['.', '..'] and e not in profiles:
- # entry = dir + "/" + e
- # if os.path.isdir(entry):
- # shutil.rmtree(entry)
- # But for the automation.secret this is ok, since automation users are not
- # created by other sources in common cases
+ # During deletion of users we don't delete files which might contain user settings
+ # and e.g. customized views which are not easy to reproduce. We want to keep the
+ # files which are the result of a lot of work even when e.g. the LDAP sync deletes
+ # a user by accident. But for some internal files it is ok to delete them.
+ #
+ # Be aware: The user_exists() function relies on these files to be deleted.
+ profile_files_to_delete = [
+ "automation.secret",
+ "transids.mk",
+ "serial.mk",
+ ]
dir = defaults.var_dir + "/web"
for user_dir in os.listdir(defaults.var_dir + "/web"):
if user_dir not in ['.', '..'] and user_dir.decode("utf-8") not in profiles:
entry = dir + "/" + user_dir
- if os.path.isdir(entry) and os.path.exists(entry + '/automation.secret'):
- os.unlink(entry + '/automation.secret')
+ if not os.path.isdir(entry):
+ continue
+
+ for to_delete in profile_files_to_delete:
+ if os.path.exists(entry + '/' + to_delete):
+ os.unlink(entry + '/' + to_delete)
# Release the lock to make other threads access possible again asap
# This lock is set by load_users() only in the case something is expected
diff --git a/web/htdocs/visuals.py b/web/htdocs/visuals.py
index 4a85a30..c7c1cf0 100644
--- a/web/htdocs/visuals.py
+++ b/web/htdocs/visuals.py
@@ -124,12 +124,9 @@ def load(what, builtin_visuals, skip_func = None, lock=False):
visuals[('', name)] = visual
- # Now scan users subdirs for files "visuals.mk"
+ # Now scan users subdirs for files "user_*.mk"
subdirs = os.listdir(config.config_dir)
for user in subdirs:
- if not userdb.user_exists(user):
- continue
-
try:
dirpath = config.config_dir + "/" + user
if not os.path.isdir(dirpath):
@@ -145,6 +142,9 @@ def load(what, builtin_visuals, skip_func = None, lock=False):
if not os.path.exists(path):
continue
+ if not userdb.user_exists(user):
+ continue
+
if lock:
aquire_lock(path)
Module: check_mk
Branch: master
Commit: 20fcf0d45f4a73c7d6d2aa0b2515ea0a3d173917
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=20fcf0d45f4a73…
Author: Sven Rueß <sr(a)mathias-kettner.de>
Date: Tue Mar 29 07:48:45 2016 +0200
New bug for linux agent deinstallation
---
.bugs/2492 | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/.bugs/2492 b/.bugs/2492
new file mode 100644
index 0000000..071246c
--- /dev/null
+++ b/.bugs/2492
@@ -0,0 +1,11 @@
+Title: Linux agent: Directory /var/lib/check_mk_agent/cache not removed because it is not empty during apt-get purge
+Component: core
+State: open
+Date: 2016-03-29 07:44:22
+Targetversion: 1.2.8
+Class: cleanup
+
+If Check_MK agent is removed from systems with apt-get purge check-mk-agent there is an error message:
+dpkg: warning: while removing check-mk-agent, directory '/var/lib/check_mk_agent/cache' not empty so not removed
+
+This directory should be removed, because it is only used as cache for the executed plugins.
Module: check_mk
Branch: master
Commit: 32e063e5896c3052e9c34c98543512d9561717fe
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=32e063e5896c30…
Author: Sven Rueß <sr(a)mathias-kettner.de>
Date: Thu Mar 24 14:08:47 2016 +0100
2237 Unique name for columns of Host Groups and Service Groups
The columns of Host Groups and Service Groups had the same name like the standard columns.
It was not possible to difference between the columns during the creation or modification
of a view. Now the columns have unique names.
Thanks to Thorben Soehl
---
.werks/2237 | 13 +++++++++++++
ChangeLog | 1 +
web/plugins/views/painters.py | 36 ++++++++++++++++++------------------
3 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/.werks/2237 b/.werks/2237
new file mode 100644
index 0000000..2105799
--- /dev/null
+++ b/.werks/2237
@@ -0,0 +1,13 @@
+Title: Unique name for columns of Host Groups and Service Groups
+Level: 1
+Component: multisite
+Compatible: compat
+Version: 1.2.9i1
+Date: 1458824573
+Class: feature
+
+The columns of Host Groups and Service Groups had the same name like the standard columns.
+It was not possible to difference between the columns during the creation or modification
+of a view. Now the columns have unique names.
+
+Thanks to Thorben Soehl
diff --git a/ChangeLog b/ChangeLog
index 3403b05..5be31f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -112,6 +112,7 @@
* 3228 The BI Treestate painter now exports the aggregation tree as real json structure
* 3288 Implemented grouping of services in table views...
* 3297 SEC: Fixes possible XSS in views sidebar snapin...
+ * 2237 Unique name for columns of Host Groups and Service Groups...
* 3059 FIX: Fixed highlighting of availability timeline time slices
* 3175 FIX: Fix timeranges of graphs that are embedded in a dashboard...
* 3076 FIX: fixed broken views in check_mk raw edition
diff --git a/web/plugins/views/painters.py b/web/plugins/views/painters.py
index af517e9..e077879 100644
--- a/web/plugins/views/painters.py
+++ b/web/plugins/views/painters.py
@@ -1753,77 +1753,77 @@ def paint_hg_host_list(row):
return "", h
multisite_painters["hostgroup_hosts"] = {
- "title" : _("Hosts colored according to state"),
+ "title" : _("Hosts colored according to state (Host Group)"),
"short" : _("Hosts"),
"columns" : [ "hostgroup_members_with_state" ],
"paint" : paint_hg_host_list,
}
multisite_painters["hg_num_services"] = {
- "title" : _("Number of services"),
+ "title" : _("Number of services (Host Group)"),
"short" : "",
"columns" : [ "hostgroup_num_services" ],
"paint" : lambda row: (None, str(row["hostgroup_num_services"])),
}
multisite_painters["hg_num_services_ok"] = {
- "title" : _("Number of services in state OK"),
+ "title" : _("Number of services in state OK (Host Group)"),
"short" : _("O"),
"columns" : [ "hostgroup_num_services_ok" ],
"paint" : lambda row: paint_svc_count(0, row["hostgroup_num_services_ok"]),
}
multisite_painters["hg_num_services_warn"] = {
- "title" : _("Number of services in state WARN"),
+ "title" : _("Number of services in state WARN (Host Group)"),
"short" : _("W"),
"columns" : [ "hostgroup_num_services_warn" ],
"paint" : lambda row: paint_svc_count(1, row["hostgroup_num_services_warn"]),
}
multisite_painters["hg_num_services_crit"] = {
- "title" : _("Number of services in state CRIT"),
+ "title" : _("Number of services in state CRIT (Host Group)"),
"short" : _("C"),
"columns" : [ "hostgroup_num_services_crit" ],
"paint" : lambda row: paint_svc_count(2, row["hostgroup_num_services_crit"]),
}
multisite_painters["hg_num_services_unknown"] = {
- "title" : _("Number of services in state UNKNOWN"),
+ "title" : _("Number of services in state UNKNOWN (Host Group)"),
"short" : _("U"),
"columns" : [ "hostgroup_num_services_unknown" ],
"paint" : lambda row: paint_svc_count(3, row["hostgroup_num_services_unknown"]),
}
multisite_painters["hg_num_services_pending"] = {
- "title" : _("Number of services in state PENDING"),
+ "title" : _("Number of services in state PENDING (Host Group)"),
"short" : _("P"),
"columns" : [ "hostgroup_num_services_pending" ],
"paint" : lambda row: paint_svc_count("p", row["hostgroup_num_services_pending"]),
}
multisite_painters["hg_num_hosts_up"] = {
- "title" : _("Number of hosts in state UP"),
+ "title" : _("Number of hosts in state UP (Host Group)"),
"short" : _("Up"),
"columns" : [ "hostgroup_num_hosts_up" ],
"paint" : lambda row: paint_host_count(0, row["hostgroup_num_hosts_up"]),
}
multisite_painters["hg_num_hosts_down"] = {
- "title" : _("Number of hosts in state DOWN"),
+ "title" : _("Number of hosts in state DOWN (Host Group)"),
"short" : _("Dw"),
"columns" : [ "hostgroup_num_hosts_down" ],
"paint" : lambda row: paint_host_count(1, row["hostgroup_num_hosts_down"]),
}
multisite_painters["hg_num_hosts_unreach"] = {
- "title" : _("Number of hosts in state UNREACH"),
+ "title" : _("Number of hosts in state UNREACH (Host Group)"),
"short" : _("Un"),
"columns" : [ "hostgroup_num_hosts_unreach" ],
"paint" : lambda row: paint_host_count(2, row["hostgroup_num_hosts_unreach"]),
}
multisite_painters["hg_num_hosts_pending"] = {
- "title" : _("Number of hosts in state PENDING"),
+ "title" : _("Number of hosts in state PENDING (Host Group)"),
"short" : _("Pd"),
"columns" : [ "hostgroup_num_hosts_pending" ],
"paint" : lambda row: paint_host_count(None, row["hostgroup_num_hosts_pending"]),
@@ -1851,49 +1851,49 @@ multisite_painters["hg_alias"] = {
# |___/ |_|
multisite_painters["sg_services"] = {
- "title" : _("Services colored according to state"),
+ "title" : _("Services colored according to state (Service Group)"),
"short" : _("Services"),
"columns" : [ "servicegroup_members_with_state" ],
"paint" : lambda row: paint_service_list(row, "servicegroup_members_with_state"),
}
multisite_painters["sg_num_services"] = {
- "title" : _("Number of services"),
+ "title" : _("Number of services (Service Group)"),
"short" : "",
"columns" : [ "servicegroup_num_services" ],
"paint" : lambda row: (None, str(row["servicegroup_num_services"])),
}
multisite_painters["sg_num_services_ok"] = {
- "title" : _("Number of services in state OK"),
+ "title" : _("Number of services in state OK (Service Group)"),
"short" : _("O"),
"columns" : [ "servicegroup_num_services_ok" ],
"paint" : lambda row: paint_svc_count(0, row["servicegroup_num_services_ok"])
}
multisite_painters["sg_num_services_warn"] = {
- "title" : _("Number of services in state WARN"),
+ "title" : _("Number of services in state WARN (Service Group)"),
"short" : _("W"),
"columns" : [ "servicegroup_num_services_warn" ],
"paint" : lambda row: paint_svc_count(1, row["servicegroup_num_services_warn"])
}
multisite_painters["sg_num_services_crit"] = {
- "title" : _("Number of services in state CRIT"),
+ "title" : _("Number of services in state CRIT (Service Group)"),
"short" : _("C"),
"columns" : [ "servicegroup_num_services_crit" ],
"paint" : lambda row: paint_svc_count(2, row["servicegroup_num_services_crit"])
}
multisite_painters["sg_num_services_unknown"] = {
- "title" : _("Number of services in state UNKNOWN"),
+ "title" : _("Number of services in state UNKNOWN (Service Group)"),
"short" : _("U"),
"columns" : [ "servicegroup_num_services_unknown" ],
"paint" : lambda row: paint_svc_count(3, row["servicegroup_num_services_unknown"])
}
multisite_painters["sg_num_services_pending"] = {
- "title" : _("Number of services in state PENDING"),
+ "title" : _("Number of services in state PENDING (Service Group)"),
"short" : _("P"),
"columns" : [ "servicegroup_num_services_pending" ],
"paint" : lambda row: paint_svc_count("p", row["servicegroup_num_services_pending"])