8-03 10 views
前置需求:1.所使用的电话语音功能,需要支持查询电话语音的状态(未接通/拒接/已接通 等)
2.所有的告警需要有对应的负责人,一个人循环CALL也行:A/B/C/D…………
该程序实现的需求:
当zabbix产生告警时,根据负责人清单中的顺序,进行电话语音告警推送,每人重复N(当前代码N=3)次,直到其中一次语音被接通。
例子:
某个告警有负责人:A/B/C,告警产生后,首先将给A发送语音,如果A未接通,将在T(当前代码T=120s)时间后再次发送语音告警,如果N次语音都没有接通,则将通知人替换成B,依次类推,任何一次电话被接通则停止语音推送。
思路:
1.生成一个process清单,里面纪录了当前所有需要打call的信息。(本程序用的纯文件存储)
2.每10秒轮询一次这个process清单,根据里面的信息,查看历史的call是否成功接收,没收继续call并更新相关信息,收了就删掉对应process。
3.写一个独立的脚本,提供给zabbix调用,用来新建process
几个通用的变量:
type:根据zabbix的特性,分为了host,ip和triggerid,分别对应zabbix里面的host,ip和告警的tirggerid,方便更贴近公司内部监控逻辑要求。
key_value:为告警所属关键字,和type一起,用来识别该告警将会发给哪一些人。
phoneNum:告警联系人的手机号
代码文件:
联系人文件:
${type}_call.list
存储该类type的联系人清单及联系顺序,格式如下:
${key_value} 第一个phoneNum 第二个人的phoneNum ………………第N个人的phoneNum
举例:
1 2 3 |
[zabbix@MASAIKE process_sh]# cat ip_call.list 192.168.1.1 11122223333 11133334444 12332132132 192.168.1.2 11122223333 11133334444 12332132132 |
process文件,当前实现方式是放在了一个文件夹里面,每个文件都是一个process
格式如下:
文件名:$type.$key_value
文件内容格式:
$1:上次更新的时间,纪录上次打call的时间
$2:type
$3:key_value
$4:当前打call的手机号
$5:当前联系人的顺位
$6:本条process剩余多少次轮询
$7:短信发送内容
举例:
1 2 3 4 5 6 |
[zabbix@MASAIKE dutycall]# cd call_process_list/ [zabbix@MASAIKE call_process_list]# ll total 4 -rw-r--r-- 1 zabbix zabbix 68 Aug 2 10:27 host.127.0.0.1 [zabbix@MASAIKE call_process_list]# cat host.127.0.0.1 1533087704 host 127.0.0.1 11122223333 1 5 host告警测试,不要答复 |
生成process的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[zabbix@MASAIKE dutycall]# cat cpro_type.sh #!/bin/bash ##$1=文件路径 $2=关键字 $3=当前顺位 $4=剩余呼叫次数 $5=type $6=内容 pathwd=$1 key_value=$2 line_num=$3 left_times=$4 content=$6 type=$5 LINE=`grep -w $key_value $pathwd/process_sh/${type}_call.list` let line_num=$line_num+1 phoneNum=`echo $LINE | awk '{print $'$line_num'}' datenow=`date +%s` echo "$datenow $type $key_value $phoneNum $line_num $left_times $content" > $pathwd/call_process_list/$type.$key_value |
轮询process的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
[zabbix@MASAIKE dutycall]# cat call_process_check.sh #!/bin/bash pathwd='/zabbix/wuxintemp/phone_call/dutycall' datenow=`date +%s` ##call_process_list 是存储了所有process 的文件夹 ls -l $pathwd/call_process_list/ | grep -v total > $pathwd/callprocess.list cat $pathwd/callprocess.list | while read LINE do pfilename=`echo $LINE | awk '{print $9}'` pLINE=`cat $pathwd/call_process_list/$pfilename` date0=`echo $pLINE | awk '{print $1}' let datecheck=$datenow-$date0 if [ $datecheck -gt 120 ];then phonenum=`echo $pLINE | awk '{print $4}'` ##检查该条process上次的语音接收状态 check=`sh $pathwd/get_call_status.sh $phonenum $date0 $pathwd` if [ ${check}s = 'successs' ];then rm -r $pathwd/call_process_list/$pfilename else left_times=`echo $pLINE | awk '{print $6}'` phonenum=`echo $pLINE | awk '{print $4}'` content=`echo $pLINE | awk '{print $7}'` type=`echo $pLINE | awk '{print $2}'` key_value=`echo $pLINE | awk '{print $3}'` line_num=`echo $pLINE | awk '{print $5}'` if [ $left_times -eq 0 ]; then ##如果剩余call次数为0,则顺位+1,生成下一个人的process line_num=$line_num+1 sh $pathwd/cpro_type.sh $pathwd $key_value $line_num 3 $type $content else ##再call一遍,同时将剩余次数-1 sh $pathwd/phone_call.sh $phone $content let left_times=$left_times-1 echo "$datenow $type $key_value $phonenum $line_num $left_times $content" > pathwd/call_process_list/$pfilename fi fi fi done |
与zabbix的交互见另外一篇:
后续需化的点:
1.将每个人的通话次数,重复call的间隔时间,做成变量话。
2.需要支持电话语音内容包含空格等特殊字符
3.将整个功能服务化,就是不用crontable那种,配置好第三方语音的脚本后,直接启动起来就好。