参考

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检测插件编写的更多相关文章

  1. check_mk检测插件 - raid监控

    mk_raidstatus python版本 #!/usr/bin/env python # -*- encoding: utf-8; py-indent-offset: 4 -*- import s ...

  2. robots检测插件编写

    首先先把url分割 url = 'https://www.baidu.com/s?wd=123&rsv_spt=1&rsv_iqid=0x8d22781d000014ad&is ...

  3. [Linux实用工具]munin-node插件配置和插件编写

    前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx)   这次介绍一下mun ...

  4. BugScan插件编写高(gǎo)级(jī)教程

    声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...

  5. vim语法高亮插件编写

    # vim语法高亮插件编写 编写vim语法高亮插件很简单,只需要编写两个文件.vim放到vim的安装目录下的目录就可以了. ## 输出------------------------------ sy ...

  6. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  7. Wireshark插件编写

    Wireshark插件编写 在抓包的过程中学习了使用wireshark,同时发现wireshark可以进行加载插件,便在网上学习了一下相应的插件开发技术. 需求编写一个私有协议名为SYC,使用UDP端 ...

  8. Sublime Text编辑工具带有 PEP 8 格式检测插件

    Sublime Text编辑工具带有 PEP 8 格式检测插件

  9. typecho插件编写教程1 - 从HelloWorld说起

    typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...

随机推荐

  1. Django---队列

    1.队列介绍 任务队列用作跨线程或机器分配工作的机制. 任务队列的输入是称为任务的工作单元. 专用工作进程不断监视任务队列以执行新工作. Celery通过消息进行通信,通常使用经纪人(brokers) ...

  2. Codeforces Round #526 (Div. 2) D. The Fair Nut and the Best Path 树上dp

    D. The Fair Nut and the Best Path 题意:给出一张图 点有权值 边也要权值 从任意点出发到任意点结束 到每个点的时候都可以获得每个点的权值,而从边走的时候都要消耗改边的 ...

  3. 【预警通告】Apache Struts2 远程代码执行漏洞

    Apache Structs2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638.攻击者可以在使用该插件上传文件时,修改HTTP请求头中的 ...

  4. ftp 添加用户及修改用户目录

    添加用户 : useradd 用户名 -s /sbin/nologin //限定用户test不能telnet,只能ftp; usermod -s /sbin/bash 用户名 //用户恢复正常 ;该账 ...

  5. sqlserver 数据库表分区

    参考文档 https://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx http://blog.sina.com.cn/s/blog_4 ...

  6. json转译的问题

    今天遇到一个之前没遇到的情况 这边调用接口的时候,一串json数据我直接解析成php的时候,太长导致我在使用 $json = json_encode($list);转译成的时候,里面有一个数据是时间戳 ...

  7. Python 基础学习之if语句

    cars=['audi','xiali','bwm','benz',] ##根据要求bmw全部为大写,其他的首字母为大写 for car in cars: if car=='bmw': print(c ...

  8. Jenkins安全配置详解

    一.进入安全配置界面 首页后点击进入系统管理(Manage Jenkins) ——下拉下方看到安全配置(Configure Global Security) ——进入安全配置界面 二,详解安全配置的选 ...

  9. Win 10 Enable .net framework 3.5 error (Error code:0x800F081F )

    在下面页面enable .net frramwork 3.5时,发生0x800F081F错误. 解决方案: 1. 在如下链接下载Win10 版的microsoft-windows-netfx3-ond ...

  10. MVC 路由检测组件 Routing Debugger

    组件下载地址 haacked.com 1.在mvc项目中引入组件 2.配置route规则 public static void RegisterRoutes(RouteCollection route ...