天天看點

通過Python掃描代碼關鍵字并進行預警

近期線上出現一個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指令,實作最終腳本的背景運作

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