在python中查看关键字、需要执行_通过Python扫描代码关键字并进行预警

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

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

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

Python安装

Git安装

GitPython安装

定时任务配置(方案一:crontab 方案二:APScheduler)

git代码获取

关键词扫描

邮件告警

#安装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安装完毕,通过命令验证

675932-20200514153056970-1559560013.png

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安装完毕,通过命令验证

675932-20200514154202332-1954958215.png

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 importRepoimportos

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

675932-20200523114946810-1796266114.png

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

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

675932-20200523114639446-1910837764.png

主要内容是在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验证下:

675932-20200523115844974-2114312887.png

675932-20200523120000336-817214229.png

git代码获取

通过Repo.clone_from获取远程代码仓库,指定master分支,将远程代码库clone到本地/opt/workspace/demo目录下,

如果当前目录不为空,则通过shutil.rmtree()进行级联删除

675932-20200523120241033-868950921.png

关键词扫描

利用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命令,实现最终脚本的后台运行

#文章中的安装包,如果有需要可以站内信联系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值