Module: check_mk
Branch: master
Commit: be1d36d8de250e36bc2fb46c33b2b41d061a4f3d
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=be1d36d8de250e…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Jul 8 13:15:37 2013 +0200
Small cleanup of mysql.connections
---
checkman/mysql.connections | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/checkman/mysql.connections b/checkman/mysql.connections
index 409fdf6..a47e1ad 100644
--- a/checkman/mysql.connections
+++ b/checkman/mysql.connections
@@ -5,25 +5,26 @@ author: Mathias Kettner <mk(a)mathias-kettner.de>
license: GPL
distribution: check_mk
description:
- This check allows tracking of connection usage for a MySQL database.
+ This check allows the tracking of connection usage for a MySQL database.
Therefore it queries the maximum number of connections that have been
in use simultaneously since the server started and
the maximum number of possible parallel connections.
From these both it calculates the
maximum usage level of these connections in percent
- and matches the given {WARN} and {CRIT} thresholds against it.
+ and matches the specified {WARN} and {CRIT} thresholds against it.
This check needs the agent plugin {mk_mysql} to be installed.
Further details about this plugin and monitoring of MySQL can be
found in the Check_MK online documentation in the article
"Monitoring MySQL with Check_MK".
-inventory:
+inventory:
On each host where the agent plugin {mk_mysql} is being installed
and the MySQL daemon is running one service is being generated.
[parameters]
-perc_used: (warn, crit)
+parameters (dict): A dictionary with currentl just one possible key: {"perc_used"}. This
+ is a pair if two floating point numbers:
{warn} (float): The maximum connection usage (in percent) that triggers
a {WARN} state.
@@ -31,4 +32,4 @@ perc_used: (warn, crit)
{crit} (float): The maximum connection usage (in percent) that triggers
a {CRIT} state.
- If perc_used is not set, the check always returns {OK} state.
+ If {perc_used} is not set, the check always returns {OK} state.
Module: check_mk
Branch: master
Commit: 1a710d09f69631b1cfde2968325a223e790c764d
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=1a710d09f69631…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Jul 8 13:13:19 2013 +0200
Small cleanup of win_netstat manpage
---
checkman/win_netstat | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/checkman/win_netstat b/checkman/win_netstat
index bf0670d..ffeb8b6 100644
--- a/checkman/win_netstat
+++ b/checkman/win_netstat
@@ -5,11 +5,11 @@ author: Mathias Kettner <mk(a)mathias-kettner.de>
license: GPL
distribution: check_mk
description:
- This check evaluates output of {netstat -an} command on windows
+ This check evaluates the output of the {netstat -an} command on windows
and checks if there are established connections or listeners
- matching the given criteria.
+ matching a given criteria.
- Returns {OK} state if the specified connection/listener is present,
+ The check returns {OK} state if the specified connection/listener is present,
and {CRIT} if not.
This check needs the agent plugin {netstat_an.bat} to be installed.
@@ -19,7 +19,7 @@ item:
examples:
# Make sure that a connection from 192.168.0.1 is established
- # to this host (192.168.0.2) on port 445:
+ # to the host winsrv1 (192.168.0.2) on port 445:
checks += [
( 'winsrv1', 'win_netstat', 'My Test Connection',
{
@@ -57,16 +57,17 @@ parameters (dict): A dictionary with the following keys, all of which are
this is the port the process listens on.
{"remote_ip"} The remote IP address of the connection. You need
- to give this only when monitoring connections. Omit if monitoring
+ to specify this only when monitoring connections. Omit if monitoring
listeners.
{"remote_port"} The remote port of the connection. You need
- to give this only when monitoring connections. Omit if monitoring
+ to specify this only when monitoring connections. Omit if monitoring
listeners.
{"proto"} {TCP} or {UDP} are possible values:
The protocol used for the connection or the listener.
- {"state"} {ESTABLISHED}, {LISTEN}, {TIME_WAIT}, {SYN_SENT}, {SYN_RECV},
- {LAST_ACK}, {CLOSE_WAIT}, {TIME_WAIT}, {CLOSED}, {CLOSING}, {FIN_WAIT1}, {FIN_WAIT2},
- {BOUND}: The state of the connection or listener.
+ {"state"} {"ESTABLISHED"}, {"LISTEN"}, {"TIME_WAIT"}, {"SYN_SENT"}, {"SYN_RECV"},
+ {"LAST_ACK"}, {"CLOSE_WAIT"}, {"TIME_WAIT"}, {"CLOSED"}, {"CLOSING"}, {"FIN_WAIT1"}, {"FIN_WAIT2"},
+ or {"BOUND"}: The expected state of the TCP/UDP socket. You most probably will use either
+ {"ESTABLISHED"} or {"LISTEN"}.
Module: check_mk
Branch: master
Commit: 6e0e57ff00b5b18db64f32f32f8641676d40cd11
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=6e0e57ff00b5b1…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Mon Jul 8 13:10:58 2013 +0200
FIX: Fixed locking problem of multisite pages related to user loading/saving
---
ChangeLog | 5 +++--
web/htdocs/lib.py | 15 ++++++++++++---
web/htdocs/userdb.py | 20 +++++++++++++-------
web/htdocs/wato.py | 10 +++++-----
web/plugins/userdb/ldap.py | 2 +-
5 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 1bc80bb..4ad6df4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -56,13 +56,11 @@
Multisite:
* User accounts can now be locked after a specified amount of auth
failures (lock_on_logon_failures can be set to a number of tries)
- * FIX: better error message in case of exception in SNMP handling
* Column Perf-O-Meter is now sortable: it sorts after the *first*
performance value. This might not always be the one you like, but
its far better than nothing.
* logwatch: Logwatch icon no longer uses notes_url
* check_mk-if.pnp: fixed bug with pnp template on esx hosts without perfdata
- * Fix: Inventory screen: Now shows custom checks
* Inventory screen: Host inventory also displays its clustered services
* Rules: Renamed "Ignored services" to "Disabled services"
Renamed "Ignored checks" to "Disabled checks"
@@ -78,6 +76,9 @@
* Added option to disable automatic userdb synchronizations in multisite
* Implemented search forms for most data tables
* New icons in view footers: export as CSV, export as JSON
+ * FIX: better error message in case of exception in SNMP handling
+ * FIX: Inventory screen: Now shows custom checks
+ * FIX: Fixed locking problem of multisite pages related to user loading/saving
WATO:
* Allow to configure check-/retry_interval in second precision
diff --git a/web/htdocs/lib.py b/web/htdocs/lib.py
index bb40374..8eab33a 100644
--- a/web/htdocs/lib.py
+++ b/web/htdocs/lib.py
@@ -279,14 +279,23 @@ def aquire_lock(path):
return # No recursive locking
fd = os.open(path, os.O_RDONLY)
fcntl.flock(fd, fcntl.LOCK_EX)
- g_aquired_locks.append(fd)
+ g_aquired_locks.append((path, fd))
g_locked_paths.append(path)
+def release_lock(path):
+ if path not in g_locked_paths:
+ return # no unlocking needed
+ for lock_path, fd in g_aquired_locks:
+ if lock_path == path:
+ fcntl.flock(fd, fcntl.LOCK_UN)
+ fd.close()
+ g_aquired_locks.remove((lock_path, fd))
+ g_locked_paths.remove(path)
+
def release_all_locks():
global g_aquired_locks, g_locked_paths
- for fd in g_aquired_locks:
+ for path, fd in g_aquired_locks:
os.close(fd)
g_aquired_locks = []
g_locked_paths = []
-
diff --git a/web/htdocs/userdb.py b/web/htdocs/userdb.py
index 4abc5d6..95d3f4a 100644
--- a/web/htdocs/userdb.py
+++ b/web/htdocs/userdb.py
@@ -107,7 +107,7 @@ def new_user_template(connector_id):
return new_user
def create_non_existing_user(connector_id, username):
- users = load_users()
+ users = load_users(lock = True)
if username in users:
return # User exists. Nothing to do...
@@ -122,13 +122,13 @@ def user_locked(username):
return users[username].get('locked', False)
def on_succeeded_login(username):
- users = load_users()
+ users = load_users(lock = True)
if "num_failed" in users[username]:
users[username]["num_failed"] = 0
save_users(users)
def on_failed_login(username):
- users = load_users()
+ users = load_users(lock = True)
if username in users:
if "num_failed" in users[username]:
users[username]["num_failed"] += 1
@@ -165,13 +165,14 @@ def declare_user_attribute(name, vs, user_editable = True, permission = None):
def get_user_attributes():
return user_attributes.items()
-def load_users():
+def load_users(lock = False):
filename = root_dir + "contacts.mk"
# Make sure that the file exists without modifying it, *if* it exists.
- # Note the lock will be released at end of page request automatically.
+ # Note: the lock will be released at end of page request automatically.
file(filename, "a")
- aquire_lock(filename)
+ if lock:
+ aquire_lock(filename)
# First load monitoring contacts from Check_MK's world. If this is
# the first time, then the file will be empty, which is no problem.
@@ -394,6 +395,11 @@ def save_users(profiles):
# if os.path.isdir(entry):
# shutil.rmtree(entry)
+ # 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
+ # to be written (like during user syncs, wato, ...)
+ release_lock(root_dir + "contacts.mk")
+
# Call the users_saved hook
hooks.call("users-saved", users)
@@ -647,7 +653,7 @@ def general_page_hook():
# Create initial auth.serials file, same issue as auth.php above
serials_file = '%s/auth.serials' % os.path.dirname(defaults.htpasswd_file)
if not os.path.exists(serials_file) or os.path.getsize(serials_file) == 0:
- save_users(load_users())
+ save_users(load_users(lock = True))
# Hook function can be registered here to execute actions on a "regular" base without
# user triggered action. This hook is called on each page load.
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 1c7ab16..8d69a4f 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -5246,7 +5246,7 @@ def create_snapshot():
def factory_reset():
# Darn. What makes things complicated here is that we need to conserve htpasswd,
# at least the account of the currently logged in user.
- users = userdb.load_users()
+ users = userdb.load_users(lock = True)
for id in users.keys():
if id != config.user_id:
del users[id]
@@ -7917,7 +7917,7 @@ def mode_users(phase):
userdb.hook_sync(add_to_changelog = True)
roles = userdb.load_roles()
- users = filter_hidden_users(userdb.load_users())
+ users = filter_hidden_users(userdb.load_users(lock = phase == 'action' and html.var('_delete')))
timeperiods = load_timeperiods()
contact_groups = userdb.load_group_information().get("contact", {})
@@ -8044,7 +8044,7 @@ def mode_users(phase):
def mode_edit_user(phase):
- users = userdb.load_users()
+ users = userdb.load_users(lock = phase == 'action')
userid = html.var("edit") # missing -> new user
cloneid = html.var("clone") # Only needed in 'new' mode
new = userid == None
@@ -8744,7 +8744,7 @@ def save_roles(roles):
# be renamed and are not handled here. If new_id is None,
# the role is being deleted
def rename_user_role(id, new_id):
- users = userdb.load_users()
+ users = userdb.load_users(lock = True)
for user in users.values():
if id in user["roles"]:
user["roles"].remove(id)
@@ -11518,7 +11518,7 @@ def page_user_profile():
success = None
if html.has_var('_save') and html.check_transaction():
try:
- users = userdb.load_users()
+ users = userdb.load_users(lock = True)
# Profile edit (user options like language etc.)
if config.may('general.edit_profile'):
diff --git a/web/plugins/userdb/ldap.py b/web/plugins/userdb/ldap.py
index 8f9826e..0535d56 100644
--- a/web/plugins/userdb/ldap.py
+++ b/web/plugins/userdb/ldap.py
@@ -716,7 +716,7 @@ def ldap_sync(add_to_changelog, only_username):
# filt = '(%s=%s)' % (ldap_user_id_attr(), only_username)
import wato
- users = load_users()
+ users = load_users(lock = True)
ldap_users = ldap_get_users()
# Remove users which are controlled by this connector but can not be found in
Module: check_mk
Branch: master
Commit: 328a184f21c9fcb6aa70e8812981d0d119f30ce3
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=328a184f21c9fc…
Author: Bernd Stroessenreuther <bs(a)mathias-kettner.de>
Date: Mon Jul 8 12:58:15 2013 +0200
fixing checkman mysql.connections and win_netstat
---
checkman/mysql.connections | 15 ++++++++-----
checkman/win_netstat | 52 ++++++++++++++++++++++++++------------------
2 files changed, 40 insertions(+), 27 deletions(-)
diff --git a/checkman/mysql.connections b/checkman/mysql.connections
index d17d78e..409fdf6 100644
--- a/checkman/mysql.connections
+++ b/checkman/mysql.connections
@@ -11,7 +11,7 @@ description:
the maximum number of possible parallel connections.
From these both it calculates the
maximum usage level of these connections in percent
- and matches the given warning and critical thresholds against it.
+ and matches the given {WARN} and {CRIT} thresholds against it.
This check needs the agent plugin {mk_mysql} to be installed.
Further details about this plugin and monitoring of MySQL can be
@@ -23,9 +23,12 @@ inventory:
and the MySQL daemon is running one service is being generated.
[parameters]
-dictionary..., wenn perc_used nicht enthalten, ist der Chec immer OK.
-warning (float): The maximum connection usage (in percent) that triggers
- a warning state.
-critical (float): The maximum connection usage (in percent) that triggers
- a critical state.
+perc_used: (warn, crit)
+ {warn} (float): The maximum connection usage (in percent) that triggers
+ a {WARN} state.
+
+ {crit} (float): The maximum connection usage (in percent) that triggers
+ a {CRIT} state.
+
+ If perc_used is not set, the check always returns {OK} state.
diff --git a/checkman/win_netstat b/checkman/win_netstat
index 5054aaf..bf0670d 100644
--- a/checkman/win_netstat
+++ b/checkman/win_netstat
@@ -12,15 +12,14 @@ description:
Returns {OK} state if the specified connection/listener is present,
and {CRIT} if not.
+ This check needs the agent plugin {netstat_an.bat} to be installed.
+
item:
A user defined identifier of the connection.
examples:
- # If you want to make sure some machine on 192.168.0.1 has an established
- # TCP connection to the monitored machine (192.168.0.2) on port 445 you
- # would define:
-
- # Make sure that a ...
+ # Make sure that a connection from 192.168.0.1 is established
+ # to this host (192.168.0.2) on port 445:
checks += [
( 'winsrv1', 'win_netstat', 'My Test Connection',
{
@@ -34,29 +33,40 @@ examples:
]
# Check if TCP port 80 is listening
- checkstatic_checks['tcp_connections'] = [
- ( ('win_netstat', 'HTTP Listener',
+ checks += [
+ ( 'websrv1', 'win_netstat', 'HTTP Listener',
{
'local_port': 80,
'state' : 'LISTEN',
'proto' : 'TCP'
- }),
- [], ['websrv1'] ),
+ },
+ ),
]
[parameters]
parameters (dict): A dictionary with the following keys, all of which are
optional.
- {"local_ip"} The local IP address of the connection. For listeners
- this is the IP address the process listens on. Applications that
- listen on all IP address use an asterisk {*} here. If you omit
- this parameter then the local address is being ignored.
-local_port(int): the local Port
-remote_ip(string): the remote IP address
-remote_port(int): the remote Port
-proto(string): TCP or UDP are possible values:
- The protocol used for the connection or the listener
-state(string): {ESTABLISHED}, LISTEN, TIME_WAIT, SYN_SENT, SYN_RECV,
- LAST_ACK, CLOSE_WAIT, TIME_WAIT, CLOSED, CLOSING, FIN_WAIT1, FIN_WAIT2,
- BOUND: The state of the connection or listener
+ {"local_ip"} The local IP address of the connection. For listeners
+ this is the IP address the process listens on. Applications that
+ listen on all IP address use an asterisk {*} here. If you omit
+ this parameter then any local address matches (no matter if the
+ listener is bound to * or to a specific interface or IP).
+
+ {"local_port"} The local port of the connection. For listeners
+ this is the port the process listens on.
+
+ {"remote_ip"} The remote IP address of the connection. You need
+ to give this only when monitoring connections. Omit if monitoring
+ listeners.
+
+ {"remote_port"} The remote port of the connection. You need
+ to give this only when monitoring connections. Omit if monitoring
+ listeners.
+
+ {"proto"} {TCP} or {UDP} are possible values:
+ The protocol used for the connection or the listener.
+
+ {"state"} {ESTABLISHED}, {LISTEN}, {TIME_WAIT}, {SYN_SENT}, {SYN_RECV},
+ {LAST_ACK}, {CLOSE_WAIT}, {TIME_WAIT}, {CLOSED}, {CLOSING}, {FIN_WAIT1}, {FIN_WAIT2},
+ {BOUND}: The state of the connection or listener.