暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

监控设备IP状态并推送钉钉提醒

生有可恋 2021-09-27
548

单位所使用的电话报修的录音盒子是力盈力泰的,盒子有一个web管理终端。为了监控盒子的状态,当盒子网络中断或恢复时希望能收到消息通知。

设计思路是这样的,通过python的列表data存储服务检测状态。

    data = [False, False]

    两个字段,第一个字段存上次检测结果,第二个字段存此次检测结果。如果两次结果不同则发告警消息,如果相同说明状态没有变化,不发消息。再通过cPickle将列表结果存入文件,做数据持久化,方便下次读取检测状态。


    测试代码如下:

      # -*- coding: utf-8 -*-


      #!/bin/python


      import telnetlib
      import sys
      import cPickle
      import uniout
      import os


      datafile = sys.argv[1]


      # 第一个字段存上一次测试结果
      # 第二个字段存此次测试结果
      data = [False, False]


      # 初始化
      if not os.path.exists(datafile):
      f = open(datafile,'w')
      cPickle.dump(data, f)
      f.close()




      fin = open(datafile)
      data = cPickle.load(fin)
      fin.close()


      m = True
      try:
      telnetlib.Telnet(sys.argv[1], port='80', timeout=3)
      except:
      data[1] = False
      else:
      data[1] = True


      if data[0] == data[1]:
      # print('do not send msg')
      m = True
      else:
      if data[1]:
      print(sys.argv[1] + ' 设备网络恢复!')
      else:
      print(sys.argv[1] + ' 设备网络不通!')
      data[0] = data[1]
      m = False


      fou = open(datafile, 'w')
      cPickle.dump(data, fou)
      fou.close()


      if m:
      exit(0)
      else:
      exit(-1)


      第一次执行时数据初始化,默认为设备不通。执行结果为:

        root@ns-xxzx-svr:~/scripts# python cip.py  192.168.23.26
        192.168.23.26 设备网络恢复!

        当状态没有变化时返回0,状态有变化时,shell返回值为255,并打印设备状态变化。


        检测设备状态的脚本已准备好了,下面准备把它包一层给钉钉发消息。钉钉群机器人API可接收Post请求,然后将收到的消息转发到钉钉群里。


        首先我们要在钉钉群里添加一个机器人


        因为我们有三部电话录音盒子要监控状态


        所以我们在脚本里将三次告警的信息组合成一条。当三个设备中任意一个设备出现网络中断时,将通过钉钉发送告警。


          #!/bin/bash


          cd root/scripts


          S0=`/usr/bin/python cip.py 192.168.23.26`
          M0=$?
          S1=`/usr/bin/python cip.py 10.3.41.196`
          M1=$?
          S2=`/usr/bin/python cip.py 172.18.19.150`
          M2=$?




          if test $[M0+M1+M2] = "0" ; then
          exit 0
          fi


          S=""


          if test $M0 = "0" ; then
          S=""
          else
          S=$S" \n\n "$S0
          fi


          if test $M1 = "0" ; then
          S=$S""
          else
          S=$S" \n\n "$S1
          fi


          if test $M2 = "0" ; then
          S=$S""
          else
          S=$S" \n\n "$S2
          fi




          filec=`mktemp`
          FORTUNE=`fortune`
          DATE=/bin/date
          N=`awk -v min=1 -v max=500 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'`


          TIMEA=`$DATE +"%Y-%m-%d %H:%M"`
          variable=$(cat <<SETVAR
          {"msgtype": "markdown", "markdown":
          { "title":"监控报警",
          "text": "$FORTUNE \n\n*更新时间: ${TIMEA}*\n![](https://picsum.photos/400/400/?image=$N)\n## 维保保设备状态监听:\n $S \n" }
          }


          SETVAR
          )




          param="'"$variable"'"
          ACCESS_TOKEN=XXXXXXXXXXXX #your access token


          cat >$filec <<EOF
          curl "https://oapi.dingtalk.com/robot/send?access_token=$ACCESS_TOKEN" \
          -H 'Content-Type: application/json' \
          -d $param
          EOF
          echo $filec
          bash $filec
          echo "#============CLEAN TEMP FILE==========="
          rm -v $filec

          最终钉钉群将收到告警消息:


          文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论