add files
This commit is contained in:
parent
4108a04918
commit
7fc6a99bf5
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
\.idea/
|
||||
|
||||
reports/
|
||||
|
||||
sql/
|
||||
106
reporter.py
Executable file
106
reporter.py
Executable file
@ -0,0 +1,106 @@
|
||||
import os
|
||||
import csv
|
||||
import logging
|
||||
import tarfile
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
from pyutils.remote import Sftp
|
||||
from pyutils.oracle import OraConn
|
||||
from pyutils.localenv import localenv
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# CONFIGURATIONS HERE!!
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
# for each item in reports[] like: reports = ['item', 'anotheritem']
|
||||
# it will search a sql file called 'item.sql' and 'anotheritem.sql' inside SQL_DIR
|
||||
# and it will generate a report for each one called rprt_item20190101.csv and rprt_anotheritem20190101.csv
|
||||
# then it will create a tar.gz file for each csv rprt_item20190101.tar.gz and rprt_anotheritem20190101.tar.gz
|
||||
# and delete the csv files from the working dir
|
||||
# finally it will upload to an sftp server
|
||||
|
||||
reports = [
|
||||
'sv'
|
||||
]
|
||||
|
||||
localenv.load()
|
||||
HOME_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
SQL_DIR = os.path.join(HOME_DIR, 'sql')
|
||||
REPORT_DIR = os.path.join(HOME_DIR, 'reports')
|
||||
DESTINATION_HOME = os.path.join('.', 'reports')
|
||||
|
||||
ORA_CONN = localenv.get('ORA_CONN')
|
||||
ORA_MODULE_NAME = 'Report Generator Do Not Kill!!'
|
||||
|
||||
FTP_REMOTE_HOST = localenv.get('FTP_REMOTE_HOST')
|
||||
FTP_REMOTE_PORT = localenv.get('FTP_REMOTE_PORT', cast=int)
|
||||
FTP_REMOTE_USER = localenv.get('FTP_REMOTE_USER')
|
||||
FTP_REMOTE_PASS = localenv.get('FTP_REMOTE_PASS')
|
||||
sftp_auth = (FTP_REMOTE_HOST, FTP_REMOTE_PORT, FTP_REMOTE_USER, FTP_REMOTE_PASS)
|
||||
|
||||
LOG_FILE = os.path.join(HOME_DIR, 'reporter.log')
|
||||
logging.basicConfig(filename=LOG_FILE, filemode='a', format='%(asctime)s %(module)s %(message)s', level=logging.INFO)
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
def progress(message):
|
||||
logging.info(message)
|
||||
|
||||
|
||||
def main():
|
||||
# first of all we place our self in reports dir
|
||||
# as working directory
|
||||
os.chdir(REPORT_DIR)
|
||||
for report in reports:
|
||||
try:
|
||||
file_name = f'rprt_{report}{datetime.now():%Y%m%d}'
|
||||
csv_file = f'{file_name}.csv'
|
||||
tar_file = f'{file_name}.tar.gz'
|
||||
destination = os.path.join(DESTINATION_HOME, tar_file)
|
||||
|
||||
progress('reading sql file')
|
||||
with open(os.path.join(SQL_DIR, f'{report}.sql')) as f:
|
||||
query = f.read()
|
||||
progress(f'got query: \n{query}')
|
||||
|
||||
progress('starting oracle conn...')
|
||||
with OraConn(ORA_CONN, ret="cursor", module_name=ORA_MODULE_NAME) as cursor:
|
||||
cursor.arraysize = 10000
|
||||
# working!
|
||||
progress(f'i got oracle conn {cursor}\n lets query...')
|
||||
cursor.execute(query)
|
||||
progress('query has been executed!')
|
||||
headers = [i[0] for i in cursor.description]
|
||||
progress('fetching rows by and saving to csv file...')
|
||||
with open(csv_file, 'w') as csvfile:
|
||||
file = csv.writer(csvfile)
|
||||
file.writerow(headers)
|
||||
file.writerows(cursor)
|
||||
|
||||
progress('compressing csv file...')
|
||||
with tarfile.open(tar_file, "w:gz") as tar:
|
||||
tar.add(csv_file)
|
||||
progress('csv file compressed!')
|
||||
progress('removing csv file...')
|
||||
os.remove(csv_file)
|
||||
progress('csv file removed!')
|
||||
|
||||
# create sftp conn to remote server after report is generated
|
||||
# cause query may delay to much and if we create conn before
|
||||
# sftp conn may get closed
|
||||
progress(f'starting sft conn to {FTP_REMOTE_HOST}...')
|
||||
with Sftp(sftp_auth) as sftp:
|
||||
progress(f'uploading file to {destination}')
|
||||
sftp.put(tar_file, destination)
|
||||
|
||||
progress('report generated and delivered successfully')
|
||||
|
||||
except Exception as e:
|
||||
logging.exception(f'Error in reporter {e}')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user