通过Python扫描代码关键字并进行预警的实现方法


Posted in Python onMay 24, 2020

近期线上出现一个bug,研发的小伙伴把测试环境的地址写死到代码中,在上线前忘记修改,导致线上发布的代码中使用了测试环境地址。

开发过程中虽然有各种规范制度,但是难免有粗心,与其责备不如通过技术手段将问题进行避免。

为了达到上述需求,初步想通过以下步骤来实现代码关键字自动扫描告警。

  1. Python安装
  2. Git安装
  3. GitPython安装
  4. 定时任务配置(方案一:crontab   方案二:APScheduler)
  5. git代码获取
  6. 关键词扫描
  7. 邮件告警
#安装python的依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel gcc
#下载Python安装包,版本号:Python-3.7.1.tgz(在/opt下创建目录Python3)
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
#解压安装包
tar -zxvf Python-3.8.1.tgz
#指定python3安装目录
./configure --prefix=/usr/local/python3
#编译&安装
make && make install
#创建软连接,将自定目录管理到指定目录
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
#添加环境变量
vi /etc/profile
export PATH=/usr/local/python3/bin:$PATH
 source /etc/profile

#至此Python3安装完毕,通过命令验证

通过Python扫描代码关键字并进行预警的实现方法

Git安装
#下载git安装包,版本号:2.21.0
wget https://github.com/git/git/archive/v2.21.0.tar.gz
#解压
tar -zxvf v2.21.0.tar.gz
#安装
make prefix=/usr/local/git install
#添加环境变量
vi /etc/profile
export PATH=/usr/local/git/bin:$PATH
source /etc/profile
 #至此Python3安装完毕,通过命令验证

通过Python扫描代码关键字并进行预警的实现方法

GitPython3安装
#可以采用在线安装
pip3 install GitPython
#但是我这里由于网络限制无法在线安装,只能采用手动安装
#下载依赖包,下载地址https://pypi.org/,可以根据关键字smmap、gitdb进行检索下载
smmap-3.0.4.tar.gz
gitdb-4.0.5.tar.gz
#安装
tar -zxvf smmap-3.0.4.tar.gz
cd smmap-3.0.4
python3 setup.py install

tar -zxvf gitdb-4.0.5.tar.gz
cd gitdb-4.0.5
python3 setup.py install

tar -zxvf GitPython-3.1.2
cd GitPython-3.1.2
python3 setup.py install

#安装完毕后,可以写一个demo.py进行验证
复制代码
from git.repo import Repo
import os

demo_git_path = '/opt/workspace/demo'

#定义本地目录
Repo.clone_from('http://git.***.com/demo/demo_git.git',to_path=demo_git_path, branch='master')
复制代码
 #最终代码库将克隆到本地目录(执行前将demo.py赋权)

 python3 demo.py
linux下配置定时任务
#定时任务采用linux的crontab来实现
#编辑定时任务
crontab -e
* * * * * python3 /opt/python3-workspace/demo.py >> /opt/python3-workspace/logs/demo.log
#前五个是时间指令,分钟(0-59)小时(0-28)日期(1-31)月份(1-12)星期几(0-6,其中0代表星期日)
#python3 是具体执行的指令 后面跟的是执行的脚本 在后面跟的是日志
#编辑保存后会立即执行
#查看当前正在运行的任务,本案例中已临时注释#
crontab -l

通过Python扫描代码关键字并进行预警的实现方法

原计划使用linux的crontab进行任务调度,但是在执行GitPython命令时遇到两个问题,即

问题一:在crontab中无法调用GitPython命令,解决方案,在crontab中增加GitPython的路径

通过Python扫描代码关键字并进行预警的实现方法

主要内容是在crontab中增加如下代码,至此第问题一可以解决

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/root/bin
MAILTO=root
HOME=/

问题二:在crontab中执行GitPython命令时,无法读取linux记录的账号密码,导致自动任务始终无法检出代码,由于该问题一直未解决,因此决定采用python的定时任务调度解决该问题,具体见下文

APScheduler安装
#这里由于网络限制无法在线安装,只能采用手动安装
#下载依赖包,下载地址https://pypi.org/,可以根据关键字pytz、six、tzlocal进行检索下载
pytz-2020.1.tar.gz
six-1.14.0.tar.gz
tzlocal-2.1.tar.gz
APScheduler-3.6.3.tar.gz

#安装tzlocal
tar -zxvf tzlocal-2.1.tar.gz
cd tzlocal-2.1
python3 setup.py install

