近期线上出现一个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安装完毕,通过命令验证

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

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

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

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

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

git代码获取

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

关键词扫描
利用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扫描代码关键字并进行预警的更多相关文章

  1. python flake8 代码扫描

    一.介绍 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,flake8是下面三个工具的封装: PyFlakes Pep8 NedBatchelder's McCab ...

  2. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  3. Python中的关键字的用法

    Python有哪些关键字 -Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, ...

  4. python扫描proxy并获取可用代理ip列表

    mac或linux下可以work的代码如下: # coding=utf-8 import requests import re from bs4 import BeautifulSoup as bs ...

  5. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  6. Python 的with关键字

    Python 的with关键字 看别人的代码时,with关键字经常会出现,博主决定梳理一下with以及python中上下文(context)的概念 1. 上下文管理器概念 Context Manage ...

  7. Python基础代码1

    Python基础代码 import keyword#Python中关键字 print(keyword.kwlist) ['False', 'None', 'True', 'and', 'as', 'a ...

  8. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  9. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

随机推荐

  1. ip-端口-协议等基本概念

    互联网上的计算机,都会有一个唯一的32位的地址——ip地址.我们访问服务器,就必须通过这个ip地址.   局域网里也有预留的ip地址:192/10/172开头.局域网里的ip地址也是唯一的.   NA ...

  2. Python3的日期和时间

    2019独角兽企业重金招聘Python工程师标准>>> python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一 ...

  3. FastJson踩坑:@JsonField在反序列化时失效

    问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArray对象,用得到的 ...

  4. JAVA学习之路 (五) 类

    java类的学习 先上一个代码 package bankCard; import java.util.Scanner; // 银行卡类 public class bankCard { // 静态变量 ...

  5. Hadoop学习笔记(三) ——HDFS

    参考书籍:<Hadoop实战>第二版 第9章:HDFS详解 1. HDFS基本操作 @ 出现的bug信息 @-@ WARN util.NativeCodeLoader: Unable to ...

  6. 数据库SQL语言从入门到精通--Part 3--SQL语言基础知识

    数据库从入门到精通合集(超详细,学习数据库必看) 一.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 从用户角度,关系模型中数据的逻辑结构是 ...

  7. 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)

    最近想学DP,锻炼思维,记录一下自己踩到的坑,来写一波详细的结题报告,持续更新. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem ...

  8. 「译」Graal JIT编译器是如何工作的

    原文Understanding How Graal Works - a Java JIT Compiler Written in Java,讲了jvmci和ideal graph的基本概念以及一些优化 ...

  9. tomcat 在linux下启动时找不到JDK

    方案一.  修改bashrc (转载: https://www.cnblogs.com/hongzg1982/articles/2101792.html)  $ vim ~/.bashrc #加入JA ...

  10. Java采用反射技术创建对象后对目标类的成员变量和成员方法进行访问

    实现: package com.ljy; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @Class ...