├── requirements-modelo.txt ├── run-modelo.sh ├── run.sh ├── README.md └── modelo.py /requirements-modelo.txt: -------------------------------------------------------------------------------- 1 | requests==2.21.0 2 | -------------------------------------------------------------------------------- /run-modelo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ "$1" == "" ] 5 | then 6 | echo "Usage: FILEPATH METHODNAME USERNAME SECRETKEY [FILENAME]" 7 | else 8 | 9 | FILEPATH=$1 10 | METHODNAME=$2 11 | USERNAME=$3 12 | SECRETKEY=$4 13 | FILENAME=$5 14 | 15 | python modelo.py $FILEPATH $METHODNAME $USERNAME $SECRETKEY $FILENAME 16 | fi 17 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ "$1" == "" ] 5 | then 6 | echo "Usage: FILEPATH METHODNAME USERNAME SECRETKEY [FILENAME]" 7 | else 8 | 9 | FILEPATH=$1 10 | METHODNAME=$2 11 | USERNAME=$3 12 | SECRETKEY=$4 13 | FILENAME=$5 14 | 15 | URL=https://datalakecadg.mprj.mp.br/api/upload/ 16 | 17 | TMPNAME=/tmp/$(uuidgen) 18 | 19 | echo "Compressing file...\n" 20 | gzip -c -k $FILEPATH > $TMPNAME 21 | 22 | echo "Calculating MD5 checksum...\n" 23 | MD5=$(md5sum $TMPNAME | cut -d ' ' -f 1) 24 | 25 | if [ "$FILENAME" == "" ] 26 | then 27 | BASENAME=$(basename $FILEPATH) 28 | FILENAME=$(echo "$BASENAME" | sed "s/.csv/_$(date +'%Y%m%d%H%M%S.csv.gz')/") 29 | fi 30 | 31 | echo "Sending file..." 32 | #SEND DATA 33 | curl -X POST \ 34 | $URL \ 35 | -F SECRET=$SECRETKEY \ 36 | -F nome=$USERNAME \ 37 | -F filename=$FILENAME \ 38 | -F method=$METHODNAME \ 39 | -F md5=$MD5 \ 40 | -F file=@$TMPNAME 41 | 42 | echo "\n" 43 | echo "Removing temporary file $TMPNAME" 44 | rm $TMPNAME 45 | 46 | fi 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Scripts para envio de arquivos ao data lake do MPRJ 2 | 3 | 4 | Neste repositório existem dois exemplos de scripts para envio 5 | de dados para o Data Lake do MPRJ, um feito em Bash e outro em Python. 6 | 7 | Para mais informações sobre o funcionamento do Data Lake do MPRJ acesse https://datalakecadg.mprj.mp.br/ 8 | 9 | 10 | ## Utilizando os scripts 11 | 12 | Devem ser passados 5 parâmetros para o script: 13 | - Caminho do Arquivo 14 | - Nome do Método 15 | - Nome do Usuário 16 | - Chave Secreta 17 | - Nome do Arquivo 18 | 19 | A passagem do argumento Nome do Arquivo é opicional. Caso não seja informado, o script 20 | criará o nome no padrão esperado. 21 | 22 | ## Script Bash 23 | 24 | #### Executando o script bash 25 | ``` 26 | ./run.sh caminho/para/arquivo.csv NomeDoMetodo NomeDoUsuario ChaveSecreta NomeDoArquivoComDataEHora 27 | ``` 28 | 29 | ## Script Python 30 | 31 | #### Requisitos: 32 | - python 3.x 33 | - biblioteca requests versão 2.21.0 34 | 35 | #### Executando o script python 36 | ``` 37 | python modelo.py caminho/para/arquivo.csv NomeDoMetodo NomeDoUsuario ChaveSecreta NomeDoArquivoComDataEHora 38 | ``` 39 | 40 | #### Executando o script python via bash 41 | ``` 42 | ./run-modelo.sh caminho/para/arquivo.csv NomeDoMetodo NomeDoUsuario ChaveSecreta NomeDoArquivoComDataEHora 43 | ``` 44 | -------------------------------------------------------------------------------- /modelo.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import gzip 3 | import os 4 | import re 5 | import requests 6 | 7 | from datetime import datetime 8 | from hashlib import md5 9 | 10 | from io import BytesIO 11 | 12 | 13 | class File: 14 | 15 | url = 'https://datalakecadg.mprj.mp.br/api/upload/' 16 | 17 | def __init__(self, file_path, filename=None): 18 | self.file_path = file_path 19 | self.file_obj = self._load(file_path) 20 | self.filename = filename 21 | 22 | def _load(self, file_path): 23 | with open(file_path, 'rb') as fobj: 24 | buf = BytesIO() 25 | buf.write(fobj.read()) 26 | buf.seek(0) 27 | return buf 28 | 29 | def calc_md5(self, compressed_file): 30 | md5_obj = md5(compressed_file) 31 | return md5_obj.hexdigest() 32 | 33 | def compress(self): 34 | return gzip.compress( 35 | self.file_obj.read() 36 | ) 37 | 38 | @property 39 | def _prep_name(self): 40 | base_name = os.path.basename(self.file_path) 41 | prep_name = re.sub( 42 | '(.csv|[-:]|\s+)', 43 | '', 44 | base_name + '_' + str(datetime.now())[:19] 45 | ) 46 | return prep_name + '.csv.gz' 47 | 48 | def _process_response(self, resp): 49 | if resp.status_code == 200: 50 | print('File uploaded successfully!') 51 | else: 52 | msg = re.sub( 53 | r'<.*>(.*)', 54 | '\g<1>', 55 | resp.content.decode() 56 | ) 57 | print('Status:', resp.status_code, msg) 58 | 59 | def post(self, username, method, secret): 60 | compressed = self.compress() 61 | md5digest = self.calc_md5(compressed) 62 | 63 | payload = { 64 | 'filename': self.filename or self._prep_name, 65 | 'nome': username, 66 | 'md5': md5digest, 67 | 'method': method, 68 | 'SECRET': secret 69 | } 70 | self.resp = requests.post( 71 | self.url, 72 | files={'file': (self._prep_name, compressed)}, 73 | data=payload 74 | ) 75 | self._process_response(self.resp) 76 | 77 | 78 | if __name__ == "__main__": 79 | parser = argparse.ArgumentParser() 80 | parser.add_argument( 81 | 'filepath', 82 | help='Caminho completo até o arquivo que se deseja enviar' 83 | ) 84 | parser.add_argument( 85 | 'methodname', 86 | help='Nome do método do respectivo arquivo' 87 | ) 88 | parser.add_argument( 89 | 'username', 90 | help='Nome do usuário cadastrado no sistema' 91 | ) 92 | parser.add_argument( 93 | 'secretkey', 94 | help='Chave secreta que autentica o usuário' 95 | ) 96 | parser.add_argument( 97 | '--filename', 98 | help='Nome do arquivo que será salvo no data lake.' 99 | ) 100 | args = parser.parse_args() 101 | 102 | filepath = args.filepath 103 | filename = args.filename 104 | methodname = args.methodname 105 | username = args.username 106 | secretkey = args.secretkey 107 | 108 | file_obj = File(filepath, filename) 109 | 110 | # Send data 111 | file_obj.post(username, methodname, secretkey) 112 | --------------------------------------------------------------------------------