├── Waf_auto_pretest ├── benchServer_pressure │ ├── test.txt │ ├── readMe.txt │ ├── stop.sh │ ├── finish.sh │ ├── start.sh │ ├── prepare.sh │ └── play_back.py ├── wafServer_pressure │ ├── readMe.txt │ ├── stop.sh │ ├── start.sh │ ├── finish.sh │ ├── rmcrontab.sh │ ├── prepare.sh │ └── gainCpuMem.sh ├── wafServer_quality │ ├── stop.sh │ ├── start.sh │ ├── rmcrontab.sh │ ├── gainCpuMem.sh │ ├── finish.sh │ ├── opt_mode1.sh │ ├── prepare.sh │ ├── dataException_opt.py │ └── logHandle_opt.py └── benchServer_quality │ ├── stop.sh │ ├── start.sh │ ├── finish.sh │ ├── prepare.sh │ └── play_back.py └── README.md /Waf_auto_pretest/benchServer_pressure/test.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/readMe.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oxff644/Waf_auto_pretest/HEAD/Waf_auto_pretest/wafServer_pressure/readMe.txt -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/readMe.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oxff644/Waf_auto_pretest/HEAD/Waf_auto_pretest/benchServer_pressure/readMe.txt -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time data_version guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 测试数据 唯一标识 模式 5 | 6 | kill `ps -ef|grep ${6}|grep -v grep|awk '{print $2}'` 7 | echo "测试已中止" 8 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time 测试数据 guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 data_version 唯一标识 模式 5 | 6 | 7 | kill `ps -ef|grep ${6}|grep -v grep|awk '{print $2}'` 8 | echo '测试已中止' 9 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 本次测试的唯一标识 5 | 6 | kill `ps -ef|grep ${6}|grep -v grep|awk '{print $2}'` 7 | echo "测试已中止" 8 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_quality/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | kill `ps -ef|grep ${6}|grep -v grep|awk '{print $2}'` 7 | echo "测试已中止" 8 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | # 运行数据分析代码 7 | 8 | sh /usr/local/waf_test/sbin/opt_mode1.sh ${1} ${2} ${3} ${4} ${5} ${6} 9 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_quality/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | python /usr/local/waf_test/sbin/play_back.py 121.46.247.123 7 | 8 | sh /usr/local/waf_test/sbin/finish.sh 9 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/finish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time 测试数据 guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 data_version 唯一标识 模式 5 | 6 | 7 | curl -X POST http://localhost:60002/finished_bench -H "content-type:application/json" -d "{\"result\": \"success\"}" 8 | echo "finished" 9 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_quality/finish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | curl -X POST http://localhost:60002/finished_bench -H "content-type:application/json" -d "{\"result\": \"success\"}" 7 | echo "finished" 8 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time 测试数据 guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 data_version 唯一标识 模式 5 | 6 | mkdir /usr/local/waf_test/analysis/${6}-${7} 7 | 8 | python /usr/local/waf_test/sbin/play_back.py ${1} ${2} ${3} ${4} ${5} ${6} ${7} 9 | 10 | sh /usr/local/waf_test/sbin/finish.sh ${1} ${2} ${3} ${4} ${5} ${6} ${7} 11 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time data_version guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 测试数据 唯一标识 模式 5 | 6 | 7 | mkdir /usr/local/waf_test/analysis/${6}-${7} 8 | mkdir /usr/local/waf_test/analysis/${6}-${7}/nginx 9 | mkdir /usr/local/waf_test/analysis/${6}-${7}/shark 10 | mkdir /usr/local/waf_test/analysis/${6}-${7}/squid 11 | 12 | sh /usr/local/waf_test/sbin/gainCpuMem.sh ${1} ${2} ${3} ${4} ${5} ${6} ${7} 13 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time 测试数据 guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 data_version 唯一标识 模式 5 | 6 | status=`curl http://115.54.16.68/testcdn.htm -H "Host:botsec.haplat.net" -i|sed -n 1p|awk '{print $2}'` 7 | if [ $status = '200' ] 8 | then 9 | echo 'connect successfully' 10 | else 11 | dateStamp=$(date '+%Y-%m-%d:%H:%M:%S') 12 | echo "{\"error_type\":\"connect wafserver failed \", \"time\":\"$dateStamp\"}" >>/dev/stderr 13 | exit 1 14 | fi 15 | 16 | echo 'ready to send data!' 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WAF自动化质量测试工具 2 | 该项目主要实现了对新版本waf进行质量测试和压力测试,根据统计数据评估新版waf具体情况。 3 | ## 背景 4 | * 目前测试环境请求数据单一,防护配置复杂度不够,造成测试覆盖度不够。由于线上请求数据复杂,每个域名的配置复杂并且多样性,往往测试后的版本部署线上发生异常。 5 | * 压测数据单一,无法真正反映机器的性能 6 | * 规则新增的时候,对规则测试的数据比较单一,可能会引起误拦、CPU打满的风险。 7 | 8 | ## 设计目的 9 | 10 | 模拟线上请求流量,测试的waf配置和线上WAF配置一致。发布前对waf的全部域名进行测试,统计异常状态,判断系统是否正常。 11 | 当下发新规则前,需要先下发到测试平台,平台进行压测,判断是否误拦和CPU变化情况。 12 | ## 基本流程 13 | * 线上真实流量收集,还原并下发到测试服务器。 14 | * 控制服务器发生测试指令。 15 | * 压测机器控制模块根据具体模式压测机器进行流量回放测试。 16 | * Waf控制模块根据具体模式选择对应的配置,启动waf。 17 | * waf统计模块根据压测模式对日志、性能数据分析统计。 18 | * 收集压测机器和waf统计模块的分析数据,发送到控制服务器上。 19 | 20 | 21 | > 项目名实在是乱想的,第一个版本实现较为粗糙,立个flag,下一个版本尝试用go写写:) 22 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_quality/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | status=`curl http://121.46.247.123/testcdn.htm -H "Host:lvs.lxdns.net" -i|sed -n 1p|awk '{print $2}'` 7 | if [ $status = '200' ] 8 | then 9 | echo 'connect successfully' 10 | else 11 | dateStamp=$(date '+%Y-%m-%d:%H:%M:%S') 12 | echo "{\"error_type\":\"connect wafserver failed \", \"time\":\"$dateStamp\"}" >>/dev/stderr 13 | exit 1 14 | fi 15 | 16 | echo 'ready to send data!' 17 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/finish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time data_version guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 测试数据 唯一标识 模式 5 | 6 | 7 | touch /usr/local/waf_test/tmp/${6} 8 | sleep 10 9 | 10 | echo -n > /usr/local/waf_test/tmp/info.json 11 | tar zcPf /usr/local/waf_test/upload.tar /usr/local/waf_test/analysis/${6}-${7} 12 | echo "{\"result\":\"success\", \"file_path\":\"/usr/local/waf_test/upload.tar\"}" > /usr/local/waf_test/tmp/info.json 13 | 14 | curl -X POST http://127.0.0.1:60001/finished_bench -H "content-type:application/json" -T /usr/local/waf_test/tmp/info.json 15 | echo "finished" 16 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/rmcrontab.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | function remove_crontab() 3 | { 4 | CMD="$1" 5 | is_restart=0 6 | awk '$0 != MATCHSTR' MATCHSTR="$CMD" /var/spool/cron/root > /var/spool/cron/root.bak 7 | if diff /var/spool/cron/root /var/spool/cron/root.bak 1>/dev/null 2>&1 8 | then 9 | is_restart=1 10 | fi 11 | mv -f /var/spool/cron/root.bak /var/spool/cron/root 12 | chmod 600 /var/spool/cron/root 13 | if [ $is_restart -eq 0 ] 14 | then 15 | echo "Remove crontab: $CMD" 16 | return 0 17 | else 18 | echo "crontab already removed: $CMD" 19 | return 1 20 | fi 21 | } 22 | 23 | line1="*/1 * * * * /bin/sh /usr/local/nginx/bin/package_access_log.sh 1>/dev/null 2>&1" 24 | remove_crontab "$line1" 25 | line2="*/1 * * * * /bin/sh /usr/local/nginx/bin/package_log.sh 1>/dev/null 2>&1" 26 | remove_crontab "$line2" 27 | line3="*/5 * * * * /usr/bin/python /usr/local/nginx/bin/check_conf_to_reload.py 1>/dev/null 2>&1" 28 | remove_crontab "$line3" -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/rmcrontab.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | function remove_crontab() 3 | { 4 | CMD="$1" 5 | is_restart=0 6 | awk '$0 != MATCHSTR' MATCHSTR="$CMD" /var/spool/cron/root > /var/spool/cron/root.bak 7 | if diff /var/spool/cron/root /var/spool/cron/root.bak 1>/dev/null 2>&1 8 | then 9 | is_restart=1 10 | fi 11 | mv -f /var/spool/cron/root.bak /var/spool/cron/root 12 | chmod 600 /var/spool/cron/root 13 | if [ $is_restart -eq 0 ] 14 | then 15 | echo "Remove crontab: $CMD" 16 | return 0 17 | else 18 | echo "crontab already removed: $CMD" 19 | return 1 20 | fi 21 | } 22 | 23 | line1="*/1 * * * * /bin/sh /usr/local/nginx/bin/package_access_log.sh 1>/dev/null 2>&1" 24 | remove_crontab "$line1" 25 | line2="*/1 * * * * /bin/sh /usr/local/nginx/bin/package_log.sh 1>/dev/null 2>&1" 26 | remove_crontab "$line2" 27 | line3="*/5 * * * * /usr/bin/python /usr/local/nginx/bin/check_conf_to_reload.py 1>/dev/null 2>&1" 28 | remove_crontab "$line3" 29 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/gainCpuMem.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version analysis_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 本次测试的唯一标识 5 | 6 | totalC=0 7 | totalM=0 8 | PID_array=`ps -ef|grep nginx|grep worker|grep -v nobody|awk '{print $2}'` 9 | for PID in $PID_array 10 | do 11 | if test -n $PID 12 | then 13 | CPU=`top -b -p $PID -n 1|grep nginx|awk '{print strtonum($(NF-4))}'` 14 | MEM=`top -b -p $PID -n 1|grep nginx|awk '{print strtonum($(NF-3))}'` 15 | totalC=$(echo "scale=2; $totalC+$CPU" | bc) 16 | totalM=$(echo "scale=2; $totalM+$MEM" | bc) 17 | if [ ${5} = 0 ] 18 | then 19 | echo $CPU >> /usr/local/waf_test/baseline/${2}-${4}-${1}/cpu/$PID.CPU 20 | echo $MEM >> /usr/local/waf_test/baseline/${2}-${4}-${1}/mem/$PID.MEM 21 | else 22 | echo $CPU >> /usr/local/waf_test/analysis/${6}-${1}/cpu/test/$PID.CPU 23 | echo $MEM >> /usr/local/waf_test/analysis/${6}-${1}/mem/test/$PID.MEM 24 | fi 25 | fi 26 | done 27 | 28 | # 存储总的MEM和CPU 29 | if [ ${5} = 0 ] 30 | then 31 | echo $totalC >> /usr/local/waf_test/baseline/${2}-${4}-${1}/cpu/totalC 32 | echo $totalM >> /usr/local/waf_test/baseline/${2}-${4}-${1}/mem/totalM 33 | else 34 | echo $totalC >> /usr/local/waf_test/analysis/${6}-${1}/cpu/test/totalC 35 | echo $totalM >> /usr/local/waf_test/analysis/${6}-${1}/mem/test/totalM 36 | fi 37 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/finish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 本次测试的唯一标识 5 | 6 | # 在tmp目录下创建signal文件,作为logHandle.py结束的信号 7 | touch /usr/local/waf_test/tmp/signal 8 | sleep 100 9 | 10 | echo -n > /usr/local/waf_test/tmp/info.json 11 | if [ ${5} = 0 ] 12 | then 13 | echo "{\"result\":\"success\"}" > /usr/local/waf_test/tmp/info.json 14 | else 15 | # 基准版和测试版进行对比 16 | if [ -d "/usr/local/waf_test/baseline/${2}-${4}-${1}" ] 17 | then 18 | python2.7 /usr/local/waf_test/sbin/dataException_opt.py ${1} ${2} ${3} ${4} ${5} ${6} 19 | else 20 | dateStamp=$(date '+%Y-%m-%d:%H:%M:%S') 21 | echo "{\"error_type\":\"wswaf-${2} doesn't exist \", \"time\":\"$dateStamp\"}" >> /dev/stderr 22 | fi 23 | tar zcPf /usr/local/waf_test/analysis/${6}-${1}/upload.tar /usr/local/waf_test/analysis/${6}-${1}/format_error.log /usr/local/waf_test/analysis/${6}-${1}/report.txt /usr/local/waf_test/analysis/${6}-${1}/cpu /usr/local/waf_test/analysis/${6}-${1}/mem /usr/local/waf_test/analysis/${6}-${1}/domain 24 | echo "{\"result\":\"success\", \"file_path\":\"/usr/local/waf_test/analysis/${6}-${1}/upload.tar\"}" > /usr/local/waf_test/tmp/info.json 25 | fi 26 | 27 | 28 | curl -X POST http://127.0.0.1:60001/finished_bench -H "content-type:application/json" -T /usr/local/waf_test/tmp/info.json 29 | echo "finished" 30 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/opt_mode1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 本次测试的唯一标识 5 | 6 | # 创建不存在的新测试版本目录 7 | 8 | if [ ${5} = 1 ] 9 | then 10 | mkdir /usr/local/waf_test/analysis/${6}-${1} 11 | mkdir /usr/local/waf_test/analysis/${6}-${1}/mem 12 | mkdir /usr/local/waf_test/analysis/${6}-${1}/mem/baseline 13 | mkdir /usr/local/waf_test/analysis/${6}-${1}/mem/test 14 | mkdir /usr/local/waf_test/tmp/${6}-${1} 15 | mkdir /usr/local/waf_test/tmp/${6}-${1}/bak # 存放测试的access.log 16 | mkdir /usr/local/waf_test/analysis/${6}-${1}/cpu 17 | mkdir /usr/local/waf_test/analysis/${6}-${1}/cpu/baseline 18 | mkdir /usr/local/waf_test/analysis/${6}-${1}/cpu/test 19 | mkdir /usr/local/waf_test/tmp/${6}-${1}/error_status # 存放domain.log 20 | cp -rf /usr/local/waf_test/baseline/${2}-${4}-${1}/cpu/* /usr/local/waf_test/analysis/${6}-${1}/cpu/baseline 21 | cp -rf /usr/local/waf_test/baseline/${2}-${4}-${1}/mem/* /usr/local/waf_test/analysis/${6}-${1}/mem/baseline 22 | mkdir /usr/local/waf_test/analysis/${6}-${1}/domain 23 | mkdir /usr/local/waf_test/analysis/${6}-${1}/domain/baseline 24 | mkdir /usr/local/waf_test/analysis/${6}-${1}/domain/test 25 | else 26 | if [ -d "/usr/local/waf_test/baseline/${2}-${4}-${1}" ] 27 | then 28 | rm -rf /usr/local/waf_test/baseline/${2}-${4}-${1} 29 | rm -rf /usr/local/waf_test/tmp/${2}-${4}-${1} 30 | echo '基线版本已清空' 31 | fi 32 | mkdir /usr/local/waf_test/baseline/${2}-${4}-${1} 33 | mkdir /usr/local/waf_test/baseline/${2}-${4}-${1}/mem 34 | mkdir /usr/local/waf_test/baseline/${2}-${4}-${1}/cpu 35 | mkdir /usr/local/waf_test/tmp/${2}-${4}-${1} 36 | mkdir /usr/local/waf_test/tmp/${2}-${4}-${1}/bak 37 | mkdir /usr/local/waf_test/tmp/${2}-${4}-${1}/error_status 38 | fi 39 | 40 | # 每隔一分钟取日志的循环在这个Python脚本中执行,直接得到全部域名的状态码统计 41 | python2.7 /usr/local/waf_test/sbin/logHandle_opt.py ${1} ${2} ${3} ${4} ${5} ${6} 42 | 43 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time data_version guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 测试数据 唯一标识 模式 5 | 6 | 7 | # 检测当前waf版本是否对应,安装相应的waf版本 8 | current_version=`/usr/local/nginx/sbin/nginx -v 2>&1 |grep 'wswaf'|awk -F"[ /]" '{print $4}'|awk -F ".el6|.standalone" '{print $1}'` 9 | compare=$(echo $current_version ${1} | awk '$1>$2 {print 1} $1==$2 {print 0} $1<$2 {print 2}') 10 | if test -z $current_version 11 | then 12 | # 当前机器没有waf版本,安装对应的rpm包 13 | rpm -ivh /usr/local/waf_test/sbin/wswaf-${1}.el6.x86_64.rpm 14 | elif [ $compare = 1 ] 15 | then 16 | # 当前机器waf版本高于要安装的版本,需要回退 17 | rpm -Uvh /usr/local/waf_test/sbin/wswaf-${1}.el6.x86_64.rpm --oldpackage 18 | elif [ $compare = 2 ] 19 | then 20 | # 当前机器waf版本低于要安装的版本 21 | rpm -Uvh /usr/local/waf_test/sbin/wswaf-${1}.el6.x86_64.rpm 22 | else 23 | echo "correct waf version!" 24 | fi 25 | # 再次检测版本 26 | current_version=`/usr/local/nginx/sbin/nginx -v 2>&1 |grep 'wswaf'|awk -F"[ /]" '{print $4}'|awk -F ".el6|.standalone" '{print $1}'` 27 | if [ $current_version != ${1} ] 28 | then 29 | dateStamp=$(date '+%Y-%m-%d:%H:%M:%S') 30 | echo "{\"error_type\":\"wswaf-${1} install failed \", \"time\":\"$dateStamp\"}" >>/dev/stderr 31 | exit 1 32 | fi 33 | 34 | # 更改squid配置文件 35 | sed -i '/domain_replace_dst_ip/c\domain_replace_dst_ip 117.23.51.196' /usr/local/squid/etc/channel/ws_${2}.conf 36 | service squid reload 37 | sleep 60 38 | 39 | # 更改shark配置文件 40 | # s是替换,-i表示在原文件上操作,^表示句首,&表示在匹配到的字符前加入&前的字符#,g表示global全部替换,不加g表示只替换每行第一个 41 | sed -i 's/^[ ]*server 121.46.247.124:9101 max_fails=0;/#&/g' /usr/local/shark/etc/shark.conf 42 | service shark reload 43 | sleep 60 44 | 45 | # 关闭打包程序 46 | sh /usr/local/waf_test/sbin/rmcrontab.sh 47 | 48 | # 如果tmp下原有signal文件,则删除 49 | if test -e /usr/local/waf_test/tmp/${6} 50 | then 51 | rm -f /usr/local/waf_test/tmp/${6} 52 | fi 53 | 54 | # 清空access.log 55 | echo -n > /usr/local/nginx/logs/access/access.log 56 | 57 | echo "ready to analyze data!" 58 | sleep 60 59 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test_type baseline_version waf_version data_version operation guid 4 | # 压测类型 基线版本对应waf版本 当前需要测试的waf版本 压测数据版本 0:测试基线版本,1:测试waf版本 每次测试的唯一标识 5 | 6 | :<&1 |grep 'wswaf'|awk -F"[ /]" '{print $4}'|awk -F ".el6|.standalone" '{print $1}'` 21 | compare=$(echo $current_version ${3} | awk '$1>$2 {print 1} $1==$2 {print 0} $1<$2 {print 2}') 22 | if test -z $current_version 23 | then 24 | # 当前机器没有waf版本,安装对应的rpm包 25 | rpm -ivh /usr/local/waf_test/sbin/wswaf-${3}.el6.x86_64.rpm 26 | elif [ $compare = 1 ] 27 | then 28 | # 当前机器waf版本高于要安装的版本,需要回退 29 | rpm -Uvh /usr/local/waf_test/sbin/wswaf-${3}.el6.x86_64.rpm --oldpackage 30 | elif [ $compare = 2 ] 31 | then 32 | # 当前机器waf版本低于要安装的版本 33 | rpm -Uvh /usr/local/waf_test/sbin/wswaf-${3}.el6.x86_64.rpm 34 | else 35 | echo "correct waf version!" 36 | fi 37 | # 再次检测版本 38 | current_version=`/usr/local/nginx/sbin/nginx -v 2>&1 |grep 'wswaf'|awk -F"[ /]" '{print $4}'|awk -F ".el6|.standalone" '{print $1}'` 39 | if [ $current_version != ${3} ] 40 | then 41 | dateStamp=$(date '+%Y-%m-%d:%H:%M:%S') 42 | echo "{\"error_type\":\"wswaf-${3} install failed \", \"time\":\"$dateStamp\"}" >>/dev/stderr 43 | exit 1 44 | fi 45 | 46 | # 检查conf文件,替换成标准配置 47 | sed -i '/server 127.0.0.1/c\ server 127.0.0.1:7101 max_fails=0 fail_timeout=30s;' /usr/local/nginx/conf/nginx.conf 48 | 49 | # reload 50 | service nginx reload 51 | sleep 60 52 | 53 | # 关闭打包程序 54 | sh /usr/local/waf_test/sbin/rmcrontab.sh 55 | 56 | # 如果tmp下存在未删掉的signal文件,则删去 57 | if test -e /usr/local/waf_test/tmp/signal 58 | then 59 | rm -f /usr/local/waf_test/tmp/signal 60 | echo "signal已删除" 61 | fi 62 | 63 | # 清空access.log 64 | echo -n > /usr/local/nginx/logs/access/access.log 65 | 66 | echo "ready to analyze data!" 67 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/dataException_opt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2.7 2 | #coding=utf-8 3 | 4 | 5 | from __future__ import division 6 | import json 7 | import sys 8 | import logging 9 | import os 10 | 11 | logging.basicConfig(filename = "/usr/local/waf_test/logs/waf_test.log",level = logging.INFO, filemode = 'a', format = '%(asctime)s - %(levelname)s: %(message)s') 12 | 13 | 14 | if __name__ == '__main__': 15 | mode = sys.argv[1] 16 | baseline_version = sys.argv[2] 17 | waf_version = sys.argv[3] 18 | data_version = sys.argv[4] 19 | operation = sys.argv[5] 20 | guid = sys.argv[6] 21 | # 获取对应版本的路径,获取文件的位置 22 | baselinePath = '/usr/local/waf_test/baseline/' + baseline_version+'-'+data_version+'-'+mode 23 | testPath = '/usr/local/waf_test/analysis/' + guid + '-' + mode 24 | 25 | dic_normal = {} 26 | dic_test = {} 27 | # 基准版 28 | try: 29 | with open(baselinePath + "/totalData.json", "r") as f: 30 | dic_normal = json.load(f) 31 | except IOError as msg: 32 | logging.error(str(msg)) 33 | # 测试版 34 | try: 35 | with open(testPath + "/totalData.json", "r") as fp: 36 | dic_test = json.load(fp) 37 | except IOError as msg: 38 | logging.error(str(msg)) 39 | 40 | total_dic = {} 41 | with open(testPath + '/report.txt', 'a+') as fp: 42 | for key in set(dic_normal.keys()) | set(dic_test.keys()): 43 | if key in dic_normal and key not in dic_test: 44 | total_dic[key] = dic_normal[key] 45 | elif key in dic_test and key not in dic_normal: 46 | total_dic[key] = dic_test[key] 47 | else: 48 | for Key in (set(dic_normal[key].keys()) | set(dic_test[key].keys())): 49 | if Key in dic_test[key] and Key not in dic_normal[key]: 50 | total_dic[key] = dic_test[key] 51 | break 52 | elif Key in dic_test[key] and Key in dic_normal[key]: 53 | if (dic_test[key][Key] - dic_normal[key][Key]) / dic_normal[key][Key] > 0.1: 54 | total_dic[key] = [dic_normal[key], dic_test[key]] 55 | break 56 | fp.write(json.dumps(total_dic, indent=2, ensure_ascii=False) + '\n') 57 | 58 | if total_dic: 59 | for key in total_dic: 60 | try: 61 | if os.path.exists('/usr/local/waf_test/tmp/'+baseline_version+'-'+data_version+'-'+mode+'/error_status/'+key): 62 | os.system('cp -rf /usr/local/waf_test/tmp/'+baseline_version+'-'+data_version+'-'+mode+'/error_status/'+key+' '+testPath+'/domain/baseline/') 63 | if os.path.exists('/usr/local/waf_test/tmp/' + guid + '-' + mode + '/error_status/' + key): 64 | os.system('cp -rf /usr/local/waf_test/tmp/' + guid + '-' + mode + '/error_status/' + key + ' ' + testPath + '/domain/test/') 65 | except Exception as msg: 66 | logging.error(msg) 67 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_pressure/gainCpuMem.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # waf_version host concurrent_thread repeat_time data_version guid mode 4 | # waf版本 压测的域名 并发数 重复发送数据次数 测试数据 唯一标识 模式 5 | 6 | 7 | avg_nginxC=0 8 | avg_nginxM=0 9 | avg_sharkC=0 10 | avg_sharkM=0 11 | avg_squidC=0 12 | avg_squidM=0 13 | nginx_arrayC=() 14 | nginx_arrayM=() 15 | shark_arrayC=() 16 | shark_arrayM=() 17 | squid_arrayC=() 18 | squid_arrayM=() 19 | 20 | while true 21 | do 22 | if test -e /usr/local/waf_test/tmp/${6} 23 | then 24 | break 25 | fi 26 | 27 | echo 'one time' 28 | total_nginxC=0 29 | total_nginxM=0 30 | PID_nginx_array=`ps -ef|grep nginx|grep worker|grep -v nobody|awk '{print $2}'` 31 | nginx_len=0 32 | for PID in $PID_nginx_array 33 | do 34 | if test -n "$PID" 35 | then 36 | CPU=`top -b -p $PID -n 1|grep nginx|awk '{print strtonum($(NF-4))}'` 37 | MEM=`top -b -p $PID -n 1|grep nginx|awk '{print strtonum($(NF-3))}'` 38 | total_nginxC=$(echo "scale=2; $total_nginxC+$CPU" | bc) 39 | total_nginxM=$(echo "scale=2; $total_nginxM+$MEM" | bc) 40 | nginx_len=$[$nginx_len+1] 41 | echo $CPU >> /usr/local/waf_test/analysis/${6}-${7}/nginx/nginx-$PID.CPU 42 | echo $MEM >> /usr/local/waf_test/analysis/${6}-${7}/nginx/nginx-$PID.MEM 43 | fi 44 | done 45 | echo "nginx_len:$nginx_len" 46 | nginx_arrayC+=($(echo "scale=2; $total_nginxC/$nginx_len" | bc)) 47 | nginx_arrayM+=($(echo "scale=2; $total_nginxM/$nginx_len" | bc)) 48 | 49 | total_sharkC=0 50 | total_sharkM=0 51 | shark_len=0 52 | PID_shark_array=`ps -ef|grep shark|grep worker|awk '{print $2}'` 53 | for PID in $PID_shark_array 54 | do 55 | if test -n "$PID" 56 | then 57 | CPU=`top -b -p $PID -n 1|grep shark|awk '{print strtonum($(NF-4))}'` 58 | MEM=`top -b -p $PID -n 1|grep shark|awk '{print strtonum($(NF-3))}'` 59 | if test -z "$CPU" -o -z "$MEM" 60 | then 61 | continue 62 | fi 63 | total_sharkC=$(echo "scale=2; $total_sharkC+$CPU" | bc) 64 | total_sharkM=$(echo "scale=2; $total_sharkM+$MEM" | bc) 65 | shark_len=$[$shark_len+1] 66 | echo $CPU >> /usr/local/waf_test/analysis/${6}-${7}/shark/shark-$PID.CPU 67 | echo $MEM >> /usr/local/waf_test/analysis/${6}-${7}/shark/shark-$PID.MEM 68 | fi 69 | done 70 | echo "shark_len:$shark_len" 71 | shark_arrayC+=($(echo "scale=2; $total_sharkC/$shark_len" | bc)) 72 | shark_arrayM+=($(echo "scale=2; $total_sharkM/$shark_len" | bc)) 73 | 74 | 75 | total_squidC=0 76 | total_squidM=0 77 | squid_len=0 78 | PID_squid_array=`ps -ef|grep '(squid)'|grep -v root|awk '{print $2}'` 79 | for PID in $PID_squid_array 80 | do 81 | if test -n "$PID" 82 | then 83 | CPU=`top -b -p $PID -n 1|grep squid|awk '{print strtonum($(NF-4))}'` 84 | MEM=`top -b -p $PID -n 1|grep squid|awk '{print strtonum($(NF-3))}'` 85 | if test -z "$CPU" -o -z "$MEM" 86 | then 87 | continue 88 | fi 89 | total_squidC=$(echo "scale=2; $total_squidC+$CPU" | bc) 90 | total_squidM=$(echo "scale=2; $total_squidM+$MEM" | bc) 91 | squid_len=$[$squid_len+1] 92 | echo $CPU >> /usr/local/waf_test/analysis/${6}-${7}/squid/squid-$PID.CPU 93 | echo $MEM >> /usr/local/waf_test/analysis/${6}-${7}/squid/squid-$PID.MEM 94 | fi 95 | done 96 | echo "squid_len:$squid_len" 97 | squid_arrayC+=($(echo "scale=2; $total_squidC/$squid_len" | bc)) 98 | squid_arrayM+=($(echo "scale=2; $total_squidM/$squid_len" | bc)) 99 | 100 | sleep 5 101 | done 102 | 103 | len=${#nginx_arrayC[*]} 104 | for((i=1;i<$[$len-3];i++)) 105 | do 106 | avg_nginxC=$(echo "scale=2; $avg_nginxC+${nginx_arrayC[i]}" | bc) 107 | avg_nginxM=$(echo "scale=2; $avg_nginxM+${nginx_arrayM[i]}" | bc) 108 | avg_sharkC=$(echo "scale=2; $avg_sharkC+${shark_arrayC[i]}" | bc) 109 | avg_sharkM=$(echo "scale=2; $avg_sharkM+${shark_arrayM[i]}" | bc) 110 | avg_squidC=$(echo "scale=2; $avg_squidC+${squid_arrayC[i]}" | bc) 111 | avg_squidM=$(echo "scale=2; $avg_squidM+${squid_arrayM[i]}" | bc) 112 | done 113 | 114 | avg_nginxC=$(echo "scale=2; $avg_nginxC/($len-4)" | bc) 115 | avg_nginxM=$(echo "scale=2; $avg_nginxM/($len-4)" | bc) 116 | avg_sharkC=$(echo "scale=2; $avg_sharkC/($len-4)" | bc) 117 | avg_sharkM=$(echo "scale=2; $avg_sharkM/($len-4)" | bc) 118 | avg_squidC=$(echo "scale=2; $avg_squidC/($len-4)" | bc) 119 | avg_squidM=$(echo "scale=2; $avg_squidM/($len-4)" | bc) 120 | 121 | echo "nginx: ${nginx_arrayC[*]}" >> /usr/local/waf_test/analysis/${6}-${7}/avg 122 | echo "shark: ${shark_arrayC[*]}" >> /usr/local/waf_test/analysis/${6}-${7}/avg 123 | echo "squid: ${squid_arrayC[*]}" >> /usr/local/waf_test/analysis/${6}-${7}/avg 124 | 125 | echo "avg_nginxC=$avg_nginxC" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 126 | echo "avg_nginxM=$avg_nginxM" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 127 | echo "avg_sharkC=$avg_sharkC" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 128 | echo "avg_sharkM=$avg_sharkM" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 129 | echo "avg_squidC=$avg_squidC" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 130 | echo "avg_squidM=$avg_squidM" >> /usr/local/waf_test/analysis/${6}-${7}/report.txt 131 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_quality/play_back.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding=utf-8 3 | 4 | import logging 5 | import os,sys,time,socket,threading,copy,StringIO,cPickle,subprocess,fcntl,struct,signal,shutil,commands,logging,datetime,json,platform,re 6 | import re,ConfigParser 7 | import time 8 | #import redis 9 | import Queue 10 | import thread 11 | 12 | 13 | 14 | work_dir = "/usr/local/waf_test/" 15 | nginx_work_dir = "/usr/local/nginx/conf/servers/" 16 | logging.basicConfig(filename = work_dir + "logs/waf_test.log",level = logging.INFO, filemode = 'a', format = '%(asctime)s - %(levelname)s: %(message)s') 17 | data_dir = work_dir + "datas/" 18 | worker_num = 5 19 | exit_worker = 0 20 | status_list={} 21 | total_num=0 22 | ok_num=0 23 | err_num=0 24 | use_time=0 25 | q = Queue.Queue(maxsize = 0) 26 | lock=threading.Lock() 27 | conf_list=[] 28 | 29 | def main(): 30 | global use_time 31 | #file_path=sys.argv[1] 32 | ip=sys.argv[1] 33 | init_conf_list() 34 | init_data_list() 35 | #sock=connect_web(ip) 36 | start_time=time.time() 37 | init_work_list(ip) 38 | #do_replay(sock,file_path,ip) 39 | while 1: 40 | if exit_worker == worker_num: 41 | break 42 | time.sleep(1) 43 | end_time=time.time() 44 | use_time= end_time - start_time 45 | play_summary(use_time) 46 | 47 | 48 | def init_data_list(): 49 | try: 50 | dir_list = os.listdir(data_dir) 51 | if not dir_list: 52 | return 53 | else: 54 | for file_name in dir_list : 55 | q.put(data_dir + file_name) 56 | except Exception, e: 57 | logging.error(e) 58 | 59 | time.sleep(1) 60 | 61 | def init_conf_list(): 62 | global conf_list 63 | try: 64 | dir_list = os.listdir(nginx_work_dir) 65 | if not dir_list: 66 | return 67 | else: 68 | for file_name in dir_list : 69 | server_name = file_name[:-5] 70 | conf_list.append(server_name) 71 | except Exception, e: 72 | logging.error(e) 73 | 74 | 75 | def init_work_list(ip): 76 | thread.start_new_thread(replay_work, (ip,"")) 77 | thread.start_new_thread(replay_work, (ip,"")) 78 | thread.start_new_thread(replay_work, (ip,"")) 79 | thread.start_new_thread(replay_work, (ip,"")) 80 | thread.start_new_thread(replay_work, (ip,"")) 81 | 82 | def replay_work(ip,data): 83 | global exit_worker 84 | global lock 85 | 86 | while q.empty() == False: 87 | try: 88 | file_path = q.get() 89 | do_replay(ip,file_path) 90 | except Exception, e: 91 | logging.error(e) 92 | print "no file" 93 | if lock.acquire(): 94 | exit_worker=exit_worker+1 95 | lock.release() 96 | 97 | def do_replay(ip,file_path): 98 | global total_num 99 | split_num = 0; 100 | request_data="" 101 | print file_path 102 | with open(file_path,"r") as f: 103 | for line in f.readlines(): 104 | if line=="====****\n": 105 | #print re.sub("Host:.*\r\n","Host: www.linsd.com\r\n",request_data) 106 | send_http_request(request_data,ip) 107 | #request_data = request_data + "###@@@" 108 | #total_num=total_num+1 109 | #split_num = split_num + 1 110 | #if split_num == 100: 111 | # thread.start_new_thread(replay_work, (ip,request_data)) 112 | # split_num = 0 113 | request_data = "" 114 | else: 115 | request_data = request_data + line 116 | 117 | 118 | def fPopen(aCmd): 119 | p=subprocess.Popen(aCmd, shell=True, bufsize=4096,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) 120 | sOut = p.stdout.read() 121 | sErr = p.stderr.read() 122 | return (sOut,sErr) 123 | 124 | def send_http_request(request_data,ip): 125 | for i in conf_list: 126 | url = "https://" + i + "/" 127 | request_data = re.sub("https://(.+?)/",url,request_data) 128 | host_name = "Host: "+ i + "\r\n" 129 | #print host_name 130 | request_data = re.sub("Host:.*\r\n",host_name,request_data) 131 | #print request_data 132 | send_request(request_data,ip) 133 | 134 | 135 | def send_request(data,ip): 136 | global ok_num 137 | global err_num 138 | global status_list 139 | global lock 140 | try: 141 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 142 | sock.connect((ip, 9101)) 143 | http_request = data 144 | sock.send(http_request) 145 | rev_data = sock.recv(1024) 146 | status = rev_data[9:12] 147 | print status 148 | if lock.acquire(): 149 | if status_list.has_key(status): 150 | status_list[status]=status_list[status] + 1 151 | else: 152 | status_list[status]=1 153 | ok_num=ok_num+1 154 | print str(ok_num) 155 | lock.release() 156 | 157 | sock.close() 158 | except socket.error, msg: 159 | err_num=err_num+1 160 | logging.error(msg) 161 | except Exception, e: 162 | err_num=err_num+1 163 | logging.error(e) 164 | def play_summary(use_time): 165 | print status_list 166 | print "total_num: " + str(total_num) 167 | print "ok_num: " + str(ok_num) 168 | print "err_num: " + str(err_num) 169 | print "use_time: " + str(use_time) 170 | 171 | if __name__ == "__main__": 172 | main() 173 | sys.exit(0) 174 | -------------------------------------------------------------------------------- /Waf_auto_pretest/wafServer_quality/logHandle_opt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2.7 2 | #coding=utf-8 3 | 4 | import pandas as pd 5 | import json 6 | import os 7 | import time 8 | import sys 9 | import logging 10 | import commands 11 | 12 | 13 | logging.basicConfig(filename = "/usr/local/waf_test/logs/waf_test.log",level = logging.INFO, filemode = 'a', format = '%(asctime)s - %(levelname)s: %(message)s') 14 | 15 | 16 | if __name__ == '__main__': 17 | # 获取压测版本 18 | mode = sys.argv[1] 19 | baseline_version = sys.argv[2] 20 | waf_version = sys.argv[3] 21 | data_version = sys.argv[4] 22 | operation = sys.argv[5] 23 | guid = sys.argv[6] 24 | 25 | # 获取对应版本的路径,文件需要放的位置 26 | if operation == "0": 27 | path = '/usr/local/waf_test/baseline/' + waf_version + '-' + data_version + '-' + mode 28 | else: 29 | path = '/usr/local/waf_test/analysis/' + guid + '-' + mode 30 | 31 | errorDic = {} # 按域名存储错误日志 32 | total_dic = {} # 按域名存储状态码信息 33 | format_error = [] 34 | header = ['wafStatus', 'original_status', 'channel'] 35 | total = ['400', '403', '408', '499', '500', '502', '503'] 36 | 37 | while True: 38 | res = [] 39 | if os.path.exists('/usr/local/nginx/logs/access/access.log') and os.path.getsize('/usr/local/nginx/logs/access/access.log'): 40 | # 拉取日志 41 | try: 42 | os.system('rm -f /usr/local/waf_test/tmp/tmp/*') 43 | os.system('mv /usr/local/nginx/logs/access/access.log /usr/local/waf_test/tmp/tmp/access.log') 44 | print('拉取日志成功') 45 | except Exception as msg: 46 | logging.error(str(msg)) 47 | 48 | # 通知进程重新产生日志 49 | count = 0 50 | while count < 3: 51 | _, pID = commands.getstatusoutput('cat /usr/local/nginx/logs/nginx.pid') 52 | os.system('kill -s USR1 ' + pID) 53 | time.sleep(5) 54 | if os.path.exists('/usr/local/nginx/logs/access/access.log'): 55 | print('access.log regenerate succeed') 56 | break 57 | count += 1 58 | if count == 3: 59 | print('access.log regenerate failed') 60 | logging.error('access.log regenerate failed') 61 | 62 | # 对本次拉取的日志进行分析 63 | with open("/usr/local/waf_test/tmp/tmp/access.log", "r") as f: 64 | for line in f: 65 | if line.find('pepp4_') == -1: 66 | try: 67 | lineList = [] 68 | index1 = line.index('HTTP/') 69 | index2 = line[index1 + 10:].index(' ') 70 | Li = line[index1:index1 + 10 + index2].split() 71 | index3 = line.index('WAF_') 72 | li = line[index3:].split() 73 | # 保存异常状态的日志信息,按域名分类 74 | if li[5] == '-' and Li[1] in total: 75 | lineList.append(Li[1]) 76 | lineList.append(li[5]) 77 | lineList.append(li[6]) 78 | res.append(lineList) 79 | if lineList[2] in errorDic: 80 | errorDic[lineList[2]].append(line) 81 | else: 82 | errorDic.setdefault(lineList[2], [line]) 83 | except (Exception, ValueError): 84 | format_error.append(line) 85 | 86 | pf = pd.DataFrame(res, columns=header) 87 | typeList = pf['channel'].unique() 88 | # 生成所有状态码统计文件 89 | if len(pf) > 0: 90 | for Type in typeList: 91 | pf_ii = pf[pf['channel'].isin([Type])] 92 | Se = pf_ii['wafStatus'].value_counts() 93 | statusCode = eval(Se.to_json()) 94 | # 合并域名相同的状态码数量 95 | if Type in total_dic: 96 | for key in statusCode: 97 | if key in total_dic[Type]: 98 | total_dic[Type][key] += statusCode[key] 99 | else: 100 | total_dic[Type][key] = statusCode[key] 101 | else: 102 | total_dic[Type] = statusCode 103 | 104 | # 获取时间戳 105 | time_tup = time.localtime(time.time()) 106 | format_time = '%Y%m%d%H%M%S' 107 | dateStamp = time.strftime(format_time, time_tup) 108 | if operation == "0": 109 | os.system('mv /usr/local/waf_test/tmp/tmp/access.log /usr/local/waf_test/tmp/' + waf_version + '-' + data_version + '-' + mode + '/bak/access.log.' + dateStamp) 110 | else: 111 | os.system('mv /usr/local/waf_test/tmp/tmp/access.log /usr/local/waf_test/tmp/' + guid + '-' + mode + '/bak/access.log.' + dateStamp) 112 | 113 | # 获取CPU及MEM,传参为测试类别和测试版本 114 | os.system('sh /usr/local/waf_test/sbin/gainCpuMem.sh' + ' ' + mode + ' ' + baseline_version + ' ' + waf_version + ' ' + data_version + ' ' + operation + ' ' + guid) 115 | 116 | 117 | # 程序结束的标志 118 | if os.path.exists('/usr/local/waf_test/tmp/signal') and not os.path.getsize('/usr/local/nginx/logs/access/access.log'): 119 | break 120 | 121 | # 每隔一分钟取一次日志 122 | print('sleep一分钟') 123 | time.sleep(60) 124 | 125 | # 按域名记录所有异常日志 126 | if operation == "0": 127 | pa = '/usr/local/waf_test/tmp/' + baseline_version+'-'+data_version+'-'+mode 128 | else: 129 | pa = '/usr/local/waf_test/tmp/' + guid + '-' + mode 130 | for key in errorDic: 131 | with open(pa + '/error_status/' + key, 'w') as fp: 132 | for error in errorDic[key]: 133 | fp.write(error) 134 | print('异常日志记录成功') 135 | 136 | # 按域名记录状态码信息 137 | with open(path + '/totalData.json', 'w') as f: 138 | f.write(json.dumps(total_dic, indent=2) + '\n') 139 | print('状态码记录成功') 140 | 141 | # 记录格式错误的日志信息 142 | with open(path + '/format_error.log', 'w')as fp: 143 | for log in format_error: 144 | fp.write(log) 145 | print('格式错误日志记录成功') 146 | -------------------------------------------------------------------------------- /Waf_auto_pretest/benchServer_pressure/play_back.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding=utf-8 3 | 4 | from __future__ import division 5 | import logging 6 | import os,sys,time,socket,threading,copy,StringIO,cPickle,subprocess,fcntl,struct,signal,shutil,commands,logging,datetime,json,platform,re 7 | import re,ConfigParser 8 | import time 9 | #import redis 10 | import Queue 11 | import thread 12 | 13 | 14 | # 传参:waf版本 域名 并发数 重复次数 测试数据 唯一id 15 | 16 | work_dir = "/usr/local/waf_test/" 17 | nginx_work_dir = "/usr/local/nginx/conf/servers/" 18 | logging.basicConfig(filename = work_dir + "logs/waf_test.log",level = logging.INFO, filemode = 'a', format = '%(asctime)s - %(levelname)s: %(message)s') 19 | data_dir = work_dir + "datas/" 20 | worker_num = int(sys.argv[3]) 21 | exit_worker = 0 22 | status_list={} 23 | total_num=0 24 | ok_num1=0 25 | err_num=0 26 | use_time=0 27 | q = Queue.Queue(maxsize = 0) 28 | lock=threading.Lock() 29 | host = sys.argv[2] 30 | repeat_time = int(sys.argv[4]) 31 | guid = sys.argv[6] 32 | mode = sys.argv[7] 33 | count=0 34 | qps=[] 35 | requests_info = {} 36 | data_len = 0 37 | for i in range(0, worker_num): 38 | requests_info[i] = Queue.Queue(maxsize = 0) 39 | 40 | def main(): 41 | global use_time 42 | global start 43 | #file_path=sys.argv[1] 44 | ip='115.54.16.68' 45 | init_data_list() # 初始化数据 46 | #sock=connect_web(ip) 47 | start_time=time.time() 48 | start = time.time() 49 | init_work_list(ip) 50 | #do_replay(sock,file_path,ip) 51 | while 1: 52 | if exit_worker == worker_num: 53 | break 54 | time.sleep(1) 55 | end_time=time.time() 56 | use_time= end_time - start_time 57 | play_summary(use_time) 58 | 59 | 60 | def init_data_list(): 61 | all_request = [] 62 | try: 63 | dir_list = os.listdir(data_dir) 64 | if not dir_list: 65 | return 66 | else: 67 | for file_name in dir_list: 68 | split_num = 0; 69 | request_data="" 70 | #print file_path 71 | file_path = data_dir + file_name 72 | with open(file_path,"r") as f: 73 | for line in f.readlines(): 74 | if line=="====****\n": 75 | #print re.sub("Host:.*\r\n","Host: www.linsd.com\r\n",request_data) 76 | #send_http_request(request_data,ip) 77 | #for i in conf_list: 78 | i = "botsec.haplat.net" 79 | url = "http://" + i + "/" 80 | request_data = re.sub("http[s]?://(.+?)/",url,request_data) 81 | #request_data = re.sub("http://(.+?)/",url,request_data) 82 | host_name = "Host: "+ i + "\r\n" 83 | #print host_name 84 | request_data = re.sub("Host:.*\r\n",host_name,request_data) 85 | #print request_data 86 | #print request_data 87 | all_request.append(request_data) 88 | #request_data = request_data + "###@@@" 89 | #total_num=total_num+1 90 | #split_num = split_num + 1 91 | #if split_num == 100: 92 | # thread.start_new_thread(replay_work, (ip,request_data)) 93 | # split_num = 0 94 | request_data = "" 95 | else: 96 | request_data = request_data + line 97 | except Exception, e: 98 | logging.error(e) 99 | 100 | for i in range(0, repeat_time): 101 | request_num = len(all_request) 102 | for j in range(request_num): 103 | for k in range(0, worker_num): 104 | requests_info[k].put(all_request[j]) 105 | 106 | time.sleep(1) 107 | 108 | 109 | def init_work_list(ip): 110 | for i in range(worker_num): 111 | thread.start_new_thread(replay_work, (ip,"", i)) 112 | 113 | def replay_work(ip,data, worker_id): 114 | global exit_worker 115 | global lock 116 | global ok_num1 117 | global qps 118 | 119 | while requests_info[worker_id].empty() == False: 120 | try: 121 | request_data = requests_info[worker_id].get() 122 | send_request(request_data,ip,worker_id) 123 | except Exception, e: 124 | logging.error(e) 125 | if requests_info[worker_id].empty(): 126 | print "no requests" 127 | if lock.acquire(): 128 | exit_worker=exit_worker+1 129 | lock.release() 130 | 131 | 132 | def fPopen(aCmd): 133 | p=subprocess.Popen(aCmd, shell=True, bufsize=4096,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) 134 | sOut = p.stdout.read() 135 | sErr = p.stderr.read() 136 | return (sOut,sErr) 137 | 138 | def send_request(data,ip,worker_id): 139 | global ok_num1 140 | global err_num 141 | global status_list 142 | global lock 143 | global end 144 | global start 145 | global data_len 146 | try: 147 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 148 | sock.connect((ip, 80)) 149 | http_request = data 150 | sock.send(http_request) 151 | rev_data = sock.recv(1024) 152 | status = rev_data[9:12] 153 | #print status 154 | if lock.acquire(): 155 | ok_num1 += 1 156 | data_len += len(data) 157 | #print ok_num1 158 | if ok_num1 == 100000: 159 | end = time.time() 160 | Qps = 100000/(end - start) 161 | s = 'data_len:' + str(data_len) + 'start:' + str(start) + ' end:' + str(end) + ' qps:' + str(Qps) 162 | print s 163 | qps.append(s) 164 | ok_num1 = 0 165 | start = time.time() 166 | data_len = 0 167 | lock.release() 168 | sock.close() 169 | except socket.error, msg: 170 | err_num=err_num+1 171 | logging.error(msg) 172 | except Exception, e: 173 | err_num=err_num+1 174 | logging.error(e) 175 | 176 | 177 | def play_summary(use_time): 178 | with open(work_dir + 'analysis/' + guid + '-' + mode + '/report.txt', 'w') as f: 179 | for element in qps: 180 | f.write(str(element) + '\n') 181 | # print "total_num: " + str(total_num) 182 | print "ok_num1: " + str(ok_num1) 183 | print "err_num: " + str(err_num) 184 | print "use_time: " + str(use_time) 185 | 186 | if __name__ == "__main__": 187 | main() 188 | sys.exit(0) 189 | --------------------------------------------------------------------------------