通过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编写检测数据库SA用户的方法
Jul 11 Python
Python3基础之基本运算符概述
Aug 13 Python
Python os模块学习笔记
Jun 21 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
python函数的5种参数详解
Feb 24 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
Python安装selenium包详细过程
Jul 23 Python
python selenium循环登陆网站的实现
Nov 04 Python
python实现超级玛丽游戏
Mar 18 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
倩碧英国官网:Clinique英国
2018/08/10 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
自考毕业自我鉴定范文
2013/10/27 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
辞职离别感言
2015/08/04 职场文书
mysql left join快速转inner join的过程
2021/06/30 MySQL
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python