check_mk检测插件编写
参考
Writing Checks (Introduction)
Writing agent based checks
The New Check API
http://www2.steinkogler.org/steinkogler.org/2016/08/21/check-mk-write-your-own-check/
https://github.com/leibler/check_mk-sas2ircu/blob/master/agent/plugins/sas2ircu
agent/plugins/sas2ircu
尽量使用bash编写客户端插件
# example output of this check:
# <<<sas2ircu>>>
# volume 0 79 okay_(oky) 0d9383a8258e32ac raid1 1907200
# disk 0 0 optimal_(opt) 5000c50-0-569e-8a83 seagate st2000nm0023 z1x065wj sas sas_hdd
# disk 0 1 optimal_(opt) 5000c50-0-569f-2021 seagate st2000nm0023 z1x0j231 sas sas_hdd
#
# each line starts with the type ('disk' or 'volume')
# the 2nd column is the controller id (first controller=0, second controller=1, ...)
# the 3rd column for volume is the volume id and for disks is the slot number
# the 4th column is the state
# the order of the fields is configured in the arrays 'volumeOutputOrder' and 'diskOutputOrder'
# 标签,使用<<< ... >>>引用,与服务端的检测插件名称匹配
# 信息部分,处理为行列二维列表,用于服务端接收
import subprocess
import sys
# raidCommand is the cli utility name which is executed to get the information
raidCommand = "sas2ircu"
# volumeAttrs is a list of key:value pairs where key is the volume fieldname of the output from sas2ircu cli utility and value is the internal name used in *OutputOrder list. use lower case letters!
volumeAttrs = { 'volume id': 'volumeid', 'status of volume': 'status', 'volume wwid': 'wwid', 'raid level': 'raid', 'size (in mb)': 'size' }
# diskAttrs is a list of key:value pairs where key is the disk fieldname of the output from sas2ircu cli utility and value is the internal name used in *OutputOrder list. use lower case letters!
diskAttrs = { 'slot #': 'slot', 'state': 'status', 'sas address': 'sasaddr', 'manufacturer': 'manufacturer', 'model number': 'model', 'serial no': 'serial', 'protocol': 'protocol', 'drive type': 'type' }
# volumeOutputOrder is a list of the internal names for volumes used for the output in the given order
volumeOutputOrder = [ 'controller', 'volumeid', 'status', 'wwid', 'raid', 'size' ]
# diskOutputOrder is a list of the internal names for disks used for the output in the given order
diskOutputOrder = [ 'controller', 'slot', 'status', 'sasaddr', 'manufacturer', 'model', 'serial', 'protocol', 'type' ]
def returnVolumeTpl():
volumeTpl = { 'controller': '-1' }
for name, code in volumeAttrs.items():
volumeTpl[code] = '-'
return volumeTpl
def returnDiskTpl():
diskTpl = { 'controller': '-1' }
for name, code in diskAttrs.items():
diskTpl[code] = '-'
return diskTpl
# checkNextController is a flag if current controller (int 0-255) is present and so the next controller id should be checked
checkNextController = True
listVolumes = []
listDisks = []
for i in range( 0, 255 ):
if checkNextController:
cmd = subprocess.Popen( raidCommand+" "+str(i)+" DISPLAY", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
mode = "unknown"
volumeNr = 0
diskNr = 0
volume = returnVolumeTpl()
disk = returnDiskTpl()
for line in cmd.stdout:
line = line.strip().lower()
if "sas2ircu: not found" in line:
checkNextController = False
break
checkIfPresentLine = "SAS2IRCU: No Controller Found at index "+str(i)+"."
checkIfPresentLine = checkIfPresentLine.lower()
if line == checkIfPresentLine:
checkNextController = False
break
parts = map( str.strip, line.split(":") )
if parts[0] == "sas2ircu" or parts[0].startswith("------") or parts[0].startswith("ir volume") or len(parts[0]) == 0:
if mode == "volume":
if volume['controller'] != "-1":
listVolumes.append(volume)
volume = returnVolumeTpl()
if mode == "harddisk":
if disk['controller'] != "-1":
listDisks.append(disk)
disk = returnDiskTpl()
if parts[0] == "volume id":
volume['controller'] = str(i)
volume['volume'] = parts[1]
mode = "volume"
if parts[0] == "device is a hard disk":
disk['controller'] = str(i)
mode = "harddisk"
if mode == "volume" and len(parts) > 1:
if parts[0] in volumeAttrs:
volume[volumeAttrs[parts[0]]] = parts[1].replace( " ", "_" )
if mode == "harddisk" and len(parts) > 1:
if parts[0] in diskAttrs:
disk[diskAttrs[parts[0]]] = parts[1].replace( " ", "_" )
else:
break
# output the checks in order of volumeOutputOrder and diskOutputOrder
if len(listVolumes) > 0 or len(listDisks) > 0:
sys.stdout.write( "<<<sas2ircu>>>\n" )
for volume in listVolumes:
sys.stdout.write( "volume " )
for name in volumeOutputOrder:
sys.stdout.write( volume[name]+" " )
sys.stdout.write( "\n" )
for disk in listDisks:
sys.stdout.write( "disk " )
for name in diskOutputOrder:
sys.stdout.write( disk[name]+" " )
sys.stdout.write( "\n" )
sys.stdout.flush()
check_mk/checks/sas2ircu
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# EXAMPLE DATA FROM CHECK 'sas2ircu':
# <<<sas2ircu>>>
# volume 0 79 okay_(oky) 0691440a258e54cc raid1 1907200
# disk 0 0 optimal_(opt) 5000c50-0-569e-9bad seagate st2000nm0023 z1x08nwc sas sas_hdd
# disk 0 1 optimal_(opt) 5000c50-0-569f-8055 seagate st2000nm0023 z1x091jj sas sas_hdd
#
# Integrated RAID Volume State values are as follows:
# Okay (OKY) – The volume is active and drives are functioning properly. User data is protected if the current RAID level provides data protection.
# Degraded (DGD) – The volume is active. User data is not fully protected because the configuration has changed or a drive has failed.
# Failed (FLD) – The volume has failed.
# Missing (MIS) – The volume is missing.
# Initializing (INIT) – The volume is initializing.
# Online (ONL) – The volume is online.
# Physical device State values are as follows:
# Online (ONL) – The drive is operational and is part of a volume.
# Hot Spare (HSP) – The drive is a hot spare that is available to replace a failed drive in a volume.
# Ready (RDY) – The drive is ready for use as a normal disk drive, or it is ready to be assigned to a volume or a hot spare pool.
# Available (AVL) – The drive might not be ready, and it is not suitable for use in a volume or a hot spare pool.
# Failed (FLD) – The drive failed and is now offline.
# n Missing (MIS) – The drive has been removed or is not responding.
# Standby (SBY) – The device is not a hard-disk device.
# Out of Sync (OSY) – The drive, which is part of an Integrated RAID volume, is not in sync with other drives that are part of the volume.
# Degraded (DGD) – The drive is part of a volume and is in degraded state.
# Rebuilding (RBLD) – The drive is part of a volume and is currently rebuilding.
# Optimal (OPT) – The drive is optimal and is part of a volume.
# Physical device Drive Type values are as follows:
# SAS_HDD – The drive is a SAS HDD.
# SATA_HDD – The drive is a SATA HDD.
# SAS_SSD – The drive is a SAS SSD.
# SATA_SSD – The drive is a SATA SSD.
# Physical device Protocol values are as follows:
# SAS – The drive supports SAS protocol.
# SATA – The drive supports SATA protocol.
def inventory_sas2ircu(info):
inventory = []
for line in info:
itemName = ""
if line[0] == "volume":
# input: volume 0 79 okay_(oky) 0691440a258e54cc raid1 1907200
# itemName=VOLUME 0/79 (raid1, 1862GB)
itemName = "VOLUME "+line[1]+"/"+line[2]+" ("+line[5]+", "+str(int(line[6])/1024)+"GB)"
elif line[0] == "disk":
# input: disk 0 1 optimal_(opt) 5000c50-0-569f-8055 seagate st2000nm0023 z1x091jj sas sas_hdd
# itemName=DISK 0/1 ST2000NM0023_Z1X091JJ (SAS_HDD)
itemName = "DISK "+line[1]+"/"+line[2]+" "+line[6].upper()+"_"+line[7].upper()+" ("+line[9].upper()+")"
if len(itemName) > 0:
inventory.append((itemName, None))
return inventory
# info是客户端插件传递来的二组列表,inventory函数返回包含元组的列表,元组第1个值是checkname,元组第2个值是agnetdata输出,如果没有值的话,使用None代替
def check_sas2ircu(item, params, info):
infoText = ""
for line in info:
itemName = ""
if line[0] == "volume":
# input: volume 0 79 okay_(oky) 0691440a258e54cc raid1 1907200
# itemName=VOLUME 0/79 (raid1, 1862GB)
itemName = "VOLUME "+line[1]+"/"+line[2]+" ("+line[5]+", "+str(int(line[6])/1024)+"GB)"
infoText = "Volume Status "+line[3]
elif line[0] == "disk":
# input: disk 0 1 optimal_(opt) 5000c50-0-569f-8055 seagate st2000nm0023 z1x091jj sas sas_hdd
# itemName=DISK 0/1 ST2000NM0023_Z1X091JJ (SAS_HDD)
itemName = "DISK "+line[1]+"/"+line[2]+" "+line[6].upper()+"_"+line[7].upper()+" ("+line[9].upper()+")"
infoText = "Disk Status "+line[3]
if itemName == item:
if line[0] == "volume":
if line[3] == "okay_(oky)":
return (0, "OK - %s" % infoText)
elif line[3] == "failed_(fld)" or line[3] == "missing_(mis)" :
return (2, "CRIT - %s" % infoText)
else:
return (1, "WARN - %s" % infoText)
if line[0] == "disk":
if line[3] == "optimal_(opt)" or line[3] == "hot_spare_(hsp)" or line[3] == "ready_(rdy)":
return (0, "OK - %s" % infoText)
elif line[3] == "failed_(fld)" or line[3] == "missing_(mis)" or line[3] == "out_of_sync_(osy)" or line[3] == "degraded_(dgd)" :
return (2, "CRIT - %s" % infoText)
else:
return (1, "WARN - %s" % infoText)
return (3, "UNKNOWN - Invalid check output from %s" % item)
# check函数传递变量,item,可以理解为是inventory的返回值itemName, params,是定义的default_level, info客户端插件的输出
# check函数返回值,也是元组
# 检测状态 a Nagios status code (0=OK, 1=WARN, 2=CRIT, 3=UNKNOWN)
# 检测结果 a text to be used by Nagios as plugin output
# 性能数据,用于画图,是可选项,由has_perfdata变量控制 optionally: performance data
# perfdata 值是元组,由以下部分组成
# A variable name (string)
# The current value of the variable (int or float)
# The warning level or ""
# The critical level or ""
# The minimum possible value or ""
# The maximum possible value or ""
# perfdata example
#check_foobar(item, params, info):
# return (0, "Foobar", [
# ( "size", 125 ), # simple value, no levels, no range
# ( "used", 88.5, "", "", 0, 100), # no levels, range is from 0 to 100
# ( "guzzi", -14.5, -20, -30), # warning at -20, crit at -30
# ( "argl", 66, 80, 90, 0, 100), # levels at 80/90, min/max at 0/100
# ])
# 控制
check_info["sas2ircu"] = {
'check_function': check_sas2ircu,
'inventory_function': inventory_sas2ircu,
'service_description': '%s',
'has_perfdata': False
}
check_mk/checkman/sas2ircu
title: Check state of physical disks and volumes of LSI SAS2008, Dell PERC H200 Raid controllers
agents: linux
author: Leo Eibler <le@sprossenwanne.at>
license: Apache License, Version 2.0
distribution: none
description:
This check monitors the state of the physical disks and volumes
of LSI SAS2008, Dell PERC H200 raid controllers (used in Dell R200, R210, R210II servers).
The Linux agent sends the neccessary data,
if the command line utility {sas2ircu} is found in the shells
search path.
The utility {sas2ircu} debian x64 package can be downloaded from
{http://hwraid.le-vert.net/debian/pool-wheezy/sas2ircu_16.00.00.00-1_amd64.deb} and
installed with {dpkg -i sas2ircu_16.00.00.00-1_amd64.deb}.
item:
For volumes: The word 'VOLUME' followed by the controller number (1st controller={0}),
the volume id and the volume raid type and size.
For example {"VOLUME 0/79 (raid1, 1862GB)"} means a volume on 1st controller {0} with
id {79} using {raid1} with a size of {1862GB}.
For disks: The word 'DISK' followed by the controller number (1st controller={0}),
the disk number, the disk model and serial and disk type.
For example {"DISK 0/1 ST2000NM0023_Z1X091JJ (SAS_HDD)"} means a disk on 1st controller {0},
the 2nd disk {1} of model and serial {ST2000NM0023_Z1X091JJ} which is a {SAS_HDD} disk type.
inventory:
All disks and volumes of all controllers are automatically inventorized. The current state is
taken as the target state.
check_mk检测插件编写的更多相关文章
- check_mk检测插件 - raid监控
mk_raidstatus python版本 #!/usr/bin/env python # -*- encoding: utf-8; py-indent-offset: 4 -*- import s ...
- robots检测插件编写
首先先把url分割 url = 'https://www.baidu.com/s?wd=123&rsv_spt=1&rsv_iqid=0x8d22781d000014ad&is ...
- [Linux实用工具]munin-node插件配置和插件编写
前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx) 这次介绍一下mun ...
- BugScan插件编写高(gǎo)级(jī)教程
声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...
- vim语法高亮插件编写
# vim语法高亮插件编写 编写vim语法高亮插件很简单,只需要编写两个文件.vim放到vim的安装目录下的目录就可以了. ## 输出------------------------------ sy ...
- jQuery插件编写及链式编程模型小结
JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...
- Wireshark插件编写
Wireshark插件编写 在抓包的过程中学习了使用wireshark,同时发现wireshark可以进行加载插件,便在网上学习了一下相应的插件开发技术. 需求编写一个私有协议名为SYC,使用UDP端 ...
- Sublime Text编辑工具带有 PEP 8 格式检测插件
Sublime Text编辑工具带有 PEP 8 格式检测插件
- typecho插件编写教程1 - 从HelloWorld说起
typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...
随机推荐
- C语言文件I/O和标准I/O函数
读取/写入 相对于文件而言 输入/输出 相对于程序/内存而言 一切皆文件,键盘.显示屏也是文件,只不过是特殊的标准文件: 标准文件:标准输入.标准输出.标准错误:---->对应的文件指针:st ...
- newFixedThreadPool固定线程使用
1.newFixedThreadPool固定线程池, 使用完毕必须手动关闭线程池, 否则会一直在内存中存在, package ThreadTest; import java.util.concurr ...
- 8-----BBS论坛
BBS论坛(八) 8.1.发送邮箱验证码功能 (1)cms/resetemail.html {% from 'common/_macros.html' import static %} {% bloc ...
- 6-----BBS论坛
BBS论坛(六) 6.1.优化json数据的返回 (1)新建utils/restful.py # utils/restful.py from flask import jsonify class Ht ...
- 转 如何在secureCRT上设置常用的快捷输出按钮栏听语音
https://jingyan.baidu.com/article/5d6edee2f32de199eadeec25.html 要注意secureCRT的版本,建议下载最新版本的软件 ...
- Mybatis学习笔记11 - 动态sql之trim标签
trim标签体中是整个字符串拼串后的结果.prefix="" 前缀: prefix给拼串后的整个字符串加一个前缀prefixOverrides="" 前缀覆盖: ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- [转]JS 只能输入数字和两位小数的JS
本文转自:http://blog.sina.com.cn/s/blog_724008890101dgep.html JS代码: <script language="JavaScript ...
- (转)轻松应对IDC机房带宽突然暴涨问题
原文:http://blog.51cto.com/oldboy/909696
- aop动态代理 事务 threadlocal
第一:package com.itheima.utils; import java.sql.Connection; import java.sql.SQLException; /** * 处理事务 的 ...