设为首页 收藏本站
查看: 1033|回复: 0

nagios插件

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2019-1-14 06:08:12 | 显示全部楼层 |阅读模式
这是用shell开发的nagios插件,根据Nagios Plugin Development Guidelines和Nagios Plugin API编写,在前人的基础上进行补充,支持官方标准的-V、-c -v -t选项。插件主要思路是通过netstat命令获取tcp的各个状态连接,统计每个状态数量,最后按照标准的nagios插件格式输出检测信息和性能信息。监控那种状态,连接数多少警报,都可以通过脚本参数指定。
nagios监控服务器,通过nrpe在被监控端执行检测脚本,并把检测脚本运行的状态返回值和输出信息,返回给nagios监控服务器。其中状态返回值0代表正常,1代表警告,2代表紧急,3代表未知。
说明:脚本支持这几个参数
        -V|–version 显示脚本版本信息
        -c|--critical threshold 指定critical的阀值,必须指定
        -w|–warning threshold 指定warning的阀值,必须指定
        -s|–status tcp status 指定tcp连接状态,必须指定
        -h|–help 获取使用帮助
        -t|–timeout time 指定脚本运行超时时间
threshold格式
        ~代表负无穷大
        从0开始可以省略start:即0:end
        前面有start: 没有指明结束值,则为无穷大
        报警会在超出起始值与结束值之间,包括这两个值
        起始值为@,则报警会在起始值与结束值之间,包括这两个值
        10 小于0和大于10则警报
        10: 在10到正无穷大之外,即负无穷大到10警报
        ~:10 在负无穷大到10之外,即10到正无穷大警报
        10:20 10到20之外,即小于10和大于20
        @10:20 在10到20之间警报
        @10 在0到10之间警报
这个脚本可能还有bug,欢迎大家修复。

#!/bin/bash
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
print_revision() {
        echo "(nagios-plugins-netstat 0.5)"
}
usage(){
  echo -e "Usage: $0 [-V|--version] [-h|--help] \n \n"
}
check_range() {
mflag=0
  if echo $1 | grep -E -q  "^@?((~:[0-9]*$)|([0-9]+:?[0-9]*$))";then
    if echo $1 |grep -E -q "^@";then
range=${1#@}
        mflag=1
    else
range=$1
    fi
    if echo $range |grep -E -q ":";then
       start=${range%%:*}
       if [ "$start" = "~" ];then
         start=-999999
       fi
       if [ "$start" -lt 0 ];then
         return 2
       fi
       end=${range#*:}
       if [[ -z $end ]];then
         end=65535
       fi
    else
       start=0
       end=$range
    fi
    if [ "$start" != "~" ] && [ "$end" != "" ];then
       if  [ $start -gt $end ];then
          return 2
       fi
    fi
  else
    echo "invalid range"
    return 2
  fi
return 0
}
select_arg(){
if [ $# -eq 0 ];then
  return 1
fi
wcount=0
ccount=0
scount=0
until [ $# -eq 0 ];do
  case $1 in
    -V|--version)
      versionflag=1
      shift 1
      ;;
    -h|--help)
      helpflag=1
      shift 1
      ;;
    -w|--warning)
      [ $# -lt 2 ] && return 1
      check_range $2
      if [ $? -ne 0 ];then
        return 1
      else
        warn_start=$start
        warn_end=$end
        warn_mflag=$mflag
      fi
      shift 2
      let wcount++
      ;;
    -c|--critical)
      [ $# -lt 2 ] && return 1
      check_range $2
      if [ $? -ne 0 ];then
        return 1
      else
        critical_start=$start
        critical_end=$end
        critical_mflag=$mflag
      fi
      shift 2
      let ccount++
      ;;
    -s|--status)
      [ $# -lt 2 ] && return 1
      case $2 in
established|ESTABLISHED)
  status=established
          ;;
        time_wait|TIME_WAIT)
           status=time_wait
          ;;
        syn_recv|SYN_RECV)
  status=syn_recv
  ;;
        fin_wait1|FIN_WAIT1)
  status=fin_wait1
  ;;
fin_wait1|FIN_WAIT2)
  status=fin_wait2
  ;;
last_ack|LAST_ACK)
  status=last_ack
  ;;
close_wait|CLOSE_WAIT)
          status=close_wait
          ;;
*)
  return 1
     ;;
      esac
      shift 2
      let scount++
      ;;
    -t|--timeout)
      [ $# -lt 2 ] && return 1
      if ! echo $2 |grep -E -q "^[1-9][0-9]*$";then
        return 1
      fi
      timeout=$2
      ;;
    *)
     return 1
     ;;
  esac
