Deprecated: this howto works for CheckMK v1.x – For CheckMK v2 you can find a howto here
Download mkp-File: check_rtmp-0.2.zip
Active Check Script
- should return the few different states – 0, 1, 2, 3 for OK, WARN, CRIT, UNKOWN
- must be placed in ~/local/lib/nagios/plugins
The Check_MK Plugin
- like always must be placed in ~/local/share/check_mk/checks
- and the WATO configuration in ~/local/share/check_mk/web/plugins/wato
Example Script – A Check for RTMP-Streams
This check will have a small speciality – we will have to use an extra library to be able to check if the given RTMP-stream is online. Unfortunately I haven’t found a really trustable source for a librtmp-RPM. So first we will have to build the prerequisites for Centos 7 – librtmp. This is normally not recommended and checks should not use any extra libraries – but in this case it’s not possible without this extra library.
Build librtmp for Centos 7
python-librtmp is provided by pip – but as mentioned it will need librtmp first. An easy howto can be found here http://blog.svnlabs.com/install-rtmpdump-in-centos/
TLDR: You need to download the latest rtmpdump-sources from https://rtmpdump.mplayerhq.hu/download and untar them and change to rtmp’s directory. Before we run ‚make‘ and ‚make install‘, we need to install libffi and openssl-devel:
yum install libffi yum install openssl-devel
now run ‚make‘ and afterwards ‚make install‘ if there were no errors. Now we can install python-librtmp via pip
yum install python-pip
optionally you can upgrade pip:
pip install --upgrade pip
then we execute
pip install python-librtmp
librtmp files will be found in /usr/local/lib
NOTE: a check_mk-site needs the librtmp.so.0 in ~/local/lib – for scripting as another user, you’ll have to set LD_LIBRARY_PATH (e.g. export LD_LIBRARY_PATH=/usr/local/lib)
Special-NOTE
this can be handy for testing – place those few lines at the beginning while scripting as non-Check_MK user – Later it will not work or you have to change this a little because a Check_MK-site set’s its own LD_LIBRARY_PATH for the scripts!
#!/usr/bin/env python
import os, sys
if 'LD_LIBRARY_PATH' not in os.environ:
os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib'
try:
os.execv(sys.argv[0], sys.argv)
except Exception, exc:
print 'Failed re-exec:', exc
sys.exit(1)
#
print 'Success:', os.environ['LD_LIBRARY_PATH']
import librtmp
Found at http://stackoverflow.com/questions/6543847/setting-ld-library-path-from-inside-python
The active check itself – check_rtmp
Place the active check in ~/local/lib/nagios/plugins and make it executable
not much to say about this script – it will just have the exit codes 0,2 and 3 – See NOTE above – the librtmp.so.0 must be placed in the site’s ~/local/lib folder, else Check_MK won’t be able to find the library
#!/usr/bin/env python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# Check_MK Check RTMP
#
# Copyright 2016, Clemens Steinkogler <c.steinkogler[at]cashpoint.com>
#
# This program 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, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, sys, getopt, librtmp
def usage():
sys.stderr.write(
"""
Check_MK RTMP Test
USAGE: check_rtmp [OPTIONS] RTMP-URL
check_rtmp -h
ARGUMENTS:
RTMP-URL Valid RTMP URL e.g. rtmp://some.domain.com/foobar.stream
OPTIONS:
-h, --help Show this help message and exit
-t INTEGER, --timeout INTEGER Timeout for trying to connect in seconds (default: 30)
-l BOOL, --live BOOL Set to False if not a livestream (default: True)
-v, --verbose Verbose mode: print more info
""")
short_options = 'ht:t:l:v'
long_options = ['help', 'timeout=', 'live=', 'verbose' ]
try:
opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
except getopt.GetoptError, e:
sys.stderr.write("UNKOWN - Error in command options: %s\n" % e)
sys.exit(3)
opt_verbose = False
opt_timeout = 30
opt_live = True
try:
for option, argument in opts:
if option in [ '-v', '--verbose' ]:
opt_verbose = True
elif option in [ '-t', '--timeout' ]:
opt_timeout = argument
elif option in [ '-l', '--live' ]:
opt_live = argument.title()
elif option in [ '-h', '--help']:
usage()
sys.exit(0)
if args:
rtmp_url_tmp = ' '.join(map(str,args))
if rtmp_url_tmp.startswith("rtmp://"):
rtmp_url = rtmp_url_tmp
else:
sys.stderr.write("UNKNOWN - non RTMP URL given\n")
sys.exit(3)
else:
sys.stderr.write("UNKNOWN - no RTMP URL given\n")
sys.exit(3)
except Exception, e:
if opt_debug:
raise
sys.stderr.write("UNKNOWN - Error while processing input: %s\n" % e)
sys.exit(3)
if opt_verbose:
print("Verbose enabled: %s" % str(opt_verbose))
print("Timeout set to: %s" % str(opt_timeout))
print("Is a live strem: %s" % str(opt_live))
print("Given RTMP-URL: %s" % str(rtmp_url))
try:
conn = librtmp.RTMP(rtmp_url, opt_live, opt_timeout)
conn.connect()
if conn.connected:
stream = conn.read_packet()
if stream.body is not None:
conn.close()
print("OK - stream is online")
sys.exit(0)
except librtmp.RTMPError, e:
sys.stderr.write("CRIT - error connecting to stream: %s\n" % e )
sys.exit(2)
except librtmp.RTMPTimeoutError:
sys.stderr.write("CRIT - connection timed out: %s\n" %e )
sys.exit(2)
conn.close()
The Check_MK check – check_rtmp
Place this file in ~/local/share/check_mk/checks
#!/usr/bin/env python # -*- encoding: utf-8; py-indent-offset: 4 -*- # Check_MK Check RTMP # # Copyright 2016, Clemens Steinkogler <c.steinkogler[at]cashpoint.com> # # This program 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, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>.
NOTE: The params variable will have a dictionary as value – see later in the check_parameters_check_rtmp.py file
def check_rtmp_arguments(params):
args = ""
if "live" in params:
args += "--live %s " % quote_shell_string(params["live"])
else:
args += "--live True "
if "timeout" in params:
args += "--timeout %s " % quote_shell_string(params["timeout"])
else:
args += "--timeout 30 "
args += " %s" % quote_shell_string(params["rtmp_url"])
#args += " %s" % params["rtmp_url"]
return args
#enddef
NOTE: So this is interesting (again you won’t find much about this in the documentation of Check_MK) – the included active checks all have the variable $USER1$ but as we program our own check, we have to use $USER2$. Those variables are defined in your site’s ~/etc/icinga/resource.cfg
# $USER2$ ... ~/local/lib/nagios/plugins --- more info in ~/etc/icinga/resource.cfg
active_check_info['rtmp'] = {
"command_line" : '$USER2$/check_rtmp $ARG1$',
"argument_function" : check_rtmp_arguments,
"service_description" : lambda args: args["description"],
"has_perfdata" : False,
}
The check parameters – check_parameters_check_rtmp.py
We have to be able to configure the needed parameters via WATO – so we have to place this one in ~/local/share/check_mk/web/plugins/wato
NOTE: This file looks a little bit different to normal Check_MK check_parameters-files. You find the definitions for the included checks in ~/share/check_mk/web/plugins/wato/active_checks.py and not in check_parameters.py
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# Check_MK Check RTMP
#
# Copyright 2016, Clemens Steinkogler <c.steinkogler[at]cashpoint.com>
#
# This program 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, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
group = "activechecks"
register_rule(group,
"active_checks:rtmp",
Dictionary(
title = _("Check RTMP"),
help = _("This check connects to a given rtmp-url and checks if online or not. "
"This check uses the active check <tt>check_rtmp</tt>. "),
optional_keys = [ "live", "timeout" ],
elements = [
( "description",
TextUnicode(title = _("Service Description"),
help = _("The name of this active service to be displayed."),
allow_empty = False,
)),
( "live",
DropdownChoice(
title = _("Is this a live stream"),
help = _('default is Yes'),
choices = [
( "True", _("Yes") ),
( "False", _("No") ),
],
default_value = "yes",
)
),
( "timeout",
Integer(
title = _("Set timeout in seconds"),
help = _('default is 30'),
default_value = 30,
)
),
( "rtmp_url",
TextAscii(
title = _("Set the RTMP-URL"),
help = _('e.g. rtmp://some.domain/with-a.stream'),
allow_empty = False,
)
),
]
),
match = 'all'
)
So that’s it – you just created your own active check
Kommentare