shell脚本 + mysql数据库 实现企业级会话边界控制器文件解析并告警
dirsx30001.sh处理文件,生成mysql备份文件的方式进行导入
#/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
数据库设计,把接受信息和接通信息分开来管理。
--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;
通过设置视图去除重复消息。也可以灵活的添加各种条件。
--通过视图限制条件,更为灵活多变 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`;
进行检查数据库中的数据是否到达告警值。
#!/bin/bash ##导入变量,变量在多个会话中漂移root . /root/.bash_profile ##通知邮箱数组 a=( [email protected] #实验证明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
工作人员确认数据为正常时,执行(恢复时间点,防止查询数据时间范围过大)。
#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
恢复时,执行的脚本
#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