通过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函数参数*args**kwargs用法实例
Dec 04 Python
跟老齐学Python之坑爹的字符编码
Sep 28 Python
Python实现控制台进度条功能
Jan 04 Python
python getopt详解及简单实例
Dec 30 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python使用minimax算法实现五子棋
Jul 29 Python
Python字符串的修改方法实例
Dec 19 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
Django Model中字段(field)的各种选项说明
May 19 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
js倒计时小程序
2013/11/05 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
理解javascript对象继承
2016/04/17 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python中的包和模块实例
2014/11/22 Python
使用Python抓取模板之家的CSS模板
2015/03/16 Python
用python爬取租房网站信息的代码
2018/12/14 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python实现微信好友的数据分析
2019/12/16 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python 中如何写注释
2020/08/28 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
总经理助理岗位职责范本
2014/07/20 职场文书
一个都不能少观后感
2015/06/04 职场文书
首次购房证明
2015/06/19 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
springboot入门 之profile设置方式
2022/04/04 Java/Android
Springboot中如何自动转JSON输出
2022/06/16 Java/Android