check_mk-ldap-password-store/active_checks.py

2290 lines
104 KiB
Python

#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# | ____ _ _ __ __ _ __ |
# | / ___| |__ ___ ___| | __ | \/ | |/ / |
# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
# | | |___| | | | __/ (__| < | | | | . \ |
# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
# | |
# | Copyright Mathias Kettner 2014 mk@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-
# tails. 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.
register_rulegroup("activechecks",
_("Active checks (HTTP, TCP, etc.)"),
_("Configure active networking checks like HTTP and TCP"))
group = "activechecks"
# These elements are also used in check_parameters.py
check_icmp_params = [
( "rta",
Tuple(
title = _("Round trip average"),
elements = [
Float(title = _("Warning if above"), unit = "ms", default_value = 200.0),
Float(title = _("Critical if above"), unit = "ms", default_value = 500.0),
])),
( "loss",
Tuple(
title = _("Packet loss"),
help = _("When the percentage of lost packets is equal or greater then "
"this level, then the according state is triggered. The default for critical "
"is 100%. That means that the check is only critical if <b>all</b> packets "
"are lost."),
elements = [
Percentage(title = _("Warning at"), default_value = 80.0),
Percentage(title = _("Critical at"), default_value = 100.0),
])),
( "packets",
Integer(
title = _("Number of packets"),
help = _("Number ICMP echo request packets to send to the target host on each "
"check execution. All packets are sent directly on check execution. Afterwards "
"the check waits for the incoming packets."),
minvalue = 1,
maxvalue = 20,
default_value = 5,
)),
( "timeout",
Integer(
title = _("Total timeout of check"),
help = _("After this time (in seconds) the check is aborted, regardless "
"of how many packets have been received yet."),
minvalue = 1,
)),
]
imap_parameters = Dictionary(
title = "IMAP",
optional_keys = [],
elements = [
('server', TextAscii(
title = _('IMAP Server'),
allow_empty = False,
help = _('You can specify a hostname or IP address different from the IP address '
'of the host this check will be assigned to.')
)),
('ssl', CascadingDropdown(
title = _('SSL Encryption'),
default_value = (False, 143),
choices = [
(False, _('Use no encryption'),
Optional(Integer(
allow_empty = False,
default_value = 143,
),
title = _('TCP Port'),
help = _('By default the standard IMAP Port 143 is used.'),
)),
(True, _('Encrypt IMAP communication using SSL'),
Optional(Integer(
allow_empty = False,
default_value = 993,
),
title = _('TCP Port'),
help = _('By default the standard IMAP/SSL Port 993 is used.'),
)),
],
)),
('auth', Tuple(
title = _('Authentication'),
elements = [
TextAscii(
title = _('Username'),
allow_empty = False,
size = 24
),
IndividualOrStoredPassword(
title = _('Password'),
allow_empty = False,
size = 12
),
],
)),
],
)
pop3_parameters = Dictionary(
optional_keys = ['server'],
elements = [
('server', TextAscii(
title = _('POP3 Server'),
allow_empty = False,
help = _('You can specify a hostname or IP address different from the IP address '
'of the host this check will be assigned to.')
)),
('ssl', CascadingDropdown(
title = _('SSL Encryption'),
default_value = (False, 110),
choices = [
(False, _('Use no encryption'),
Optional(Integer(
allow_empty = False,
default_value = 110,
),
title = _('TCP Port'),
help = _('By default the standard POP3 Port 110 is used.'),
)),
(True, _('Encrypt POP3 communication using SSL'),
Optional(Integer(
allow_empty = False,
default_value = 995,
),
title = _('TCP Port'),
help = _('By default the standard POP3/SSL Port 995 is used.'),
)),
],
)),
('auth', Tuple(
title = _('Authentication'),
elements = [
TextAscii(
title = _('Username'),
allow_empty = False,
size = 24
),
IndividualOrStoredPassword(
title = _('Password'),
allow_empty = False,
size = 12
),
],
)),
],
)
mail_receiving_params = [
('fetch', CascadingDropdown(
title = _('Mail Receiving'),
choices = [
('IMAP', _('IMAP'), imap_parameters),
('POP3', _('POP3'), pop3_parameters),
]
))
]
register_rule(group,
"active_checks:ssh",
Dictionary(
title = _("Check SSH service"),
help = _("This rulset allow you to configure a SSH check for a host"),
elements = [
( "description",
TextUnicode(
title = _("Service Description"),
)),
("port",
Integer(
title = _("TCP port number"),
default_value = 22),
),
("timeout",
Integer(
title = _("Connect Timeout"),
help = _("Seconds before connection times out"),
default_value = 10),
),
("remote_version",
TextAscii(
title = _("Version of Server"),
help = _("Warn if string doesn't match expected server version (ex: OpenSSH_3.9p1)"),
)),
("remote_protocol",
TextAscii(
title = _("Protocol of Server"),
help = _("Warn if protocol doesn't match expected protocol version (ex: 2.0)"),
)),
]
),
match="all")
register_rule(group,
"active_checks:icmp",
Dictionary(
title = _("Check hosts with PING (ICMP Echo Request)"),
help = _("This ruleset allows you to configure explicit PING monitoring of hosts. "
"Usually a PING is being used as a host check, so this is not neccessary. "
"There are some situations, however, where this can be useful. One of them "
"is when using the Check_MK Micro Core with SMART Ping and you want to "
"track performance data of the PING to some hosts, nevertheless."),
elements = [
( "description",
TextUnicode(
title = _("Service Description"),
allow_empty = False,
default_value = "PING",
)),
( "address",
CascadingDropdown(
title = _("Alternative address to ping"),
help = _("If you omit this setting then the configured IP address of that host "
"will be pinged. You can set an alternative address here (e.g. when "
"you want to check a secondary IP address of the host in question)."),
orientation = "horizontal",
choices = [
("address", _("Ping the normal IP address")),
("alias", _("Use the alias as DNS name / IP address")),
("explicit", _("Ping the following explicit address / DNS name"), Hostname()),
("all_ipv4addresses", _("Ping all IPv4 addresses")),
("all_ipv6addresses", _("Ping all IPv6 addresses")),
("additional_ipv4addresses", _("Ping additional IPv4 addresses")),
("additional_ipv6addresses", _("Ping additional IPv6 addresses")),
]
)),
] + check_icmp_params,
),
match = "all",
)
# Several active checks just had crit levels as one integer
def transform_cert_days(cert_days):
if type(cert_days) != tuple:
return (cert_days, 0)
else:
return cert_days
register_rule(group,
"active_checks:ftp",
Transform(
Dictionary(
elements = [
("port",
Integer(
title = _("Portnumber"),
default_value = 21,
)
),
( "response_time",
Tuple(
title = _("Expected response time"),
elements = [
Float(
title = _("Warning if above"),
unit = "ms",
default_value = 100.0),
Float(
title = _("Critical if above"),
unit = "ms",
default_value = 200.0),
])
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
( "refuse_state",
DropdownChoice(
title = _("State for connection refusal"),
choices = [ ('crit', _("CRITICAL")),
('warn', _("WARNING")),
('ok', _("OK")),
])
),
( "send_string",
TextAscii(
title = _("String to send"),
size = 30)
),
( "expect",
ListOfStrings(
title = _("Strings to expect in response"),
orientation = "horizontal",
valuespec = TextAscii(size = 30),
)
),
( "ssl",
FixedValue(
value = True,
totext = _("use SSL"),
title = _("Use SSL for the connection."))
),
( "cert_days",
Transform(
Tuple(
title = _("SSL certificate validation"),
help = _("Minimum number of days a certificate has to be valid"),
elements = [
Integer(title = _("Warning at or below"), minvalue = 0, unit = _("days")),
Integer(title = _("Critical at or below"), minvalue = 0, unit = _("days")),
],
),
forth = transform_cert_days,
),
),
]),
forth = lambda x: type(x) == tuple and x[1] or x,
title = _("Check FTP Service"),
),
match = "all",
)
register_rule(
group,
"active_checks:sftp",
Tuple(
title = _("Check SFTP Service"),
help = _("Check functionality of a SFTP server. You can use the default values for putting or getting "
"a file. This file will then be created for the test and deleted afterwards. It will of course not "
"deleted if it was not created by this active check."),
elements = [
TextAscii(
title = _("Hostname"),
allow_empty = False),
TextAscii(
title = _("Username"),
allow_empty = False),
IndividualOrStoredPassword(
title = _("Password"),
allow_empty = False),
Dictionary(
elements = [
("description",
TextAscii(
title = _("Service Description"),
default_value = "SFTP",
size = 30)
),
("port",
Integer(
title = _("Port"),
default_value = 22)
),
("timeout",
Integer(
title = _("Timeout"),
default_value = 10)
),
("timestamp",
TextAscii(
title = _("Timestamp of a remote file"),
size = 30,
help = _("Show timestamp of a given file. You only need to specify the "
"relative path of the remote file. Examples: \'myDirectory/testfile\' "
" or 'testfile'")),
),
("put",
Tuple(
title = _("Put file to SFTP server"),
elements = [
TextAscii(
title = _("Local file"),
size = 30,
default_value = "tmp/check_mk_testfile",
help = _("Local path including filename. Base directory for this relative path "
"will be the home directory of your site. The testfile will be created "
"if it does not exist. Examples: \'tmp/testfile\' (file will be located in "
"$OMD_ROOT/tmp/testfile )")),
TextAscii(
title = _("Remote destination"),
size = 30,
default_value = "",
help = _("Remote path where to put the file. If you leave this empty, the file will be placed "
"in the home directory of the user. Example: \'myDirectory\' ")),
])
),
("get",
Tuple(
title = _("Get file from SFTP server"),
elements = [
TextAscii(
title = _("Remote file"),
size = 30,
default_value = "check_mk_testfile",
help = _("Remote path including filename "
"(e.g. \'testfile\'). If you also enabled "
"'Put file to SFTP server', you can use the same file for both tests.")),
TextAscii(
title = _("Local destination"),
size = 30,
default_value = "tmp",
help = _("Local path where to put the downloaded file "
"(e.g. \'tmp\' ).")),
])
),
]
)]),
match = "all",
)
register_rule(group,
"active_checks:dns",
Tuple(
title = _("Check DNS service"),
help = _("Check the resolution of a hostname into an IP address by a DNS server. "
"This check uses <tt>check_dns</tt> from the standard Nagios plugins."),
elements = [
TextAscii(
title = _("Queried Hostname or IP address"),
allow_empty = False,
help = _('The name or IPv4 address you want to query')),
Dictionary(
title = _("Optional parameters"),
elements = [
("name",
TextUnicode(
title = _("Alternative Service description"),
help = _("The service description will be this name instead <i>DNS Servername</i>"),
)
),
( "server",
Alternative(
title = _("DNS Server"),
elements = [
FixedValue( value=None, totext=_("this host"),
title = _("Use this host as a DNS server for the lookup")),
TextAscii(
title = _("Specify DNS Server"),
allow_empty = False,
help = _("Optional DNS server you want to use for the lookup")),
])
),
( "expected_address",
Transform(
ListOfStrings(
title = _("Expected answer (IP address or hostname)"),
help = _("List all allowed expected answers here. If query for an "
"IP address then the answer will be host names, that end "
"with a dot."),
),
forth = lambda old: type(old) in (str, unicode) and [old] or old,
),
),
( "expected_authority",
FixedValue(
value = True,
title = _("Expect Authoritative DNS Server"),
totext = _("Expect Authoritative"),
)
),
( "response_time",
Tuple(
title = _("Expected response time"),
elements = [
Float(
title = _("Warning if above"),
unit = _("sec"),
default_value = 1),
Float(
title = _("Critical if above"),
unit = _("sec"),
default_value = 2),
])
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
]),
]
),
match = 'all'
)
register_rule(group,
"active_checks:sql",
Dictionary(
title = _("Check SQL Database"),
help = _("This check connects to the specified database, sends a custom SQL-statement "
"or starts a procedure, and checks that the result has a defined format "
"containing three columns, a number, a text, and performance data. Upper or "
"lower levels may be defined here. If they are not defined the number is taken "
"as the state of the check. If a procedure is used, input parameters of the "
"procedures may by given as comma separated list. "
"This check uses the active check <tt>check_sql</tt>."),
optional_keys = [ "levels", "levels_low", "perfdata", "port", "procedure", "host" ],
elements = [
( "description",
TextUnicode(
title = _("Service Description"),
help = _("The name of this active service to be displayed."),
allow_empty = False,
)
),
( "dbms",
DropdownChoice(
title = _("Type of Database"),
choices = [
("mysql", _("MySQL")),
("postgres", _("PostgreSQL")),
("mssql", _("MSSQL")),
("oracle", _("Oracle")),
("db2", _("DB2")),
],
default_value = "postgres",
),
),
( "port",
Integer(
title = _("Database Port"),
help = _('The port the DBMS listens to'),
allow_empty = True,
)
),
( "name",
TextAscii(
title = _("Database Name"),
help = _('The name of the database on the DBMS'),
allow_empty = False,
)
),
( "user",
TextAscii(
title = _("Database User"),
help = _('The username used to connect to the database'),
allow_empty = False,
)
),
( "password",
IndividualOrStoredPassword(
title = _("Database Password"),
help = _('The password used to connect to the database'),
allow_empty = False,
)
),
( "sql",
Alternative(
title = _("Query or SQL statement"),
elements = [
TextAscii(
title = _("SQL statement or procedure name"),
help = _('The SQL-statement or procedure name which is executed on the DBMS. It must return '
'a result table with one row and at least two columns. The first column must be '
'an integer and is interpreted as the state (0 is OK, 1 is WARN, 2 is CRIT). '
'Alternatively the first column can be interpreted as number value and you can '
'define levels for this number. The '
'second column is used as check output. The third column is optional and can '
'contain performance data.')
),
UploadOrPasteTextFile(
title = _("Import Query"),
file_title = _("File including Query"),
default_mode = "upload",
),
],
allow_empty = False,
)
),
( "procedure",
Dictionary(
optional_keys = [ "input" ],
title = _("Use procedure call instead of SQL statement"),
help = _("If you activate this option, a name of a stored "
"procedure is used instead of an SQL statement. "
"The procedure should return one output variable, "
"which is evaluated in the check. If input parameters "
"are required, they may be specified below."),
elements = [
("useprocs",
FixedValue(
value = True,
totext = _("procedure call is used"),
)
),
("input",
TextAscii(
title = _("Input Parameters"),
allow_empty = True,
help = _("Input parameters, if required by the database procedure. "
"If several parameters are required, use commas to separate them."),
)),
]
),
),
( "levels",
Tuple(
title = _("Upper levels for first output item"),
elements = [
Float( title = _("Warning if above")),
Float( title = _("Critical if above"))
]
)
),
( "levels_low",
Tuple(
title = _("Lower levels for first output item"),
elements = [
Float( title = _("Warning if below")),
Float( title = _("Critical if below"))
]
)
),
( "perfdata",
FixedValue(
title = _("Performance Data"),
totext =_("Store output value into RRD database"),
value = True,
)
),
( "host",
TextAscii(
title = _("DNS hostname or IP address"),
help = _("This defaults to the host for which the active check is configured."),
)
),
]
),
match = 'all'
)
register_rule(group,
"active_checks:tcp",
Tuple(
title = _("Check connecting to a TCP port"),
help = _("This check tests the connection to a TCP port. It uses "
"<tt>check_tcp</tt> from the standard Nagios plugins."),
elements = [
Integer(title = _("TCP Port"), minvalue=1, maxvalue=65535),
Dictionary(
title = _("Optional parameters"),
elements = [
( "svc_description",
TextUnicode(
title = _("Service description"),
allow_empty = False,
help = _("Here you can specify a service description. "
"If this parameter is not set, the service is named <tt>TCP Port [PORT NUMBER]</tt>"))),
( "hostname",
TextAscii(
title = _("DNS Hostname"),
allow_empty = False,
help = _("If you specify a hostname here, then a dynamic DNS lookup "
"will be done instead of using the IP address of the host "
"as configured in your host properties."))),
( "response_time",
Tuple(
title = _("Expected response time"),
elements = [
Float(
title = _("Warning if above"),
unit = "ms",
default_value = 100.0),
Float(
title = _("Critical if above"),
unit = "ms",
default_value = 200.0),
])
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
( "refuse_state",
DropdownChoice(
title = _("State for connection refusal"),
choices = [ ('crit', _("CRITICAL")),
('warn', _("WARNING")),
('ok', _("OK")),
])
),
( "send_string",
TextAscii(
title = _("String to send"),
size = 30)
),
( "escape_send_string",
FixedValue(
value = True,
title = _("Expand <tt>\\n</tt>, <tt>\\r</tt> and <tt>\\t</tt> in the sent string"),
totext = _("expand escapes"))
),
( "expect",
ListOfStrings(
title = _("Strings to expect in response"),
orientation = "horizontal",
valuespec = TextAscii(size = 30),
)
),
( "expect_all",
FixedValue(
value = True,
totext = _("expect all"),
title = _("Expect <b>all</b> of those strings in the response"))
),
( "jail",
FixedValue(
value = True,
title = _("Hide response from socket"),
help = _("As soon as you configure expected strings in "
"the response the check will output the response - "
"as long as you do not hide it with this option"),
totext = _("hide response"))
),
( "mismatch_state",
DropdownChoice(
title = _("State for expected string mismatch"),
choices = [ ('crit', _("CRITICAL")),
('warn', _("WARNING")),
('ok', _("OK")),
])
),
( "delay",
Integer(
title = _("Seconds to wait before polling"),
help = _("Seconds to wait between sending string and polling for response"),
unit = _("sec"),
default_value = 0,
)
),
( "maxbytes",
Integer(
title = _("Maximum number of bytes to receive"),
help = _("Close connection once more than this number of "
"bytes are received. Per default the number of "
"read bytes is not limited. This setting is only "
"used if you expect strings in the response."),
default_value = 1024,
),
),
( "ssl",
FixedValue(
value = True,
totext = _("use SSL"),
title = _("Use SSL for the connection."))
),
( "cert_days",
Transform(
Tuple(
title = _("SSL certificate validation"),
help = _("Minimum number of days a certificate has to be valid"),
elements = [
Integer(title = _("Warning at or below"), minvalue = 0, unit = _("days")),
Integer(title = _("Critical at or below"), minvalue = 0, unit = _("days")),
],
),
forth = transform_cert_days,
),
),
( "quit_string",
TextAscii(
title = _("Final string to send"),
help = _("String to send server to initiate a clean close of "
"the connection"),
size = 30)
),
]),
]
),
match = 'all'
)
register_rule(group,
"active_checks:uniserv", Dictionary(
title = _("Check uniserv service"), optional_keys = False, elements = [
("port",
Integer(title = _("Port") )),
("service",
TextAscii(
title = _("Service Name"),
help = _("Enter the uniserve service name here (has nothing to do with service description).")
)),
("job",
CascadingDropdown(
title = _("Mode of the Check"),
help = _("Choose, whether you just want to query the version number,"
" or if you want to check the response to an address query."),
choices = [
("version", _("Check for Version")),
("address", _("Check for an Address"),
Dictionary(
title = _("Address Check mode"),
optional_keys = False,
elements = [
( "street",
TextAscii( title = _("Street name"))),
( "street_no",
Integer( title = _("Street number"))),
( "city",
TextAscii( title = _("City name"))),
( "search_regex",
TextAscii( title = _("Check City against Regex"),
help = _( "The city name from the response will be checked against "
"the regular expression specified here"),
)),
]
)),
]
)),
]))
ip_address_family_element = ("address_family",
DropdownChoice(
title = _("IP Address Family"),
choices = [
(None, _("Primary Address Family") ),
('ipv4', _("Enforce IPv4") ),
('ipv6', _("Enforce IPv6") ),
],
default_value = None
),
)
register_rule(group,
"active_checks:http",
Tuple(
title = _("Check HTTP service"),
help = _("Check HTTP/HTTPS service using the plugin <tt>check_http</tt> "
"from the standard Monitoring Plugins. "
"This plugin tests the HTTP service on the specified host. "
"It can test normal (HTTP) and secure (HTTPS) servers, follow "
"redirects, search for strings and regular expressions, check "
"connection times, and report on certificate expiration times."),
elements = [
TextUnicode(
title = _("Name"),
help = _("Will be used in the service description. If the name starts with "
"a caret (<tt>^</tt>), the service description will not be prefixed with either "
"<tt>HTTP</tt> or <tt>HTTPS</tt>." ),
allow_empty = False),
Alternative(
title = _("Mode of the Check"),
help = _("Perform a check of the URL or the certificate expiration."),
elements = [
Dictionary(
title = _("Check the URL"),
elements = [
( "virthost",
Tuple(
title = _("Virtual host"),
elements = [
TextAscii(
title = _("Name of the virtual host"),
help = _("Set this in order to specify the name of the "
"virtual host for the query (using HTTP/1.1). If you "
"leave this empty, then the IP address of the host "
"will be used instead."),
allow_empty = False
),
Checkbox(
label = _("Omit specifying an IP address"),
help = _("Usually Check_MK will nail this check to the "
"IP address of the host it is attached to. With this "
"option you can have the check use the name of the "
"virtual host instead and do a dynamic DNS lookup."),
true_label = _("omit IP address"),
false_label = _("specify IP address"),
),
]
)
),
( "uri",
TextAscii(
title = _("URI to fetch (default is <tt>/</tt>)"),
allow_empty = False,
default_value = "/"
)
),
( "port",
Integer(
title = _("TCP Port"),
minvalue = 1,
maxvalue = 65535,
default_value = 80
)
),
ip_address_family_element,
("ssl", Transform(
DropdownChoice(
title = _("Use SSL/HTTPS for the connection"),
choices = [
("auto", _("Use SSL with auto negotiation")),
("1.2", _("Use SSL, enforce TLSv1.2")),
("1.1", _("Use SSL, enforce TLSv1.1")),
("1", _("Use SSL, enforce TLSv1")),
("2", _("Use SSL, enforce SSLv2")),
("3", _("Use SSL, enforce SSLv3")),
],
default_value = "auto",
),
forth = lambda x: x == True and "auto" or x,
)),
( "sni",
FixedValue(
value = True,
totext = _("enable SNI"),
title = _("Enable SSL/TLS hostname extension support (SNI)"),
)
),
( "response_time",
Tuple(
title = _("Expected response time"),
elements = [
Float(
title = _("Warning if above"),
unit = "ms",
default_value = 100.0
),
Float(
title = _("Critical if above"),
unit = "ms",
default_value = 200.0
),
]
)
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
( "user_agent",
TextAscii(
title = _("User Agent"),
help = _("String to be sent in http header as \"User Agent\""),
allow_empty = False,
),
),
( "add_headers",
ListOfStrings(
title = _("Additional header lines"),
orientation = "vertical",
valuespec = TextAscii(size = 40),
),
),
( "auth",
Tuple(
title = _("Authorization"),
help = _("Credentials for HTTP Basic Authentication"),
elements = [
TextAscii(
title = _("Username"),
size = 12,
allow_empty = False
),
IndividualOrStoredPassword(
title = _("Password"),
)
]
)
),
( "proxy",
TextAscii(
title = _("Proxy host"),
help = _("To use a proxy you have to use the Port of the proxy, "
"specify the virtual host and the URL to fetch, "
"use the HTTP Method CONNECT, and use SSL/HTTPS "
"for the connection")
),
),
( "proxy_auth",
Tuple(
title = _("Proxy-Authorization"),
help = _("Credentials for HTTP Proxy with basic authentication"),
elements = [
TextAscii(
title = _("Username"),
size = 12,
allow_empty = False
),
IndividualOrStoredPassword(
title = _("Password"),
),
]
)
),
( "onredirect",
DropdownChoice(
title = _("How to handle redirect"),
choices = [
( 'ok', _("Make check OK") ),
( 'warning', _("Make check WARNING") ),
( 'critical', _("Make check CRITICAL") ),
( 'follow', _("Follow the redirection") ),
( 'sticky', _("Follow, but stay to same IP address") ),
( 'stickyport', _("Follow, but stay to same IP-address and port") ),
],
default_value = 'follow'
),
),
( "expect_response_header",
TextAscii(
title = _("String to expect in response headers"),
)
),
( "expect_response",
ListOfStrings(
title = _("Strings to expect in server response"),
help = _("At least one of these strings is expected in "
"the first (status) line of the server response "
"(default: <tt>HTTP/1.</tt>). If specified skips "
"all other status line logic (ex: 3xx, 4xx, 5xx "
"processing)"),
)
),
( "expect_string",
TextUnicode(
title = _("Fixed string to expect in the content"),
allow_empty = False,
)
),
( "expect_regex",
Transform(
Tuple(
orientation = "vertical",
show_titles = False,
elements = [
RegExp(
label = _("Regular expression: "),
mode = RegExp.infix,
),
Checkbox(label = _("Case insensitive")),
Checkbox(label = _("return CRITICAL if found, OK if not")),
Checkbox(label = _("Multiline string matching")),
]
),
forth = lambda x: len(x) == 3 and tuple(list(x) + [False]) or x,
title = _("Regular expression to expect in content"),
),
),
( "post_data",
Tuple(
title = _("Send HTTP POST data"),
elements = [
TextUnicode(
title = _("HTTP POST data"),
help = _("Data to send via HTTP POST method. "
"Please make sure, that the data is URL-encoded."),
size = 40,
),
TextAscii(
title = _("Content-Type"),
default_value = "text/html"),
]
)
),
( "method",
DropdownChoice(
title = _("HTTP Method"),
default_value = "GET",
choices = [
( "GET", "GET" ),
( "POST", "POST" ),
( "OPTIONS", "OPTIONS" ),
( "TRACE", "TRACE" ),
( "PUT", "PUT" ),
( "DELETE", "DELETE" ),
( "HEAD", "HEAD" ),
( "CONNECT", "CONNECT" ),
( "PROPFIND", "PROPFIND" ),
]
)
),
( "no_body",
FixedValue(
value = True,
title = _("Don't wait for document body"),
help = _("Note: this still does an HTTP GET or POST, not a HEAD."),
totext = _("don't wait for body")
)
),
( "page_size",
Tuple(
title = _("Page size to expect"),
elements = [
Integer(title = _("Minimum"), unit=_("Bytes")),
Integer(title = _("Maximum"), unit=_("Bytes")),
]
)
),
( "max_age",
Age(
title = _("Maximum age"),
help = _("Warn, if the age of the page is older than this"),
default_value = 3600 * 24,
)
),
( "urlize",
FixedValue(
value = True,
title = _("Clickable URLs"),
totext = _("Format check output as hyperlink"),
help = _("With this option the check produces an output that is a valid hyperlink "
"to the checked URL and this clickable."),
)
),
("extended_perfdata", FixedValue(
value = True,
totext = _("Extended perfdata"),
title = _("Record additional performance data"),
help = _("This option makes the HTTP check produce more detailed performance data values "
"like the connect time, header time, time till first byte received and the "
"transfer time."),
)),
( "verbose", FixedValue(
value=True,
title=_("Verbose output"),
totext=_("Give verbose output"),
)),
]
),
Dictionary(
title = _("Check SSL Certificate Age"),
elements = [
( "cert_days",
Transform(
Tuple(
title = _("Age"),
help = _("Minimum number of days a certificate has to be valid. "
"Port defaults to 443. When this option is used the URL "
"is not checked."),
elements = [
Integer(title = _("Warning at or below"), minvalue = 0, unit = _("days")),
Integer(title = _("Critical at or below"), minvalue = 0, unit = _("days")),
],
),
forth = transform_cert_days,
),
),
( "cert_host",
TextAscii(
title = _("Check Certificate of different IP / DNS Name"),
help = _("For each SSL certificate on a host, a different IP address is needed. "
"Here, you can specify the address if it differs from the "
"address from the host primary address."),
),
),
( "port",
Integer(
title = _("TCP Port"),
minvalue = 1,
maxvalue = 65535,
default_value = 443,
),
),
ip_address_family_element,
( "sni",
FixedValue(
value = True,
totext = _("enable SNI"),
title = _("Enable SSL/TLS hostname extension support (SNI)"),
),
),
( "proxy",
TextAscii(
title = _("Proxy host"),
help = _("To use a proxy you have to specify the Port of the proxy. ")
),
),
( "proxy_auth",
Tuple(
title = _("Proxy-Authorization"),
help = _("Credentials for HTTP Proxy with basic authentication"),
elements = [
TextAscii(
title = _("Username"),
size = 12,
allow_empty = False
),
IndividualOrStoredPassword(
title = _("Password"),
),
]
)
),
],
required_keys = [ "cert_days" ],
),
]
),
]
),
match = 'all'
)
register_rule(group,
"active_checks:ldap",
Tuple(
title = _("Check access to LDAP service"),
help = _("This check uses <tt>check_ldap</tt> from the standard "
"Nagios plugins in order to try the response of an LDAP "
"server."),
elements = [
TextUnicode(
title = _("Name"),
help = _("The service description will be <b>LDAP</b> plus this name. If the name starts with "
"a caret (<tt>^</tt>), the service description will not be prefixed with <tt>LDAP</tt>." ),
allow_empty = False),
TextAscii(
title = _("Base DN"),
help = _("LDAP base, e.g. ou=Development, o=Mathias Kettner GmbH, c=de"),
allow_empty = False,
size = 60),
Dictionary(
title = _("Optional parameters"),
elements = [
( "attribute",
TextAscii(
title = _("Attribute to search"),
help = _("LDAP attribute to search, "
"The default is <tt>(objectclass=*)</tt>."),
size = 40,
allow_empty = False,
default_value = "(objectclass=*)",
)
),
( "authentication",
Tuple(
title = _("Authentication"),
elements = [
TextAscii(
title = _("Bind DN"),
help = _("Distinguished name for binding"),
allow_empty = False,
size = 60,
),
IndividualOrStoredPassword(
title = _("Password"),
help = _("Password for binding, if your server requires an authentication"),
allow_empty = False,
)
]
)
),
( "port",
Integer(
title = _("TCP Port"),
help = _("Default is 389 for normal connections and 636 for SSL connections."),
minvalue = 1,
maxvalue = 65535,
default_value = 389)
),
( "ssl",
FixedValue(
value = True,
totext = _("Use SSL"),
title = _("Use LDAPS (SSL)"),
help = _("Use LDAPS (LDAP SSLv2 method). This sets the default port number to 636"))
),
( "hostname",
TextAscii(
title = _("Alternative Hostname"),
help = _("Use a alternative field as Hostname in case of SSL Certificate Problems (eg. the Hostalias )"),
size = 40,
allow_empty = False,
default_value = "$HOSTALIAS$",
)
),
( "version",
DropdownChoice(
title = _("LDAP Version"),
help = _("The default is to use version 2"),
choices = [
( "v2", _("Version 2") ),
( "v3", _("Version 3") ),
( "v3tls", _("Version 3 and TLS") ),
],
default_value = "v2",
)
),
( "response_time",
Tuple(
title = _("Expected response time"),
elements = [
Float(
title = _("Warning if above"),
unit = "ms",
default_value = 1000.0),
Float(
title = _("Critical if above"),
unit = "ms",
default_value = 2000.0),
])
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
])
]),
match = 'all'
)
def transform_smtp_address_family(val):
if "ip_version" in val:
val["address_family"] = val.pop("ip_version")
return val
register_rule(group,
"active_checks:smtp",
Tuple(
title = _("Check access to SMTP services"),
help = _("This check uses <tt>check_smtp</tt> from the standard "
"Nagios plugins in order to try the response of an SMTP "
"server."),
elements = [
TextUnicode(
title = _("Name"),
help = _("The service description will be <b>SMTP</b> plus this name. If the name starts with "
"a caret (<tt>^</tt>), the service description will not be prefixed with <tt>SMTP</tt>." ),
allow_empty = False),
Transform(
Dictionary(
title = _("Optional parameters"),
elements = [
( "hostname",
TextAscii(
title = _("DNS Hostname or IP address"),
allow_empty = False,
help = _("You can specify a hostname or IP address different from the IP address "
"of the host as configured in your host properties."))),
( "port",
Transform(
Integer(
title = _("TCP Port to connect to"),
help = _("The TCP Port the SMTP server is listening on. "
"The default is <tt>25</tt>."),
size = 5,
minvalue = 1,
maxvalue = 65535,
default_value = "25",
),
forth = int,
)
),
ip_address_family_element,
( "expect",
TextAscii(
title = _("Expected String"),
help = _("String to expect in first line of server response. "
"The default is <tt>220</tt>."),
size = 8,
allow_empty = False,
default_value = "220",
)
),
('commands',
ListOfStrings(
title = _("SMTP Commands"),
help = _("SMTP commands to execute."),
)
),
('command_responses',
ListOfStrings(
title = _("SMTP Responses"),
help = _("Expected responses to the given SMTP commands."),
)
),
("from",
TextAscii(
title = _("FROM-Address"),
help = _("FROM-address to include in MAIL command, required by Exchange 2000"),
size = 20,
allow_empty = True,
default_value = "",
)
),
("fqdn",
TextAscii(
title = _("FQDN"),
help = _("FQDN used for HELO"),
size = 20,
allow_empty = True,
default_value = "",
)
),
( "cert_days",
Transform(
Tuple(
title = _("Minimum Certificate Age"),
help = _("Minimum number of days a certificate has to be valid"),
elements = [
Integer(title = _("Warning at or below"), minvalue = 0, unit = _("days")),
Integer(title = _("Critical at or below"), minvalue = 0, unit = _("days")),
],
),
forth = transform_cert_days,
)),
("starttls",
FixedValue(
True,
totext = _("STARTTLS enabled."),
title = _("Use STARTTLS for the connection.")
)
),
( "auth",
Tuple(
title = _("Enable SMTP AUTH (LOGIN)"),
help = _("SMTP AUTH type to check (default none, only LOGIN supported)"),
elements = [
TextAscii(
title = _("Username"),
size = 12,
allow_empty = False),
Password(
title = _("Password"),
size = 12,
allow_empty = False),
]
)
),
("response_time",
Tuple(
title = _("Expected response time"),
elements = [
Integer(
title = _("Warning if above"),
unit = _("sec")
),
Integer(
title = _("Critical if above"),
unit = _("sec")
),
])
),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
]
),
forth=transform_smtp_address_family,
)
]
),
match = 'all'
)
register_rule(group,
"active_checks:disk_smb",
Dictionary(
title = _("Check access to SMB share"),
help = _("This ruleset helps you to configure the classical Nagios "
"plugin <tt>check_disk_smb</tt> that checks the access to "
"filesystem shares that are exported via SMB/CIFS."),
elements = [
( "share",
TextUnicode(
title = _("SMB share to check"),
help = _("Enter the plain name of the share only, e. g. <tt>iso</tt>, <b>not</b> "
"the full UNC like <tt>\\\\servername\\iso</tt>"),
size = 32,
allow_empty = False,
)),
( "workgroup",
TextUnicode(
title = _("Workgroup"),
help = _("Workgroup or domain used (defaults to <tt>WORKGROUP</tt>)"),
size = 32,
allow_empty = False,
)),
( "host",
TextAscii(
title = _("NetBIOS name of the server"),
help = _("If omitted then the IP address is being used."),
size = 32,
allow_empty = False,
)),
( "port",
Integer(
title = _("TCP Port"),
help = _("TCP port number to connect to. Usually either 139 or 445."),
default_value = 445,
minvalue = 1,
maxvalue = 65535,
)),
( "levels",
Tuple(
title = _("Levels for used disk space"),
elements = [
Percentage(title = _("Warning if above"), default_value = 85, allow_int = True),
Percentage(title = _("Critical if above"), default_value = 95, allow_int = True),
]
)),
( "auth",
Tuple(
title = _("Authorization"),
elements = [
TextAscii(
title = _("Username"),
allow_empty = False,
size = 24),
Password(
title = _("Password"),
allow_empty = False,
size = 12),
],
)),
],
required_keys = [ "share", "levels" ],
),
match = 'all'
)
def PluginCommandLine():
return TextAscii(
title = _("Command line"),
help = _("Please enter the complete shell command including path name and arguments to execute. "
"If the plugin you like to execute is located in either <tt>~/local/lib/nagios/plugins</tt> "
"or <tt>~/lib/nagios/plugins</tt> within your site directory, you can strip the path name and "
"just configure the plugin file name as command <tt>check_foobar</tt>.") + monitoring_macro_help(),
size = "max",
validate = validate_custom_check_command_line,
)
def validate_custom_check_command_line(value, varprefix):
if "--pwstore=" in value:
raise MKUserError(varprefix, _("You are not allowed to use passwords from the password store here."))
register_rule(group,
"custom_checks",
Dictionary(
title = _("Classical active and passive Monitoring checks"),
help = _("With this ruleset you can configure &quot;classical Monitoring checks&quot; "
"to be executed directly on your monitoring server. These checks "
"will not use Check_MK. It is also possible to configure passive "
"checks that are fed with data from external sources via the "
"command pipe of the monitoring core."),
elements = [
( "service_description",
TextUnicode(
title = _("Service description"),
help = _("Please make sure that this is unique per host "
"and does not collide with other services."),
allow_empty = False,
default_value = _("Customcheck"))
),
( "command_line",
PluginCommandLine(),
),
( "command_name",
TextAscii(
title = _("Internal command name"),
help = _("If you want, you can specify a name that will be used "
"in the <tt>define command</tt> section for these checks. This "
"allows you to a assign a custom PNP template for the performance "
"data of the checks. If you omit this, then <tt>check-mk-custom</tt> "
"will be used."),
size = 32)
),
( "has_perfdata",
FixedValue(
title = _("Performance data"),
value = True,
totext = _("process performance data"),
)
),
( "freshness",
Dictionary(
title = _("Check freshness"),
help = _("Freshness checking is only useful for passive checks when the staleness feature "
"is not enough for you. It changes the state of a check to a configurable other state "
"when the check results are not arriving in time. Staleness will still grey out the "
"test after the corrsponding interval. If you don't want that, you might want to adjust "
"the staleness interval as well. The staleness interval is calculated from the normal "
"check interval multiplied by the staleness value in the <tt>Global Settings</tt>. "
"The normal check interval can be configured in a separate rule for your check."),
optional_keys = False,
elements = [
( "interval",
Integer(
title = _("Expected update interval"),
label = _("Updates are expected at least every"),
unit = _("minutes"),
minvalue = 1,
default_value = 10,
)),
( "state",
DropdownChoice(
title = _("State in case of absent updates"),
choices = [
( 1, _("WARN") ),
( 2, _("CRIT") ),
( 3, _("UNKNOWN") ),
],
default_value = 3,
)),
( "output",
TextUnicode(
title = _("Plugin output in case of absent updates"),
size = 40,
allow_empty = False,
default_value = _("Check result did not arrive in time")
)),
],
)
),
],
required_keys = [ "service_description" ],
),
match = 'all'
)
register_rule(group,
"active_checks:bi_aggr",
Tuple(
title = _("Check State of BI Aggregation"),
help = _("Connect to the local or a remote monitoring host, which uses Check_MK BI to aggregate "
"several states to a single BI aggregation, which you want to show up as a single "
"service."),
elements = [
TextAscii(
title = _("Base URL (OMD Site)"),
help = _("The base URL to the monitoring instance. For example <tt>http://mycheckmk01/mysite</tt>. "
"You can use macros like <tt>$HOSTADDRESS$</tt> and <tt>$HOSTNAME$</tt> within this URL to "
"make them be replaced by the hosts values."),
size = 60,
allow_empty = False
),
TextAscii(
title = _("Aggregation Name"),
help = _("The name of the aggregation to fetch. It will be added to the service description. You can "
"use macros like <tt>$HOSTADDRESS$</tt> and <tt>$HOSTNAME$</tt> within this parameter to "
"make them be replaced by the hosts values. The aggregation name is the title in the "
"top-level-rule of your BI pack."),
allow_empty = False
),
TextAscii(
title = _("Username"),
help = _("The name of the user account to use for fetching the BI aggregation via HTTP. When "
"using the cookie based authentication mode (default), this must be a user where "
"authentication is set to \"Automation Secret\" based authentication."),
allow_empty = False
),
IndividualOrStoredPassword(
title = _("Password / Secret"),
help = _("Valid automation secret or password for the user, depending on the chosen "
"authentication mode. Be aware that this mode has to be enabled on the monitoring instance. " "Otherwise authentication will fail."),
allow_empty = False
),
Dictionary(
title = _("Optional parameters"),
elements = [
("auth_mode", DropdownChoice(
title = _('Authentication Mode'),
default_value = 'cookie',
choices = [
('cookie', _('Form (Cookie) based')),
('basic', _('HTTP Basic')),
('digest', _('HTTP Digest')),
('kerberos', _('Kerberos')),
],
)),
("timeout", Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 60,
)),
("in_downtime",
RadioChoice(
title = _("State, if BI aggregate is in scheduled downtime"),
orientation = "vertical",
choices = [
( None, _("Use normal state, ignore downtime") ),
( "ok", _("Force to be OK") ),
( "warn", _("Force to be WARN, if aggregate is not OK") ),
]
)),
("acknowledged",
RadioChoice(
title = _("State, if BI aggregate is acknowledged"),
orientation = "vertical",
choices = [
( None, _("Use normal state, ignore acknowledgement") ),
( "ok", _("Force to be OK") ),
( "warn", _("Force to be WARN, if aggregate is not OK") ),
]
)),
("track_downtimes",
Checkbox(
title = _("Track downtimes"),
label = _("Automatically track downtimes of aggregation"),
help = _("If this is active, the check will automatically go into downtime "
"whenever the aggregation does. This downtime is also cleaned up "
"automatically when the aggregation leaves downtime. "
"Downtimes you set manually for this check are unaffected."),
)),
]
),
]
),
match = 'all'
)
register_rule(group,
"active_checks:form_submit",
Tuple(
title = _("Check HTML Form Submit"),
help = _("Check submission of HTML forms via HTTP/HTTPS using the plugin <tt>check_form_submit</tt> "
"provided with Check_MK. This plugin provides more functionality as <tt>check_http</tt>, "
"as it automatically follows HTTP redirect, accepts and uses cookies, parses forms "
"from the requested pages, changes vars and submits them to check the response "
"afterwards."),
elements = [
TextUnicode(
title = _("Name"),
help = _("The name will be used in the service description"),
allow_empty = False
),
Dictionary(
title = _("Check the URL"),
elements = [
("hosts", ListOfStrings(
title = _('Check specific host(s)'),
help = _('By default, if you do not specify any host addresses here, '
'the host address of the host this service is assigned to will '
'be used. But by specifying one or several host addresses here, '
'it is possible to let the check monitor one or multiple hosts.')
)),
("virthost", TextAscii(
title = _("Virtual host"),
help = _("Set this in order to specify the name of the "
"virtual host for the query (using HTTP/1.1). When you "
"leave this empty, then the IP address of the host "
"will be used instead."),
allow_empty = False,
)),
("uri", TextAscii(
title = _("URI to fetch (default is <tt>/</tt>)"),
allow_empty = False,
default_value = "/",
regex = '^/.*',
)),
("port", Integer(
title = _("TCP Port"),
minvalue = 1,
maxvalue = 65535,
default_value = 80,
)),
("ssl", FixedValue(
value = True,
totext = _("use SSL/HTTPS"),
title = _("Use SSL/HTTPS for the connection."))
),
("timeout", Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)),
("expect_regex", RegExp(
title = _("Regular expression to expect in content"),
mode = RegExp.infix,
)),
("form_name", TextAscii(
title = _("Name of the form to populate and submit"),
help = _("If there is only one form element on the requested page, you "
"do not need to provide the name of that form here. But if you "
"have several forms on that page, you need to provide the name "
"of the form here, to enable the check to identify the correct "
"form element."),
allow_empty = True,
)),
("query", TextAscii(
title = _("Send HTTP POST data"),
help = _("Data to send via HTTP POST method. Please make sure, that the data "
"is URL-encoded (for example \"key1=val1&key2=val2\")."),
size = 40,
)),
("num_succeeded", Tuple(
title = _("Multiple Hosts: Number of successful results"),
elements = [
Integer(title = _("Warning if equal or below")),
Integer(title = _("Critical if equal or below")),
]
)),
]
),
]
),
match = 'all'
)
register_rule(group,
"active_checks:notify_count",
Tuple(
title = _("Check Number of Notifications per Contact"),
help = _("Check the number of sent notifications per contact using the plugin <tt>check_notify_count</tt> "
"provided with Check_MK. This plugin counts the total number of notifications sent by the local "
"monitoring core and creates graphs for each individual contact. You can configure thresholds "
"on the number of notifications per contact in a defined time interval. "
"This plugin queries livestatus to extract the notification related log entries from the "
"log file of your monitoring core."),
elements = [
TextUnicode(
title = _("Service Description"),
help = _("The name that will be used in the service description"),
allow_empty = False
),
Integer(
title = _("Interval to monitor"),
label = _("notifications within last"),
unit = _("minutes"),
minvalue = 1,
default_value = 60,
),
Dictionary(
title = _("Optional parameters"),
elements = [
("num_per_contact", Tuple(
title = _("Thresholds for Notifications per Contact"),
elements = [
Integer(title = _("Warning if above"), default_value = 20),
Integer(title = _("Critical if above"), default_value = 50),
]
)),
]
),
]
),
match = 'all'
)
register_rule(group,
"active_checks:traceroute",
Dictionary(
title = _("Check current routing (uses <tt>traceroute</tt>)"),
help = _("This active check uses <tt>traceroute</tt> in order to determine the current "
"routing from the monitoring host to the target host. You can specify any number "
"of missing or expected routes in that way detect e.g. an (unintended) failover "
"to a secondary route."),
elements = [
( "dns",
Checkbox(
title = _("Name resolution"),
label = _("Use DNS to convert IP addresses into hostnames"),
help = _("If you use this option, then <tt>traceroute</tt> is <b>not</b> being "
"called with the option <tt>-n</tt>. That means that all IP addresses "
"are tried to be converted into names. This usually adds additional "
"execution time. Also DNS resolution might fail for some addresses."),
)),
( "routers",
ListOf(
Tuple(
elements = [
TextAscii(
title = _("Router (FQDN, IP-Address)"),
allow_empty = False,
),
DropdownChoice(
title = _("How"),
choices = [
( 'W', _("WARN - if this router is not being used") ),
( 'C', _("CRIT - if this router is not being used") ),
( 'w', _("WARN - if this router is being used") ),
( 'c', _("CRIT - if this router is being used") ),
]
),
]
),
title = _("Router that must or must not be used"),
add_label = _("Add Condition"),
)
),
( "method",
DropdownChoice(
title = _("Method of probing"),
choices = [
( None, _("UDP (default behaviour of tcpdump)") ),
( "icmp", _("ICMP Echo Request") ),
( "tcp", _("TCP SYN") ),
]
)
),
],
optional_keys = False,
),
match = 'all'
)
register_rule(group,
'active_checks:mail_loop',
Dictionary(
title = _('Check Email Delivery'),
help = _('This active check sends out special E-Mails to a defined mail address using '
'the SMTP protocol and then tries to receive these mails back by querying the '
'inbox of a IMAP or POP3 mailbox. With this check you can verify that your whole '
'mail delivery progress is working.'),
optional_keys = ['subject', 'smtp_server', 'smtp_tls', 'smtp_port', 'smtp_auth', 'imap_tls', 'connect_timeout', 'delete_messages', 'duration'],
elements = [
('item', TextUnicode(
title = _('Name'),
help = _('The service description will be <b>Mail Loop</b> plus this name'),
allow_empty = False
)),
('subject', TextAscii(
title = _('Subject'),
allow_empty = False,
help = _('Here you can specify the subject text '
'instead of default text \'Check_MK-Mail-Loop\'.'),
)),
('smtp_server', TextAscii(
title = _('SMTP Server'),
allow_empty = False,
help = _('You can specify a hostname or IP address different from the IP address '
'of the host this check will be assigned to.')
)),
('smtp_tls', FixedValue(True,
title = _('Use TLS over SMTP'),
totext = _('Encrypt SMTP communication using TLS'),
)),
('imap_tls', FixedValue(True,
title = _('Use TLS for IMAP authentification'),
totext = _('IMAP authentification uses TLS'),
)),
('smtp_port', Integer(
title = _('SMTP TCP Port to connect to'),
help = _('The TCP Port the SMTP server is listening on. Defaulting to <tt>25</tt>.'),
allow_empty = False,
default_value = 25,
)),
('smtp_auth', Tuple(
title = _('SMTP Authentication'),
elements = [
TextAscii(
title = _('Username'),
allow_empty = False,
size = 24
),
IndividualOrStoredPassword(
title = _('Password'),
allow_empty = False,
size = 12
),
],
)),
] + mail_receiving_params + [
('mail_from', EmailAddress(
title = _('From: email address'),
)),
('mail_to', EmailAddress(
title = _('Destination email address'),
)),
('connect_timeout', Integer(
title = _('Connect Timeout'),
minvalue = 1,
default_value = 10,
unit = _('sec'),
)),
("duration", Tuple(
title = _("Loop duration"),
elements = [
Age(title = _("Warning at")),
Age(title = _("Critical at")),
])
),
('delete_messages', FixedValue(True,
title = _('Delete processed messages'),
totext = _('Delete all processed message belonging to this check'),
help = _('Delete all messages identified as being related to this '
'check. This is disabled by default, which will make '
'your mailbox grow when you not clean it up on your own.'),
)),
]
),
match = 'all'
)
register_rule(group,
'active_checks:mail',
Dictionary(
title = _('Check Email'),
help = _('The basic function of this check is to log in into an IMAP or POP3 mailbox to '
'monitor whether or not the login is possible. A extended feature is, that the '
'check can fetch all (or just some) from the mailbox and forward them as events '
'to the Event Console.'),
required_keys = [ 'service_description', 'fetch' ],
elements = [
('service_description',
TextUnicode(
title = _('Service description'),
help = _('Please make sure that this is unique per host '
'and does not collide with other services.'),
allow_empty = False,
default_value = "Email")
)
] + mail_receiving_params + [
('connect_timeout', Integer(
title = _('Connect Timeout'),
minvalue = 1,
default_value = 10,
unit = _('sec'),
)),
('forward', Dictionary(
title = _("Forward mails as events to Event Console"),
elements = [
('method', Alternative(
title = _("Forwarding Method"),
elements = [
Alternative(
title = _("Send events to local event console"),
elements = [
FixedValue(
"",
totext = _("Directly forward to event console"),
title = _("Send events to local event console in same OMD site"),
),
TextAscii(
title = _("Send events to local event console into unix socket"),
allow_empty = False,
),
FixedValue(
"spool:",
totext = _("Spool to event console"),
title = _("Spooling: Send events to local event console in same OMD site"),
),
Transform(
TextAscii(),
title = _("Spooling: Send events to local event console into given spool directory"),
allow_empty = False,
forth = lambda x: x[6:], # remove prefix
back = lambda x: "spool:" + x, # add prefix
),
],
match = lambda x: x and (x == 'spool:' and 2 or x.startswith('spool:') and 3 or 1) or 0
),
Tuple(
title = _("Send events to remote syslog host"),
elements = [
DropdownChoice(
choices = [
('udp', _('UDP')),
('tcp', _('TCP')),
],
title = _("Protocol"),
),
TextAscii(
title = _("Address"),
allow_empty = False,
),
Integer(
title = _("Port"),
allow_empty = False,
default_value = 514,
minvalue = 1,
maxvalue = 65535,
size = 6,
),
]
),
],
)),
('match_subject', RegExpUnicode(
title = _('Only process mails with matching subject'),
help = _('Use this option to not process all messages found in the inbox, '
'but only the those whose subject matches the given regular expression.'),
mode = RegExp.prefix,
)),
('facility', DropdownChoice(
title = _("Events: Syslog facility"),
help = _("Use this syslog facility for all created events"),
choices = syslog_facilities,
default_value = 2, # mail
)),
('application', Alternative(
title = _("Events: Syslog application"),
help = _("Use this syslog application for all created events"),
elements = [
FixedValue(None,
title = _("Use the mail subject"),
totext = _("The mail subject is used as syslog appliaction"),
),
TextUnicode(
title = _("Specify the application"),
help = _("Use this text as application. You can use macros like <tt>\\1</tt>, <tt>\\2</tt>, ... "
"here when you configured <i>subject matching</i> in this rule with a regular expression "
"that declares match groups (using braces)."),
allow_empty = False,
),
]
)),
('host', TextAscii(
title = _('Events: Hostname'),
help = _('Use this hostname for all created events instead of the name of the mailserver'),
)),
('body_limit', Integer(
title = _('Limit length of mail body'),
help = _('When forwarding mails from the mailbox to the event console, the '
'body of the mail is limited to the given number of characters.'),
default_value = 1000,
)),
('cleanup', Alternative(
title = _("Cleanup messages"),
help = _("The handled messages (see <i>subject matching</i>) can be cleaned up by either "
"deleting them or moving them to a subfolder. By default nothing is cleaned up."),
elements = [
FixedValue(True,
title = _('Delete messages'),
totext = _('Delete all processed message belonging to this check'),
),
TextUnicode(
title = _("Move to subfolder"),
help = _("Specify the destination path in the format <tt>Path/To/Folder</tt>, for example"
"<tt>INBOX/Processed_Mails</tt>."),
allow_empty = False,
),
]
)),
]
)),
]
),
match = 'all'
)
register_rule(group,
'active_checks:mailboxes',
Dictionary(
title = _('Check IMAP Mailboxes'),
help = _('This check monitors count and age of mails in mailboxes.'),
elements = [
('service_description',
TextUnicode(
title = _('Service description'),
help = _('Please make sure that this is unique per host '
'and does not collide with other services.'),
allow_empty = False,
default_value = "Mailboxes")
),
('imap_parameters', imap_parameters),
('connect_timeout', Integer(
title = _('Connect Timeout'),
minvalue = 1,
default_value = 10,
unit = _('sec'),
)),
('age', Tuple(
title = _("Message Age"),
elements = [
Age(title = _("Warning at")),
Age(title = _("Critical at"))
])),
('count', Tuple(
title = _("Message Count"),
elements = [
Integer(title = _("Warning at")),
Integer(title = _("Critical at"))
])),
('mailboxes', ListOfStrings(
title = _('Check only the listed mailboxes'),
help = _('By default, all mailboxes are checked with these parameters. '
'If you specify mailboxes here, only those are monitored.')
))
],
required_keys = [ 'service_description', 'imap_parameters' ]
),
match = 'all'
)
register_rule(group,
"active_checks:by_ssh",
Tuple(
title = _("Check via SSH service"),
help = _("Checks via SSH. "),
elements = [
TextAscii(
title = _("Command"),
help = _("Command to execute on remote host."),
allow_empty = False,
),
Dictionary(
title = _("Optional parameters"),
elements = [
( "description",
TextAscii(
title = _("Service Description"),
help = _("Must be unique for every host. Defaults to command that is executed."),
size = 30)
),
( "hostname",
TextAscii(
title = _("DNS Hostname or IP address"),
default_value = "$HOSTADDRESS$",
allow_empty = False,
help = _("You can specify a hostname or IP address different from IP address "
"of the host as configured in your host properties."))),
( 'port',
Integer(
title = _("SSH Port"),
help = _("Default is 22."),
minvalue = 1,
maxvalue = 65535,
default_value = 22)),
( "ip_version",
Alternative(
title = _("IP-Version"),
elements = [
FixedValue(
"ipv4",
totext = "",
title = _("IPv4")
),
FixedValue(
"ipv6",
totext = "",
title = _("IPv6")
),
],
)),
( "timeout",
Integer(
title = _("Seconds before connection times out"),
unit = _("sec"),
default_value = 10,
)
),
( "logname",
TextAscii(
title = _("Username"),
help = _("SSH user name on remote host"),
size = 30)
),
( "identity",
TextAscii(
title = _("Keyfile"),
help = _("Identity of an authorized key"),
size = 30)
),
]
)
]
),
match = 'all'
)