|
shell脚本 + mysql数据库 实现企业级会话边界控制器文件解析并告警
dirsx30001.sh处理文件,生成mysql备份文件的方式进行导入
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
48
49
50
51
52
53
54
55
56
| #/bin/bash
##环境变量
path=/home/sbclog/sx30001
##由于抓取的日志文件中没有年份参数,故导入系统年份参数,以达到数据库时间字段datetime
##也可以抓取tar包的名字中的字段
date_year=`date|cut -c 25-`
#test ! -e $path/*.tar &&echo "[ "`date`" ] no search the tar file">>$path/dir.log&&exit 0
##遍历日志文件tar包,进行解包,保存了文件的全路径,及文件名
for a in `ls $path/*.tar 2>>/dev/null`
do
##输出当前解包的文件tar
echo $a
tar -xf $a -C $path
##解完包,将tar文件进行转移
mv $a $path/backup/
##执行解析程序foundall,生成BYE.txt和INVITE.txt解析文件
/data/sbc1/foundall $path/
##删除包文件
rm -rf $path/var
#echo $b
##判断解析文件是否为NULL
FILEBYE=`sed -n '$=' $path/BYE.txt`
FILEINVITE=`sed -n '$=' $path/INVITE.txt`
##BYE
if [ ! -n "$FILEBYE" ]; then
echo "[ "`date`" ] no BYE in $a">>$path/dir.log
else
echo "use sbc;" > $a.BYE.sql
echo "insert into sbc1bye values" >> $a.BYE.sql
##################
awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/BYE.txt >>$a.BYE.sql
##替换最后一行的最后一个字符为分号
sed -i '$s/.$/;/g' $a.BYE.sql
#sed -i 's/\//-/g' $a.BYE.sql
##导入数据库
mysql -usbc_user -p123456 <$a.BYE.sql
##保存文件
mv $a.BYE.sql $path/BYEsql/
##INVITE
fi
if [ ! -n "$FILEINVITE" ]; then
echo "[ "`date`" ] no INVITE in $a">>$path/dir.log
else
echo "use sbc;" > $a.INVITE.sql
echo "insert into sbc1invite values" >> $a.INVITE.sql
##################
awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/INVITE.txt >>$a.INVITE.sql
##替换最后一行的最后一个字符为分号
sed -i '$s/.$/;/g' $a.INVITE.sql
#sed -i 's/\//-/g' $a.INVITE.sql
##导入数据库
mysql -usbc_user -p123456 <$a.INVITE.sql
##保存文件
mv $a.INVITE.sql $path/INVITEsql/
fi
done
|
数据库设计,把接受信息和接通信息分开来管理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| --sbc1bye表设计,使用了大量varchar类型存取数据,节省空间,type使用了char类型提升检索效率(原计划是BYE和INVITE保存在同一个表中)。
CREATE TABLE `sbc1bye` (
`time` DATETIME DEFAULT NULL,
`from` varchar(255) DEFAULT NULL,
`to` varchar(255) DEFAULT NULL,
`type` char(10) DEFAULT NULL,
`server` varchar(255) DEFAULT NULL,
`caller` varchar(255) DEFAULT NULL,
`called` varchar(255) DEFAULT NULL,
`callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `sbc1invite` (
`time` DATETIME DEFAULT NULL,
`from` varchar(255) DEFAULT NULL,
`to` varchar(255) DEFAULT NULL,
`type` char(10) DEFAULT NULL,
`server` varchar(255) DEFAULT NULL,
`caller` varchar(255) DEFAULT NULL,
`called` varchar(255) DEFAULT NULL,
`callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
通过设置视图去除重复消息。也可以灵活的添加各种条件。
1
2
3
4
5
6
7
8
9
| --通过视图限制条件,更为灵活多变
CREATE OR REPLACE
VIEW sbc1bye_v
AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1bye group by `callid`;
--通过视图限制条件,更为灵活多变
CREATE OR REPLACE
VIEW sbc1invite_v
AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1invite group by `callid`;
|
进行检查数据库中的数据是否到达告警值。
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
48
49
50
51
| #!/bin/bash
##导入变量,变量在多个会话中漂移root
. /root/.bash_profile
##通知邮箱数组
a=(
540562659@qq.com #实验证明139移动邮箱,响应速度奇慢,建议使用163邮箱
)
##邮件内容保存路径
mailpath=/home/sbclog/sx30001
##告警值
value_limit=200
#mysql -usbc_user -p123456 -e "use sbc;select * from heji where heji>$value_limit;">$mailpath/mail.log
##生成NULL的邮件内容文件
>$mailpath/mail.log
#echo "$SCN_time_sx30002"
##产生告警的数据文件,可以修改为select where having
mysql -usbc_user -p123456 -e "use sbc;select a.* from (select bcaller,bcalled,count(bcalled) heji from sbc1bye_v where btime>$SCN_time_sx30001 group by bcaller,bcalled) a where a.heji>$value_limit;">$mailpath/mail.log
##判断邮件内容文件是否为NULL
FILEMAIL=`sed -n '$=' $mailpath/mail.log`
if [ ! -n "$FILEMAIL" ]; then
#echo "no value over the limit,so no mail will be sent."
##为NULL文件时,重置定时文件/var/spool/cron/root为每分钟检查
sed -i 's/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root
else
##将邮件内容content文件处理成html表格文件,适合观察
sed 's/\t/\<\/th\>\<th\>/g' $mailpath/mail.log |sed 's/^/\<tr\>\<th\>/g'|sed 's/$/\<\/td\>\<\/tr\>/g'|sed '1s/^/<table border="1">/g'|sed '$s/$/<\/table>/g'>$mailpath/mail.html
#echo ${#a[@]}
##不为NULL文件时,设置定时文件/var/spool/cron/root为30分钟再次告警,直至人为处理
sed -i 's/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root
##遍历数组发送邮件
for mail in ${a}
do
##html格式发送,可以设计邮件样式
mail -s "$(echo -e "SBC1 Exception Information\nContent-Type:text/html")" $mail < $mailpath/mail.html
done
fi
|
工作人员确认数据为正常时,执行(恢复时间点,防止查询数据时间范围过大)。
1
2
3
4
5
6
7
8
9
10
11
12
13
| #export SCN_time_sx30002="'"`date +%F" "%T`"'"
#sed -i 's/export SCN_time_sx30002.*/export SCN_time_sx30002=\"\'`date +%F" "%T`\'\"/' /root/.bash_profile
#sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/' /root/.bash_profile
##将环境变量在各个会话中传递
sed -i "s/export SCN_time_sx30001.*/export SCN_time_sx30001='`date +%F" "%T`'/" /root/.bash_profile
#echo "restore success. now:"$SCN_time_sx30001
#at now + 1 day -f /home/sbclog/resx30002.sh
#at now + 1 min -f /home/sbclog/resx30002.sh
##at一次性定时任务,检查的为前一天的告警是否合适,故恢复时间点+了一个小时
at now + 25 hours -f /home/sbclog/resx30001.sh
|
恢复时,执行的脚本
1
2
3
4
5
| #sed -i 's/nnn/ggg/g' /home/sbclog/122.txt
#sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/' /root/.bash_profile
##恢复时间点,使检查点恢复成一天告警
sed -i 's/export SCN_time_sx30001.*/export SCN_time_sx30001="date_sub(now(),interval 1 day)"/' /root/.bash_profile
|
|
|