Skip to content

Instantly share code, notes, and snippets.

@rondinelisaad
Last active January 15, 2016 17:35
Show Gist options
  • Save rondinelisaad/edc8b6e6777302c27780 to your computer and use it in GitHub Desktop.
Save rondinelisaad/edc8b6e6777302c27780 to your computer and use it in GitHub Desktop.
#!/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)
#!/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)
@gustavofonseca
Copy link

Gist para função que gera o checksum de arquivos em disco: https://gist.github.com/gustavofonseca/feb12ef62fd7f1643b5b

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment