Last active
January 15, 2016 17:35
-
-
Save rondinelisaad/edc8b6e6777302c27780 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#coding: utf-8 | |
import os | |
from utils import * | |
#Autor: Rondineli Saad | |
#Versão: 0.1 | |
#Nome do script: compactacao.py | |
#Descrição: script para compactação de arquivos de logs do apache, onde | |
#será passado um argumento informando o diretorio de origem. Neste diretorio | |
#será buscado arquivos com a data do dia anterior que contenham a palavra | |
#access. | |
#Neste mesmo arquivo há um padrão de nome da instancia, através deste nome será | |
#analisado se existe uma pasta com o respectivo nome, caso não tenha será | |
#criada, após a compactação do arquivo, o mesmo será movido para a respectiva | |
#pasta. Um e-mail será enviado em forma de extrato com o nome dos arquivos | |
#compactados e seu checksum | |
if __name__ == '__main__': | |
os.chdir(inDIR) | |
for i in list_file(inDIR, pattern): | |
compress_file(i) | |
size = os.stat("%s.gz" % i).st_size | |
if check_integrity_gzip(i) == False: | |
print("Erro no arquivo") | |
else: | |
print('%s ----- %s ----- %s' % (i, size, checksum_file(i))) | |
print('%s.gz -- %s ----- %s' % (i, size, checksum_file(i))) | |
remove_file(i) | |
move_file_compress(i) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#coding: utf-8 | |
import os | |
import fnmatch | |
import time | |
import re | |
import argparse | |
import gzip | |
import shutil | |
import hashlib | |
from datetime import datetime, timedelta | |
#Parametros passado pelo script usando o argparser | |
parser = argparse.ArgumentParser( | |
description='Compacta arquivos de log no format gzip') | |
parser.add_argument('--source_dir', dest='source_dir') | |
args = vars(parser.parse_args()) | |
#Variaveis Declaradas | |
MY_BEAUTFULL_REGEX = re.compile(r'\+.*-access.log') | |
yesterday = datetime.now() - timedelta(1) | |
yesterday_date = yesterday.strftime('%Y-%m-%d') | |
date_now = datetime.now() | |
date_now_year = date_now.year | |
dir_year = "%s" % (date_now_year) | |
dir_month = date_now.strftime("%B") | |
inDIR = args['source_dir'] | |
pattern = '%s+*-access.log' % yesterday_date | |
def list_file(inDir, pattern): | |
""" | |
Lista os arquivos existens no diretório atual. | |
:inDir: Caminho do diretório. | |
:pattern: Regex usada para consultar o log. | |
""" | |
for dName, sdName, fList in os.walk(inDIR): | |
for fileName in fList: | |
if fnmatch.fnmatch(fileName, pattern): | |
yield os.path.join(fileName) | |
def validate_dir(instance): | |
""" | |
Cria diretório onde será armazenado os logs. | |
:instance: Nome da pasta onde será armazenado os logs. | |
""" | |
instance = MY_BEAUTFULL_REGEX.findall(instance)[0][1:-11] | |
dir_name = '%s/%s/%s' % (dir_year, dir_month, instance) | |
try: | |
os.makedirs(dir_name) | |
except IOError: | |
return None | |
def move_file_compress(filename): | |
""" | |
Valida se o arquivo de log existe e se existir move para a pasta de | |
destino ano/mes atual/nome da instancia. | |
:filename: Nome do arquivo de log. | |
""" | |
instance = MY_BEAUTFULL_REGEX.findall(filename)[0][1:-11] | |
dst_dir = '%s/%s/%s' % (dir_year, dir_month, instance) | |
dst_file = os.path.join(dst_dir, '%s.gz' % filename) | |
if not os.path.isfile(dst_file): | |
shutil.move('%s.gz' % filename, dst_dir) | |
else: | |
os.remove(dst_file) | |
shutil.move('%s.gz' % filename, dst_dir) | |
def remove_file(filename): | |
""" | |
Remove o arquivo após compactação. | |
:filename: Nome do arquivo de log. | |
""" | |
try: | |
if os.path.isfile("%s.gz" % filename): | |
os.remove(filename) | |
except IOError: | |
return None | |
def check_integrity_gzip(filename): | |
""" | |
Checa a integridade do arquivo compactado. | |
:filename: Nome do arquivo de log. | |
""" | |
with gzip.open('%s.gz' % filename) as gzip_filename: | |
try: | |
while gzip_filename.read(1024 * 1024): | |
pass | |
except IOError: | |
return False | |
def checksum_file(filepath, algorithm=hashlib.md5): | |
""" | |
Calcula o ``checksum`` de um arquivo em disco. | |
:param filepath: caminho no sistema de arquivos. | |
:param algorithm: (opcional) o padrão é ``hashlib.md5``. | |
""" | |
with open(filepath, 'rb') as fp: | |
hash = algorithm() | |
while True: | |
chunk = fp.read(1024) | |
if not chunk: | |
break | |
hash.update(chunk) | |
return hash.hexdigest() | |
def compress_file(filename): | |
"""Compacta os arquivos de log e os move para a pasta ano atual/ | |
mes atual / instance. Depois o arquivo de log será removido. | |
:filename: Nome do arquivo de log. | |
""" | |
with open(filename, "rb") as file_in: | |
with gzip.open("%s.gz" % filename, 'wb', compresslevel=9) as file_out: | |
file_out.writelines(file_in) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Gist para função que gera o checksum de arquivos em disco: https://gist.github.com/gustavofonseca/feb12ef62fd7f1643b5b