Module: check_mk
Branch: master
Commit: d142e338a4951d38876ffbeb173b4588aa842806
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d142e338a4951d…
Author: Goetz Golla <gg(a)mathias-kettner.de>
Date: Thu Dec 18 18:11:16 2014 +0100
#1459 netscaler_cpu: new check to monitor the CPUs of Citrix Netscaler Appliances
---
.werks/1459 | 9 ++++++
ChangeLog | 1 +
checkman/netscaler_cpu | 29 ++++++++++++++++++++
checks/netscaler_cpu | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
modules/catalog.py | 1 +
5 files changed, 111 insertions(+)
diff --git a/.werks/1459 b/.werks/1459
new file mode 100644
index 0000000..fed25a9
--- /dev/null
+++ b/.werks/1459
@@ -0,0 +1,9 @@
+Title: netscaler_cpu: new check to monitor the CPUs of Citrix Netscaler Appliances
+Level: 1
+Component: checks
+Compatible: compat
+Version: 1.2.7i1
+Date: 1418922628
+Class: feature
+
+
diff --git a/ChangeLog b/ChangeLog
index 101f197..29bf241 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
* 1207 services: Check can now be configured with additional names for matching...
* 1786 casa_cpu_mem, casa_cpu_temp, casa_cpu_util, casa_fan, casa_power: support more devices, also C100G
* 1787 docsis_channels_upstream, docsis_channels_downstream: now also support CASA 100G
+ * 1459 netscaler_cpu: new check to monitor the CPUs of Citrix Netscaler Appliances
* 1457 FIX: logins: new check renamed from "users" check...
NOTE: Please refer to the migration notes!
* 1762 FIX: lnx_thermal: Now ignoring trip points with level 0...
diff --git a/checkman/netscaler_cpu b/checkman/netscaler_cpu
new file mode 100644
index 0000000..6d3661f
--- /dev/null
+++ b/checkman/netscaler_cpu
@@ -0,0 +1,29 @@
+title: Citrix Netscaler CPU Utilization
+agents: snmp
+catalog: app/netscaler
+license: GPL
+distribution: check_mk
+description:
+ This check monitors the CPU utilization on the Citrix Netscaler Loadbalacing
+ Appliance. It uses the {NS-ROOT-MIB} to access the CPU name {nsCPUname}
+ and CPU usage in percent {nsCPUusage}.
+
+ Warning and critical levels can be configured for the check.
+
+inventory:
+ One service per detected CPU will be created.
+
+perfdata:
+ The CPU utilization value in percent for every CPU
+
+item:
+ The name of the CPU
+
+[parameters]
+parameters(dict): parameters is a dictionary with one key
+
+ {"levels"}: a tuple of warning and critical levels for the CPU utilization.
+ The numbers are integers and represent a percentage value.
+
+[configuration]
+netscaler_cpu_default_levels(dict): This variable is preset to {{ "levels": (90, 95) }}
diff --git a/checks/netscaler_cpu b/checks/netscaler_cpu
new file mode 100644
index 0000000..c87f521
--- /dev/null
+++ b/checks/netscaler_cpu
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2014 mk(a)mathias-kettner.de |
+# +------------------------------------------------------------------+
+#
+# This file is part of Check_MK.
+# The official homepage is at http://mathias-kettner.de/check_mk.
+#
+# check_mk is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation in version 2. check_mk is distributed
+# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
+# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more de-
+# ails. You should have received a copy of the GNU General Public
+# License along with GNU Make; see the file COPYING. If not, write
+# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301 USA.
+#
+# Example Output:
+# .1.3.6.1.4.1.5951.4.1.1.41.6.1.1.8.77.103.109.116.32.67.80.85 "Mgmt CPU"
+# .1.3.6.1.4.1.5951.4.1.1.41.6.1.1.12.80.97.99.107.101.116.32.67.80.85.32.48 "Packet CPU 0"
+# .1.3.6.1.4.1.5951.4.1.1.41.6.1.2.8.77.103.109.116.32.67.80.85 0
+# .1.3.6.1.4.1.5951.4.1.1.41.6.1.2.12.80.97.99.107.101.116.32.67.80.85.32.48 0
+
+factory_settings["netscaler_cpu_default_levels"] = {
+ "levels" : (90.0, 95.0)
+}
+
+def inventory_netscaler_cpu(info):
+ for cpu_name, cpu_usage in info:
+ yield cpu_name, netscaler_cpu_default_levels
+
+def check_netscaler_cpu(item, params, info):
+ warn, crit = params.get("levels")
+ for cpu_name, cpu_usage in info:
+ cpu_usage = int(cpu_usage)
+ if cpu_name == item:
+ infotext = "%d%%" % cpu_usage
+ perfdata = [ ("load", cpu_usage, warn, crit, 0) ]
+ state = 0
+ levelstext = ""
+ if cpu_usage >= crit:
+ state = 2
+ levelstext = " (levels at %d/%d)" % (warn,crit)
+ elif cpu_usage >= warn:
+ state = 1
+ levelstext = " (levels at %d/%d)" % (warn,crit)
+ infotext += levelstext
+ return state, infotext, perfdata
+
+check_info["netscaler_cpu"] = {
+ "check_function" : check_netscaler_cpu,
+ "inventory_function" : inventory_netscaler_cpu,
+ "default_levels_variable" : "netscaler_cpu_default_levels",
+ "service_description" : "CPU Utilization %s",
+ "has_perfdata" : True,
+ "group" : "cpu_utilization_multiitem",
+ "snmp_info" : (".1.3.6.1.4.1.5951.4.1.1.41.6.1", [
+ 1, # nsCPUname
+ 2, # nsCPUusage
+ ]),
+ "snmp_scan_function" : lambda oid: oid(".1.3.6.1.2.1.1.2.0").startswith(".1.3.6.1.4.1.5951.1"),
+}
diff --git a/modules/catalog.py b/modules/catalog.py
index 36b392d..b67f46a 100644
--- a/modules/catalog.py
+++ b/modules/catalog.py
@@ -90,6 +90,7 @@ manpage_catalog_titles = {
"apache" : "Apache Webserver",
"db2" : "IBM DB2",
"citrix" : "Citrix",
+ "netscaler" : "Citrix Netscaler",
"exchange" : "Microsoft Exchange",
"java" : "Java (Tomcat, Weblogic, JBoss, etc.)",
"libelle" : "Libelle Business Shadow",
Module: check_mk
Branch: master
Commit: 137e277fedcc512d424fa64704b254a522468809
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=137e277fedcc51…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Dec 18 17:09:49 2014 +0100
#1791 FIX Fix problem where many bogus RRD files for Check_MK service would be created
The problem appeared when using CMC and during check execution some general problem
appeared like <tt>UNKNOWN - global name 'netsnmp' is not defined</tt>. Then in the
<i>next</i> check done by the same helper this message would appear again because
one variable was not cleared. That garbled the protocol with the microcore and the
later took the output of the passive checks as performance data. This has been
fixed.
---
.werks/1791 | 15 +++++++++++++++
ChangeLog | 1 +
modules/check_mk.py | 47 ++++++++++++++++++++++++-----------------------
3 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/.werks/1791 b/.werks/1791
new file mode 100644
index 0000000..5aade28
--- /dev/null
+++ b/.werks/1791
@@ -0,0 +1,15 @@
+Title: Fix problem where many bogus RRD files for Check_MK service would be created
+Level: 2
+Component: core
+Class: fix
+Compatible: compat
+State: unknown
+Version: 1.2.7i1
+Date: 1418918877
+
+The problem appeared when using CMC and during check execution some general problem
+appeared like <tt>UNKNOWN - global name 'netsnmp' is not defined</tt>. Then in the
+<i>next</i> check done by the same helper this message would appear again because
+one variable was not cleared. That garbled the protocol with the microcore and the
+later took the output of the passive checks as performance data. This has been
+fixed.
diff --git a/ChangeLog b/ChangeLog
index df4a0db..fe95f51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
1.2.7i1:
Core & Setup:
* 1759 Packed RPM and DEB agent packages are now shipped with normal Check_MK package...
+ * 1791 FIX: Fix problem where many bogus RRD files for Check_MK service would be created...
Checks & Agents:
* 1665 agent_netapp: New special agent for NetApp monitoring via Web-API...
diff --git a/modules/check_mk.py b/modules/check_mk.py
index e13e6cf..a18450a 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -5604,33 +5604,32 @@ def do_check_keepalive():
(status, len(total_check_output), total_check_output))
total_check_output = ""
- # Flush file descriptors of stdout and stderr, so that diagnostic
- # messages arrive in time in cmc.log
- sys.stdout.flush()
- sys.stderr.flush()
-
- cleanup_globals()
-
- # Check if all global variables are clean, but only in debug mode
- if opt_debug:
- after = copy_globals()
- for varname, value in before.items():
- if value != after[varname]:
- sys.stderr.write("WARNING: global variable %s has changed: %r ==> %s\n"
- % (varname, value, repr(after[varname])[:50]))
- new_vars = set(after.keys()).difference(set(before.keys()))
- if (new_vars):
- sys.stderr.write("WARNING: new variable appeared: %s\n" % ", ".join(new_vars))
- sys.stderr.flush()
-
except Exception, e:
signal.signal(signal.SIGALRM, signal.SIG_IGN) # Prevent ALRM from CheckHelper.cc
signal.alarm(0)
if opt_debug:
raise
- total_check_output = "UNKNOWN - %s\n" % e
- os.write(keepalive_fd, "%03d\n%08d\n%s" %
- (3, len(total_check_output), total_check_output))
+ output = "UNKNOWN - %s\n" % e
+ os.write(keepalive_fd, "%03d\n%08d\n%s" % (3, len(output), output))
+
+ # Flush file descriptors of stdout and stderr, so that diagnostic
+ # messages arrive in time in cmc.log
+ sys.stdout.flush()
+ sys.stderr.flush()
+
+ cleanup_globals() # Prepare for next check
+
+ # Check if all global variables are clean, but only in debug mode
+ if opt_debug:
+ after = copy_globals()
+ for varname, value in before.items():
+ if value != after[varname]:
+ sys.stderr.write("WARNING: global variable %s has changed: %r ==> %s\n"
+ % (varname, value, repr(after[varname])[:50]))
+ new_vars = set(after.keys()).difference(set(before.keys()))
+ if (new_vars):
+ sys.stderr.write("WARNING: new variable appeared: %s\n" % ", ".join(new_vars))
+ sys.stderr.flush()
keepalive_check_memory(num_checks, keepalive_fd)
# In case of profiling do just this one cycle and end afterwards
@@ -5638,6 +5637,8 @@ def do_check_keepalive():
output_profile()
sys.exit(0)
+ # end of while True:...
+
# Just one lines from stdin. But: make sure that
# nothing more is read - not even into some internal
@@ -5711,7 +5712,7 @@ def read_config_files(with_autochecks=True, with_conf_d=True):
# Initialize dictionary-type default levels variables
for check in check_info.values():
- def_var = check.get("default_levels_variable") ######################### HIRN
+ def_var = check.get("default_levels_variable")
if def_var:
globals()[def_var] = {}
Module: check_mk
Branch: master
Commit: 82fc1b825d8a17cad7606859871334e8ee5b11fd
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=82fc1b825d8a17…
Author: Konstantin Büttner <kb(a)mathias-kettner.de>
Date: Thu Dec 18 17:05:11 2014 +0100
#1521 carel_sensors: Now uses new Temperature WATO-Rule
This check no longer uses the Room Temperature rule, but the new Temperature rule,
allowing to set lower levels, configure output unit and override the sensor unit.
Please note that existing room temperature rulesets will no longer apply.
---
.werks/1521 | 11 +++++++++++
ChangeLog | 2 ++
2 files changed, 13 insertions(+)
diff --git a/.werks/1521 b/.werks/1521
new file mode 100644
index 0000000..8fae5ab
--- /dev/null
+++ b/.werks/1521
@@ -0,0 +1,11 @@
+Title: carel_sensors: Now uses new Temperature WATO-Rule
+Level: 1
+Component: checks
+Compatible: incomp
+Version: 1.2.7i1
+Date: 1418918544
+Class: feature
+
+This check no longer uses the Room Temperature rule, but the new Temperature rule,
+allowing to set lower levels, configure output unit and override the sensor unit.
+Please note that existing room temperature rulesets will no longer apply.
diff --git a/ChangeLog b/ChangeLog
index 443ce9a..df4a0db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,8 @@
NOTE: Please refer to the migration notes!
* 1520 hwg_temp: Now uses new temperature ruleset, allows lower levels and alternate output units....
NOTE: Please refer to the migration notes!
+ * 1521 carel_sensors: Now uses new Temperature WATO-Rule...
+ NOTE: Please refer to the migration notes!
* 1457 FIX: logins: new check renamed from "users" check...
NOTE: Please refer to the migration notes!
* 1762 FIX: lnx_thermal: Now ignoring trip points with level 0...
Module: check_mk
Branch: master
Commit: 2fb2c1c70ef21f74232373f3e6fcc346242ea44d
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2fb2c1c70ef21f…
Author: Konstantin Büttner <kb(a)mathias-kettner.de>
Date: Thu Dec 18 16:16:13 2014 +0100
#1520 hwg_temp: Now uses new temperature ruleset, allows lower levels and alternate output units.
hwg_temp now no longer uses the room temperature WATO rule, but the new temperature rule, please note
that the old rule no longer applies. The new rule allows setting lower levels, overriding the input unit
and output in Kelvin, Celsius and Fahrenheit.
---
.werks/1520 | 11 +++++++++++
ChangeLog | 2 ++
2 files changed, 13 insertions(+)
diff --git a/.werks/1520 b/.werks/1520
new file mode 100644
index 0000000..671b2c2
--- /dev/null
+++ b/.werks/1520
@@ -0,0 +1,11 @@
+Title: hwg_temp: Now uses new temperature ruleset, allows lower levels and alternate output units.
+Level: 1
+Component: checks
+Compatible: incomp
+Version: 1.2.7i1
+Date: 1418915653
+Class: feature
+
+hwg_temp now no longer uses the room temperature WATO rule, but the new temperature rule, please note
+that the old rule no longer applies. The new rule allows setting lower levels, overriding the input unit
+and output in Kelvin, Celsius and Fahrenheit.
diff --git a/ChangeLog b/ChangeLog
index 64943a4..443ce9a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@
* 1787 docsis_channels_upstream, docsis_channels_downstream: now also support CASA 100G
* 1519 etherbox.temp: Now supports lower levels, output configurable to Celsius, Fahrenheit or Kelvin...
NOTE: Please refer to the migration notes!
+ * 1520 hwg_temp: Now uses new temperature ruleset, allows lower levels and alternate output units....
+ NOTE: Please refer to the migration notes!
* 1457 FIX: logins: new check renamed from "users" check...
NOTE: Please refer to the migration notes!
* 1762 FIX: lnx_thermal: Now ignoring trip points with level 0...
Module: check_mk
Branch: master
Commit: b77052cb0df242432e7e4163aa0a0fa8e2846471
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b77052cb0df242…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Dec 18 16:07:35 2014 +0100
#1774 FIX IE: Always use the latest available rendering enginge of the used browser
We tell IE to always use the latest available rendering engine instead of a guessed one
or the default one. The user might still override this by choosing a rendering engine
by hand in IE.
This should fix several rendering and JS problems e.g. when using the dashboard designer.
---
.werks/1774 | 14 ++++++++++++++
ChangeLog | 1 +
web/htdocs/htmllib.py | 1 +
web/htdocs/main.py | 1 +
4 files changed, 17 insertions(+)
diff --git a/.werks/1774 b/.werks/1774
new file mode 100644
index 0000000..664200d
--- /dev/null
+++ b/.werks/1774
@@ -0,0 +1,14 @@
+Title: IE: Always use the latest available rendering enginge of the used browser
+Level: 1
+Component: multisite
+Class: fix
+Compatible: compat
+State: unknown
+Version: 1.2.7i1
+Date: 1418915144
+
+We tell IE to always use the latest available rendering engine instead of a guessed one
+or the default one. The user might still override this by choosing a rendering engine
+by hand in IE.
+
+This should fix several rendering and JS problems e.g. when using the dashboard designer.
diff --git a/ChangeLog b/ChangeLog
index 101f197..5917018 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -36,6 +36,7 @@
* 1206 FIX: Hostname not longer shown as column in host views
* 1766 FIX: Fixed exceptions in Web GUI when host or service groups used non ascii characters in names...
* 1773 FIX: Fixed different exceptions when using localized multisite
+ * 1774 FIX: IE: Always use the latest available rendering enginge of the used browser...
WATO:
* 1760 Added search form to manual checks page
diff --git a/web/htdocs/htmllib.py b/web/htdocs/htmllib.py
index 14410da..9396b47 100644
--- a/web/htdocs/htmllib.py
+++ b/web/htdocs/htmllib.py
@@ -730,6 +730,7 @@ class html:
self.write('<title>')
self.write(self.attrencode(title))
self.write('</title>\n')
+ self.write('<meta http-equiv="X-UA-Compatible" content="IE=edge" />')
# If the variable _link_target is set, then all links in this page
# should be targetted to the HTML frame named by _link_target. This
diff --git a/web/htdocs/main.py b/web/htdocs/main.py
index 89091f9..6c9d161 100644
--- a/web/htdocs/main.py
+++ b/web/htdocs/main.py
@@ -47,6 +47,7 @@ def page_index():
<html>
<head>
<title>%s</title>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link rel="shortcut icon" href="images/favicon.ico" type="image/ico">
</head>
<frameset cols="280,*" frameborder="0" framespacing="0" border="0">
Module: check_mk
Branch: master
Commit: d35d9257c5edd12c2c4d9435fad24b3a9b429368
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d35d9257c5edd1…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Dec 18 15:01:55 2014 +0100
Fix Unicode/UTF-8 problem in HTML selects
---
web/htdocs/htmllib.py | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/web/htdocs/htmllib.py b/web/htdocs/htmllib.py
index 63fe4bd..14410da 100644
--- a/web/htdocs/htmllib.py
+++ b/web/htdocs/htmllib.py
@@ -33,6 +33,14 @@
#
# - Order of arguments:
# e.g. icon(help, icon) -> change and make help otional?
+#
+# - General rules:
+# 1. values of type str that are passed as arguments or
+# return values or are stored in datastructures most not contain
+# non-Ascii characters! UTF-8 encoding must just be used in
+# the last few CPU cycles before outputting. Conversion from
+# input to str or unicode must happen as early as possible,
+# directly when reading from file or URL.
import time, os, pwd, urllib, random
@@ -513,21 +521,22 @@ class html:
self.set_focus(varname)
self.form_vars.append(varname)
- def sorted_select(self, varname, options, deflt="", onchange=None, attrs = {}):
+ def sorted_select(self, varname, choices, deflt="", onchange=None, attrs = {}):
# Sort according to display texts, not keys
- sorted = options[:]
+ sorted = choices[:]
sorted.sort(lambda a,b: cmp(a[1].lower(), b[1].lower()))
self.select(varname, sorted, deflt, onchange, attrs)
- def select(self, varname, options, deflt="", onchange=None, attrs = {}):
- current = self.var(varname, deflt)
+ # Choices is a list pairs of (key, title)
+ def select(self, varname, choices, deflt="", onchange=None, attrs = {}):
+ current = self.var_utf8(varname, deflt)
onchange_code = onchange and " onchange=\"%s\"" % (onchange) or ""
attrs.setdefault('size', 1)
attributes = ' ' + ' '.join([ '%s="%s"' % (k, v) for k, v in attrs.iteritems() ])
self.write("<select%s name=\"%s\" id=\"%s\"%s>\n" %
(onchange_code, varname, varname, attributes))
- for value, text in options:
+ for value, text in choices:
if value == None:
value = ""
elif type(value) == unicode:
@@ -1026,9 +1035,7 @@ class html:
def var_utf8(self, varname, deflt = None):
val = self.vars.get(varname, deflt)
- if val == None:
- return val
- else:
+ if val != None:
return val.decode("utf-8")
# Return all values of a variable that possible occurs more
Module: check_mk
Branch: master
Commit: cc85f6b70f2a0481f2093c598c8400803cffa91a
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=cc85f6b70f2a04…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Dec 18 14:40:26 2014 +0100
Added draft for mknotifyd
---
doc/drafts/LIESMICH.reverse_spooling | 78 ++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/doc/drafts/LIESMICH.reverse_spooling b/doc/drafts/LIESMICH.reverse_spooling
new file mode 100644
index 0000000..e7b5802
--- /dev/null
+++ b/doc/drafts/LIESMICH.reverse_spooling
@@ -0,0 +1,78 @@
+IDEE
+
+Der Notifications-Spooler mknotifyd verbindet sich aktiv mit seinen Slaves
+per TCP und nicht umgekehrt. Er kümmert sich darum, dass die Verbindungen
+stets offen sind.
+
+UMSETZUNG:
+
+[1] Global Settings:Notifications: Die ganzen Optionen zum Notification-Spooling
+ plus neue Optionen werden sauber neu gruppiert in einem Dictionary:
+
+ [X] Enable Notification Spooling
+
+ 1. [X] Deliver local notifications asynchronously (gabs vorher schon)
+
+ 2. [X] Distributed Notifications
+ Hier tauchen weitere Optionen auf:
+ 2.1 Role: [v Notification Source] (oder: Notification Sink)
+ Hier kann man die Rolle einstellen. Der Master (muss nicht unbedingt
+ auf der Master Site sein) bekommt die Rolle "Sink". Die anderen
+ Sites die Rolle "Source". Eine Site kann nicht beides sein, also
+ gibt es keine Notification-Proxies. Standalone ist der Default. Hier
+ gibt es keine Verbindung mit anderen Spoolern.
+
+ 2.2 [X] TCP Server
+ Listen on Port: [6675]
+ Send Heartbeat every [10] Seconds (only for Notification sources)
+
+ 2.3 [X] TCP Client
+ Connect to Servers:
+ IP-Address: [12.3.45.5] Port: [6678]
+ IP-Address: [12.3.45.6] Port: [6678]
+ IP-Address: [12.3.45.6] Port: [6679]
+ Expect Heartbeat every [15] Seconds (only for Notification sinks)
+ Cooldown time after dead connection: [4] Seconds
+
+
+ Wenn man die Rolle Notification Source hat, dann kann
+ man nur einen Server angeben.
+
+ Für das zentrale System wählen man also Notification Sink aus. Wenn
+ es Slaves gibt, die sich selbst verbinden, dann wählt man Listen on
+ Port und gibt eine Portnummer an.
+
+ Für Remote-Sites, von denen die Not. abgeholt werden sollen, gibt man
+ diese in der Liste an.
+
+ Bei der Rolle Source kann man nur einen Server angeben (könnte man evtl.
+ aufweichen).
+
+[2] Der Notification-Spooler muss jetzt mit der neuen Konfiguration zurechtkommen,
+ und auch mit der alten. Die WATO-Regeln für die alten werden aber entfernt.
+ Sobald man über die neue Regel etwas konfiguriert, werden die alten ignoriert.
+ Das muss in den Migration-Notes so beschrieben sein.
+
+[3] Der Notification-Spooler muss jetzt aktiv eine Liste von TCP-Verbindungen
+ pflegen (stehende Verbindungen), falls er Rolle Sink hat und TCP Client
+ ist. Auf diese muss er mit select() warten. Wenn ein Socket lesbar wird,
+ muss er von dort eine Notification lesen. Dazu muss der aktuelle Code
+ so zentralisiert werden, dass alle Sockets gleichzeitig bedient werden
+ und ein Wartezustand in einer der Verbindungen die anderen nicht aushungert.
+ Auch der bestehende Code zum Senden von Notifications muss da einbezogen
+ werden.
+
+[4] Lebenszeichen: Wenn eine Notification Source, die TCP Server ist, eine
+ Connection empfängt, muss es diese in eine Liste stecken. Mehrere Connections
+ parallel sollten möglich sein. In jede Connection wird alle X Sekunden
+ ein Lebenszeichen gesendet. Eine Sink, die TCP Client ist, überprüft die
+ Lebenszeichen und macht die Verbindung zu, wenn eines ausbleibt.
+ Nach einer Cooldown-Zeit wird die Verbindung dann wieder aufgebaut.
+
+[5] Monitoring: Der aktuelle Status wird alle X Sekunden in eine Datei
+ rausgeschrieben - nach var/log/mknotifyd.status (analog zu dem
+ liveproxyd). Diese Datei wird von einem neuen Plugin eingelesen -
+ mit der Zuordnung zur Site. Dazu schreiben wir ein Plugin, welches
+ dann die stehenden TCP-Verbindungen zu den Remote-Sites überwacht,
+ evtl. auch Counter für gesendete und empfangene Notifications.
+