done
return 0
}
alarm(){
connect=`netstat -ant | awk '/^tcp/ && !/LISTEN/{S[$NF]++}END{for(i in S) print i,S}'`
established=`echo $connect |awk '/ESTABLISHED/{print $2}'`
  [ -z $established ] && established=0
time_wait=`echo $connect |awk '/TIME_WAIT/{print $2}'`
  [ -z $time_wait ] && time_wait=0
syn_recv=`echo $connect |awk '/SYN_RECV/{print $2}'`
  [ -z $syn_recv ] && syn_recv=0
fin_wait1=`echo $connect |awk '/FIN_WAIT1/{print $2}'`
   [ -z $fin_wait1 ] && fin_wait1=0
fin_wait2=`echo $connect |awk '/FIN_WAIT2/{print $2}'`
   [ -z $fin_wait2 ] && fin_wait2=0
last_ack=`echo $connect |awk '/LAST_ACK/{print $2}'`
   [ -z $last_ack ] && last_ack=0
close_wait=`echo $connect |awk '/CLOSE_WAIT/{print $2}'`
   [ -z $close_wait ] && close_wait=0
if [ $warn_mflag -eq 0 -a $critical_mflag -eq 0 ];then
  w1=-ge;w2=-le;c1=-ge;c2=-le;wboole=-a;cboole=-a
elif [ $warn_mflag -eq 1 -a $critical_mflag -eq 0 ];then
  w1=-le;w2=-ge;c1=-ge;c2=-le;wboole=-o;cboole=-a
elif [ $warn_mflag -eq 0 -a $critical_mflag -eq 1 ];then
  w1=-ge;w2=-le;c1=-le;c2=-ge;wboole=-a;cboole=-o
elif [ $warn_mflag -eq 1 -a $critical_mflag -eq 1 ];then
   w1=-le;w2=-ge;c1=-le;c2=-ge;wboole=-o;cboole=-o
fi
if [ ${!status} $w1 $warn_start $wboole ${!status} $w2 $warn_end ] && [ ${!status} $c1 $critical_start $cboole ${!status} $c2 $critical_end ];then
  exitcode=0
else
  if ! [ ${!status} $w1 $warn_start $wboole ${!status} $w2 $warn_end ];then
    exitcode=1
  fi
  if ! [ ${!status} $c1 $critical_start $cboole ${!status} $c2 $critical_end ];then
      exitcode=2
  fi
  if [ ${!status} -le 0 ];then
      exitcode=3
  fi
fi
if [ $exitcode -eq 0 ];then
  serviceoutput="$status OK - total:${!status}"
elif [ $exitcode -eq 1 ];then
  serviceoutput="$status Warning - total:${!status}"
elif [ $exitcode -eq 2 ];then
  serviceoutput="$status Critical - total:${!status}"
elif [ $exitcode -eq 3 ];then
   serviceoutput="$status Unknown - total:${!status}"
fi
echo -e "$serviceoutput;| established $established;\ntime_wait $time_wait;\nsyn_recv $syn_recv;\nfin_wait1 $fin_wait1;\nfin_wait2 $fin_wait2;\nlast_ack $last_ack;\nclose_wait $close_wait"
exit $exitcode
}
select_arg $@
[ $? -ne 0 ] && usage && exit 3
if [[ -n $versionflag ]];then
   if [ $versionflag -eq 1 ];then
     print_revision && exit 0
   fi
else
  [[ -n $helpflag ]]  && [ $helpflag -eq 1 ] && usage && exit 0
fi
[ $ccount -ne 1 ] || [ $wcount -ne 1 ] || [ $scount -ne 1 ] && usage && exit 3
[ -z $timeout ] && timeout=10
alarm &
commandpid=$!
(sleep $timeout;commandchild=$(ps -eo pid,ppid | awk "\$2==$commandpid{print \$1}");for b in $com
mandchild;do  kill -9 $b &>/dev/null ;done;kill -9 $commandpid &>/dev/null) &
watchdog=$!
wait  $commandpid &>/dev/null
pexitcode=$?
[ $pexitcode -gt 3 ] && pexitcode=3
watchdogchild=`ps -eo pid,ppid | awk "\\$2==$watchdog{print \\$1}"`
for a in $watchdogchild;do
  kill -9 $a &>/dev/null
done
kill -9 $watchdog &>/dev/null
exit $pexitcode  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-662879-1-1.html 上篇帖子: CentOS 6.5安装nagios 下篇帖子: nagios学习手札
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表