#! /usr/local/bin/python #FTP_EME #Autor: Cristian Garay #Fecha Creacion:18/02/2009 #Comentarios: este programa copia los archivos # de costos de ventas desde los locales via # FTP y los deposita en el directorio especificado. # #importamos los modulos y funciones necesarias import datetime, os, ftplib from ftplib import FTP from leer_ini import leer_ini from leer_lista import leer_lista from info_log import info_a_log from envia_mail_2 import enviar_mail from string import strip #funcion para desplegar mensaje de error y almacenarlo en log def mostrar_mensaje(cMensaje): '''Guarda el [cMensaje] de error en [archi_log] y luego lo despliega.''' #nombre para el archivo cNombreLog= datetime.datetime.today().strftime('%Y%m%d') #a log info_a_log(cNombreLog, cMensaje) #mostrar mensaje print cMensaje #no retornamos nada return None print '=======================================================' print ' INICIALIZANDO SISTEMA DE COPIA DE ARCHIVOS DE COSTOS..' print '=======================================================' #establecemos el nombre del archivo de configuracion cArchiConf= 'ftp_eme.conf' #recuperamos los parametros a utilizar #lista de locales cLocales= leer_ini(cArchiConf, 'Parametros', 'ListaLocales')[1] #extension de archivos a generar cExtension= leer_ini(cArchiConf, 'Parametros', 'Extension')[1] #directorio de destino de archivos copiados cDestino= leer_ini(cArchiConf, 'Parametros', 'DirDestino')[1] #directorio de origen de los archivos a copiar cOrigen= leer_ini(cArchiConf, 'Parametros', 'DirOrigen')[1] #cantidad de dias atras cDiasAtras= leer_ini(cArchiConf, 'Parametros', 'DesdeDiasAtras')[1] #lista de destinatarios de notificaciones cDestinatarios= leer_ini(cArchiConf, 'eMail', 'ListaDestinatarios')[1] #servidor de correo cServidorMail= leer_ini(cArchiConf, 'eMail', 'Servidor')[1] #puerto de conexion al servidor cPuertoMail= leer_ini(cArchiConf, 'eMail', 'Puerto')[1] #cuenta de correo a utilizar cCuentaMail= leer_ini(cArchiConf, 'eMail', 'Cuenta')[1] #calculamos la fecha de archivo a copiar try: ayer = datetime.datetime.today() + datetime.timedelta(int(cDiasAtras)*-1) except: #en caso de error mensaje mostrar_mensaje('Error Calculando Fecha Anterior: ' + cDiasAtras) #leemos la lista de locales a conectar lLocales= leer_lista(cLocales) #leemos la lista de destinatarios de notificaciones lDestinatarios= leer_lista(cDestinatarios) print ' INICIANDO NUCLEO DEL PROCESO DE TRANSFERENCIAS' print '=======================================================' #lista para locales sin archivos copiados lNoCopiados=[] #si la lista de locales no esta vacia if len(lLocales) > 0: #recorremos la lista for cLocal in lLocales: #obtenemos los datos del local cNroLocal= cLocal[:2] cIPCC= strip(cLocal[19:35]) cNombre= strip(cLocal[35:]) #creamos el nombre del archivo a copiar cArchivo= cNroLocal + ayer.strftime('%y%m%d') + '.' + cExtension #nombre para el archivo nuevo cNuevo= cDestino + '0' + cNroLocal + ayer.strftime('%y%m%d')[-5:] + '.' + cExtension #intentamos conectarnos al servidor del local try: print 'CONECTANDO A LOCAL ' + cNombre oFtp= FTP(cIPCC) #intentamos loguearnos try: oFtp.login() #cambiamos al directorio donde estan los archivos try: oFtp.cwd(cOrigen) #intentamos copiar el archivo try: print 'COPIANDO ARCHIVO ' + cArchivo oFtp.retrbinary('RETR ' + cArchivo, open(cNuevo, 'wb').write) print 'ARCHIVO COPIADO : ' + cNuevo except: #en caso de error, mensaje, y elimnamos el archivo vacio bHayErrores= True mostrar_mensaje('No se copio el archivo ' + cArchivo) os.remove(cNuevo) #agregamos a la lista de no copiados lNoCopiados.append(cNombre) except: #en caso de error, mensaje bHayErrores= True mostrar_mensaje('No se encontro el Directorio ' + cOrigen) except: #en caso de error, mensaje bHayErrores= True mostrar_mensaje('No se Pudo Hacer LOGIN como "anonymous"') #cerramos la conexion oFtp.close() except: #en caso de error, mensaje bHayErrores= True mostrar_mensaje('Error Intentando Conectar al Local ' + cNombre + ' : ' + cIPCC) #abrimos el archivo copiado localmente try: print 'CALCULANDO TAMANO DEL ARCHIVO COPIADO' cCopiado= open(cNuevo, 'r') #si el tamano del archivo es cero if len(cCopiado.readlines())== 0: #agregamos el local a la lista de no copiados lNoCopiados.append(cNombre) #cerramos el archivo cCopiado.close() except: #en caso de error, nada pass #si la lista de no copiados contiene elementos if len(lNoCopiados) > 0: print 'INICIANDO ENVIO DE NOTIFICACIONES' #preparamos el mensaje de notificacion cMensaje= 'FTP_EME.exe \n' cMensaje= cMensaje + '====================================================== \n' cMensaje= cMensaje + 'No se Copiaron los Archivos de Costos de los Locales: \n' #recorremos la lista de no copiados y vamos agregandolos al mensaje for cLocal in lNoCopiados: cMensaje= cMensaje + cLocal + ' \n' #recorremos la lista de destinatarios for cDestinatario in lDestinatarios: #recuperamos los datos del destinatario cNombre= strip(cDestinatario[:19]) lDireccion= [strip(cDestinatario[19:])] #enviamos la notificacion try: resultado= enviar_mail(cServidorMail, lDireccion, cMensaje, cPuertoMail, cCuentaMail,) #si el resultado de envio es satisfactorio if resultado[0] > 0: #mostramos un mensaje mostrar_mensaje('Enviado e-Mail de Notificacion a ' + cNombre) else: #sino, mostramos otro mensaje mostrar_mensaje('Envio de e-Mail de Notificacion Fallido a ' + cNombre + ':' + lDireccion[0]) except: #en caso de error, mensaje mostrar_mensaje('Error intentando conectar a : ' + cServidorMail + ':'+ cPuertoMail) else: #mensaje de notificacion mostrar_mensaje('Lista de Locales Vacia') #mensaje de finalizacion print '=========================================================' print 'FIN DEL PROCESO DE COPIA DE ARCHIVOS DE COSTOS DE VENTAS' print '========================================================='