#安装six
tar -zxvf six-1.14.0.tar.gz
cd six-1.14.0
python3 setup.py install

#安装pytz
tar -zxvf pytz-2020.1.tar.gz
cd pytz-2020.1
python3 setup.py install

#安装APScheduler
tar -zxvf APScheduler-3.6.3.tar.gz
cd APScheduler-3.6.3
python3 setup.py install

至次APScheduler安装完毕,写个demo验证下:

通过Python扫描代码关键字并进行预警的实现方法

通过Python扫描代码关键字并进行预警的实现方法

git代码获取

通过Repo.clone_from获取远程代码仓库,指定master分支,将远程代码库clone到本地/opt/workspace/demo目录下,
如果当前目录不为空,则通过shutil.rmtree()进行级联删除

通过Python扫描代码关键字并进行预警的实现方法

关键词扫描
利用os组件,实现对指定目录进行递归扫描,将符合要求的文件扩展名.css .js .ftl .properties等文件进行逐行扫描
关键词扫描其实就是利用正则表达式,对要扫描的关键词进行匹配,如果匹配成功则将目标文件名称放入到异常文件列表
详细代码如下:
import os
import re
project_git_path = '/opt/workspace/demo'
cssnum = 0
jsnum = 0
ftlnum = 0
fileList = []
pattern = re.compile(r'.test.com')
def analysiFile(pathFilename):
 #print('文件名:', filename)
 fo = open(pathFilename, 'r', encoding='UTF-8')
 for line in fo.readlines():
  match = pattern.search(line)
  if match:
   if(fileList.count(filename) == 0):
    fileList.append(filename);
#循环打印目录下的所有文件
for parentdir, dirname, filenames in os.walk(project_git_path):
 for filename in filenames:
  if os.path.splitext(filename)[1] == '.css':
   #分析具体文件
   analysiFile(parentdir + '\\' + filename)
  if os.path.splitext(filename)[1] == '.js':
   #分析具体文件
   analysiFile(parentdir + '\\' + filename)
  if os.path.splitext(filename)[1] == '.ftl':
   #分析具体文件
   analysiFile(parentdir + '\\' + filename)
  if os.path.splitext(filename)[1] == '.properties':
   #分析具体文件
   analysiFile(parentdir + '\\' + filename)
for item in fileList:
 print('命中文件:', item)
print('共计:', len(fileList))
邮件告警
邮件告警即通过smtp服务将上述匹配出来的异常文件列表,发送给对应系统负责人
详细代码如下:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host = "smtp.****.com" # 设置服务器
mail_user = "*****@****.com" # 用户名
mail_pass = "*****" # 口令
sender = '*****@****.com'
receivers = ['***@***.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("Python自动化检查", 'utf-8')
message['To'] = Header("系统负责人", 'utf-8')
subject = '某系统近2个月版本内网域名检查结果'
message['Subject'] = Header(subject, 'utf-8')
try:
 smtpObj = smtplib.SMTP()
 smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
 smtpObj.login(mail_user, mail_pass)
 smtpObj.sendmail(sender, receivers, message.as_string())
 print
 "邮件发送成功"
except smtplib.SMTPException:
 print
 "Error: 无法发送邮件"

至此,该项目所需要的所有模块均已开发完毕,最后只需要根据自己的实际需求将上述各个模块组合在一起运行即可

由于本人是python初学者,代码基本是按照顺序执行的方式进行设计的,以能实现最终目的为主,为对代码结构、性能等合理性做出特别考虑

最后利用nohup命令,实现最终脚本的后台运行

总结

到此这篇关于通过Python扫描代码关键字并进行预警的文章就介绍到这了,更多相关Python扫描代码关键字预警内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python的Django框架中的通用视图
May 04 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Python在图片中添加文字的两种方法
Apr 29 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
django 数据库返回queryset实现封装为字典
May 19 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
关于keras中keras.layers.merge的用法说明
May 23 #Python
使用keras2.0 将Merge层改为函数式
May 23 #Python
使用keras实现densenet和Xception的模型融合
May 23 #Python
在keras下实现多个模型的融合方式
May 23 #Python
Keras使用ImageNet上预训练的模型方式
May 23 #Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 #Python
基于Python中random.sample()的替代方案
May 23 #Python
You might like
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
教师外出学习心得体会
2016/01/18 职场文书
员工给公司的建议书
2019/06/24 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
Mysql数据库group by原理详解
2022/07/07 MySQL