def newLog(self, msj, type, code, key=1): status = False # Unicamente se podran enviar 2 errores por clase, para evitar caer en un loop infinito if self.err < 3: # Aumenta el contador self.err + 1 ex = "" # Carga el archivo de errores error = self.openErrorsFile() # Extrae los datos del usuario... user & passc login = Login() user = login.returnUserData() # Url de la api REST url = const.IP_SERVER + "/DBProtector/Log_SET?Message=" + urllib.quote(error[msj]+" "+code) + "&MessageType=" + type + "&Code=" + str(key) + "&AppVersion=" + const.VERSION + "&IdCustomer=" + user['IdCustomer'] try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) # Devuelve la info res = json.loads(response.read()) # Si es correcto devuelve True if res['Success'] == 1: status = True # Si no, vuelve a enviar un error, y devuelve falso else: self.newLog(error["error_report"], "E", ex) status = False except urllib2.HTTPError, e: ex = e.fp.read()
def getProcessName(self): # Set Log log = SetLog() # Exception ex = "" # Mombre por default process = 'SQLDBproc' ''' Version del Sistema Operativo 2 = Linux 1 = Windows ''' so = 2 # extrae la informacion del usuario del archivo de configuracion login = Login() user = login.returnUserData() # Url de la api REST para autenticarse url = const.IP_SERVER + '/DBProtector/DBBackUpProcess_GET?IdPlatform=' + str(so) + '&User='******'user'] +'&Password='******'password'] try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def getProcessName(self): # Set Log log = SetLog() # Exception ex = "" # Mombre por default process = 'SQLDBproc' ''' Version del Sistema Operativo 2 = Linux 1 = Windows ''' so = 2 # extrae la informacion del usuario del archivo de configuracion login = Login() user = login.returnUserData() # Url de la api REST para autenticarse url = const.IP_SERVER + '/DBProtector/DBBackUpProcess_GET?IdPlatform=' + str( so) + '&User='******'user'] + '&Password='******'password'] try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def createPassword(self): # Devuelve la info del usuario user = Login() data = user.returnUserData() ''' La contrasena de los archivos comprimidos es un hash sha256 de el id del usuario ej: 1 = dcfd8615edda421c24765f146f0ccb0f95cccf90c618ab0af258054872e4d85f ''' password = hashlib.sha256(str(data['IdCustomer'])).hexdigest() return password
def setDownloadstatus(self, fileDownload, path, status): # logs log = SetLog() # Carga el status de la subida a nivel local file = os.path.join(const.LOCATION, const.STATUS_FILE) # Si el archivo existe... if (os.path.exists(file)): # guarda los datos anteriores with open(file, 'r') as f: data = json.load(f) # abre el archivo y escribe los datos with open(file, 'w') as f: json.dump( { 'download': { 'file': fileDownload, 'path': path, 'status': status }, 'upload': data['upload'] }, f) if status == 2 or status == 0: print "sincronizado" else: from time import gmtime, strftime url = "" # extrae la info del user l = Login() user = l.returnUserData() # extrae la fecha actual formateada date = strftime("%Y%m%d%H%M%S", gmtime()) # valida el status de la subida # 1 para carga iniciada if status == 1: # i el chunk es de 5mb, entonces es el primero en subirse url = const.IP_SERVER + '/DBProtector/FileTransaction_SET?User='******'user'] + '&Password='******'password'] + '&StartDate=' + date + '&ActualChunk=' + str(0) + '&TotalChunk=' + \ str(0) + '&Status=EnProgreso&FileName=' + fileDownload + '&TransactionType=5' elif status == 0: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_DELETE?User='******'user'] + '&Password='******'password'] + '&FileName=' + fileDownload + '&TransactionType=5' try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def returnUserData(self): log = SetLog() # Datos del usuario l = Login() user = l.returnUserData() # Url de la api REST para autenticarse url = const.IP_SERVER + '/DBProtector/Account_GET?User='******'user'] + '&Password='******'password'] try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def setDownloadstatus(self, fileDownload, path, status): # logs log = SetLog() # Carga el status de la subida a nivel local file = os.path.join(const.LOCATION, const.STATUS_FILE) # Si el archivo existe... if (os.path.exists(file)): # guarda los datos anteriores with open(file, 'r') as f: data = json.load(f) # abre el archivo y escribe los datos with open(file, 'w') as f: json.dump({ 'download': { 'file': fileDownload, 'path': path, 'status': status }, 'upload': data['upload'] }, f) if status == 2 or status == 0: print "sincronizado" else: from time import gmtime, strftime url = "" # extrae la info del user l = Login() user = l.returnUserData() # extrae la fecha actual formateada date = strftime("%Y%m%d%H%M%S", gmtime()) # valida el status de la subida # 1 para carga iniciada if status == 1: # i el chunk es de 5mb, entonces es el primero en subirse url = const.IP_SERVER + '/DBProtector/FileTransaction_SET?User='******'user'] + '&Password='******'password'] + '&StartDate=' + date + '&ActualChunk=' + str(0) + '&TotalChunk=' + \ str(0) + '&Status=EnProgreso&FileName=' + fileDownload + '&TransactionType=5' elif status == 0: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_DELETE?User='******'user'] + '&Password='******'password'] + '&FileName=' + fileDownload + '&TransactionType=5' try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def getData(self): extensiones = [] log = SetLog() l = Login() user = l.returnUserData() p = Preferences() spaceData = p.returnUserData() url = const.IP_SERVER + '/DBProtector/Extensions_GET?User='******'user'] + '&Password='******'password'] try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def setUploadStatus(self, fileUploaded, chunk, total, status): # logs log = SetLog() # Carga el status de la subida a nivel local file = os.path.join(const.LOCATION, const.STATUS_FILE) # Si el archivo existe... if (os.path.exists(file)): #guarda los datos anteriores with open(file, 'r') as f: data = json.load(f) # abre el archivo y escribe los datos with open(file, 'w') as f: json.dump({ 'upload': { 'file': fileUploaded, 'chunk': chunk, 'total': total, 'status': status }, 'download': data['download'] }, f) else: log.newLog("error_file_status", "E", "") ''' 0 = Subida terminada 1 = Iniciando subida 2 = Subiendo 3 = Comprimiendo Si es diferente de 3 envia un log a la API ''' if status == 3 or status == 0: print "sincronizado" else: from time import gmtime, strftime url = "" # extrae la infor del user l = Login() user = l.returnUserData() # extrae la fecha actual formateada date = strftime("%Y%m%d%H%M%S", gmtime()) # valida el status de la subida # 1 para carga iniciada if status == 1: #i el chunk es de 5mb, entonces es el primero en subirse if chunk <= const.CHUNK_SIZE: # tamano del chunk de 5MB # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_SET?User='******'user'] + '&Password='******'password'] + '&StartDate=' + date + '&ActualChunk=' + str(chunk) + '&TotalChunk=' + \ str(total) + '&Status=EnProgreso&FileName=' + fileUploaded + '&TransactionType=1' # si el es diferente de 5 mb, se esta actualizando else: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_UPDATE?User='******'user'] + '&Password='******'password'] + '&ActualChunk='+str(chunk)+'&Status=EnProgreso&FileName=' + fileUploaded + '&TransactionType=1' elif status == 2: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_DELETE?User='******'user'] + '&Password='******'password'] + '&FileName=' + fileUploaded + '&TransactionType=1' try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())
def clickedListener(self, webview, webFrame, networkRequest): uri = networkRequest.get_uri() if uri.find("://") > 0: scheme, path = uri.split("://", 1) else: return False ''' se utiliza scheme y path para evitar un loop todos los schme's deben ser bajo admin si el path es preferences guarda los cambios del usuario y recarga la página ''' if scheme == 'admin' and path == "preferences": from xamai.Preferences import Preferences p = Preferences() # extrae path y frecuencia de respaldo de los forms HTML route = webFrame.get_dom_document().get_element_by_id( "ui_path").get_value() time = webFrame.get_dom_document().get_element_by_id( "ui_time").get_value() userPath = webFrame.get_dom_document().get_element_by_id( "ui_path_external").get_value() if route: #if p.writePreferences(route, time, time_type): if p.writePreferences(route, time, "dias", userPath): # reemplaza alert con un mensaje msg = '<div class="tile-wrap">' \ '<div class="tile tile-collapse tile-brand">' \ '<div data-target="#ui_tile_example_red" data-toggle="tile">' \ '<div class="tile-inner">' \ '<div class="text-overflow">Cambios guardados correctamente</div>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' webview.load_html_string(self.loadPreferences(msg), const.LOCATION + '/html/') return True else: # reemplaza alert con un mensaje msg = '<div class="tile-wrap">' \ '<div class="tile tile-collapse tile-red">' \ '<div data-target="#ui_tile_example_red" data-toggle="tile">' \ '<div class="tile-inner">' \ '<div class="text-overflow">Ocurrio un error al guardar los datos</div>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' webview.load_html_string(self.loadPreferences(msg), const.LOCATION + '/html/') return True # Redirecciona a los respaldos del usuario elif scheme == 'admin' and path == "getRecover": webview.load_html_string(self.loadRecover(), const.LOCATION + '/html/') return True # inicia session elif scheme == 'admin' and path == "login": from xamai.Login import Login l = Login() # extrae usuario y contrasena user = webFrame.get_dom_document().get_element_by_id( "ui_login_username").get_value() password = webFrame.get_dom_document().get_element_by_id( "ui_login_password").get_value() if user and password: # Si el login es correcto if l.loginApi(user, password): # Muestra los detalles de la cuenta y configuracion del user webview.load_html_string(self.loadPreferences(), const.LOCATION + '/html/') # Inicia un nuevo thread, con la aplicacion thread.start_new_thread(os.system, ("/usr/bin/dbprotector_xamai", )) return True # Si el login NO es correcto else: # vuelve a cargar la vista de login fd = open(const.LOCATION + "/gui/login.html", "r") tmp_page = fd.read() fd.close() # reemplaza alert con un mensaje de usuario incorrecto tmp_page = tmp_page.replace("{css}", self.loadStyles()) tmp_page = tmp_page.replace( "{alert}", '<div class="tile-wrap">' '<div class="tile tile-collapse tile-red">' '<div data-target="#ui_tile_example_red" data-toggle="tile">' '<div class="tile-inner">' '<div class="text-overflow">Usuario o Contraseña incorrectos</div>' '</div>' '</div>' '</div>' '</div>') webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Muestra la lista de meses disponibles en los respaldos elif scheme == 'admin' and path == "recover": from xamai.Recover import Recover r = Recover() # Extrae el anio seleccionado year = webFrame.get_dom_document().get_element_by_id( "card_clicked").get_value() # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() tmp_page = tmp_page.replace( "{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>' ) tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(year)) tmp_page = tmp_page.replace("{card}", r.loadMonths(year)) tmp_page = tmp_page.replace("{msg}", "") webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Muestra los respaldos de un mes elif scheme == 'admin' and path == "recoverMonth": from xamai.Recover import Recover r = Recover() # extrae el mes y anio seleccionado val = webFrame.get_dom_document().get_element_by_id( "card_clicked").get_value() y, m = val.split("-") # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() tmp_page = tmp_page.replace( "{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>' ) tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(y) + ' > ' + str(m)) tmp_page = tmp_page.replace("{card}", r.loadBackups(y, m)) tmp_page = tmp_page.replace("{msg}", "") webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Reabre la lista de respaldos, una vez que se descargo uno elif scheme == 'admin' and path == "downloadBackup": from xamai.Recover import Recover from xamai.Upload import Upload u = Upload() r = Recover() # Extrae el respaldo seleccionado backup = webFrame.get_dom_document().get_element_by_id( "card_clicked").get_value() # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() ''' Descarga el archivo en un nuevo thread de forma paralela Pide la ruta de Descarga ''' choose = ChooseDirectory() path = choose.getFolder() thread.start_new_thread(u.downloadFile, ( r.downloadFile(backup), path, )) # Recupera anio y mes y, m, file = backup.split("-") # Remplaza los parametros tmp_page = tmp_page.replace( "{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>' ) tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(y) + ' > ' + str(m)) tmp_page = tmp_page.replace("{card}", r.loadBackups(y, m)) tmp_page = tmp_page.replace( "{msg}", '<div class="tile-wrap">' '<div class="tile tile-collapse tile-brand">' '<div data-target="#ui_tile_example_red" data-toggle="tile">' '<div class="tile-inner">' '<div class="text-overflow">Descargando respaldo: ' + file + '</div>' '</div>' '</div>' '</div>') # vuelve a cargar la vista '</div>') webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Redirecciona a las preferencias del usuario elif scheme == 'admin' and path == "getSettings": webview.load_html_string(self.loadPreferences(), const.LOCATION + '/html/') return True # Vuelve a cargar los respaldos elif scheme == 'admin' and path == "getBackups": webview.load_html_string(self.loadRecover(), const.LOCATION + '/html/') return True elif scheme == 'admin' and path == "closeSession": from xamai.Login import Login l = Login() l.closeSession() webview.load_html_string(self.loadLogin(), const.LOCATION + '/html/') Gtk.main_quit() return True
def clickedListener(self, webview, webFrame, networkRequest): uri = networkRequest.get_uri() if uri.find("://") > 0: scheme, path = uri.split("://", 1) else: return False ''' se utiliza scheme y path para evitar un loop todos los schme's deben ser bajo admin si el path es preferences guarda los cambios del usuario y recarga la página ''' if scheme == 'admin' and path == "preferences": from xamai.Preferences import Preferences p = Preferences() # extrae path y frecuencia de respaldo de los forms HTML route = webFrame.get_dom_document().get_element_by_id("ui_path").get_value() time = webFrame.get_dom_document().get_element_by_id("ui_time").get_value() userPath = webFrame.get_dom_document().get_element_by_id("ui_path_external").get_value() if route: #if p.writePreferences(route, time, time_type): if p.writePreferences(route, time, "dias", userPath): # reemplaza alert con un mensaje msg = '<div class="tile-wrap">' \ '<div class="tile tile-collapse tile-brand">' \ '<div data-target="#ui_tile_example_red" data-toggle="tile">' \ '<div class="tile-inner">' \ '<div class="text-overflow">Cambios guardados correctamente</div>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' webview.load_html_string(self.loadPreferences(msg), const.LOCATION + '/html/') return True else: # reemplaza alert con un mensaje msg = '<div class="tile-wrap">' \ '<div class="tile tile-collapse tile-red">' \ '<div data-target="#ui_tile_example_red" data-toggle="tile">' \ '<div class="tile-inner">' \ '<div class="text-overflow">Ocurrio un error al guardar los datos</div>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' webview.load_html_string(self.loadPreferences(msg), const.LOCATION + '/html/') return True # Redirecciona a los respaldos del usuario elif scheme == 'admin' and path == "getRecover": webview.load_html_string(self.loadRecover(), const.LOCATION + '/html/') return True # inicia session elif scheme == 'admin' and path == "login": from xamai.Login import Login l = Login() # extrae usuario y contrasena user = webFrame.get_dom_document().get_element_by_id("ui_login_username").get_value() password = webFrame.get_dom_document().get_element_by_id("ui_login_password").get_value() if user and password: # Si el login es correcto if l.loginApi(user, password): # Muestra los detalles de la cuenta y configuracion del user webview.load_html_string(self.loadPreferences(), const.LOCATION + '/html/') # Inicia un nuevo thread, con la aplicacion thread.start_new_thread(os.system, ("/usr/bin/dbprotector_xamai",)) return True # Si el login NO es correcto else: # vuelve a cargar la vista de login fd = open(const.LOCATION + "/gui/login.html", "r") tmp_page = fd.read() fd.close() # reemplaza alert con un mensaje de usuario incorrecto tmp_page = tmp_page.replace("{css}", self.loadStyles()) tmp_page = tmp_page.replace("{alert}", '<div class="tile-wrap">' '<div class="tile tile-collapse tile-red">' '<div data-target="#ui_tile_example_red" data-toggle="tile">' '<div class="tile-inner">' '<div class="text-overflow">Usuario o Contraseña incorrectos</div>' '</div>' '</div>' '</div>' '</div>') webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Muestra la lista de meses disponibles en los respaldos elif scheme == 'admin' and path == "recover": from xamai.Recover import Recover r = Recover() # Extrae el anio seleccionado year = webFrame.get_dom_document().get_element_by_id("card_clicked").get_value() # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() tmp_page = tmp_page.replace("{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>') tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(year)) tmp_page = tmp_page.replace("{card}", r.loadMonths(year)) tmp_page = tmp_page.replace("{msg}", "") webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Muestra los respaldos de un mes elif scheme == 'admin' and path == "recoverMonth": from xamai.Recover import Recover r = Recover() # extrae el mes y anio seleccionado val = webFrame.get_dom_document().get_element_by_id("card_clicked").get_value() y, m = val.split("-") # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() tmp_page = tmp_page.replace("{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>') tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(y) + ' > ' + str(m)) tmp_page = tmp_page.replace("{card}", r.loadBackups(y, m)) tmp_page = tmp_page.replace("{msg}", "") webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Reabre la lista de respaldos, una vez que se descargo uno elif scheme == 'admin' and path == "downloadBackup": from xamai.Recover import Recover from xamai.Upload import Upload u = Upload() r = Recover() # Extrae el respaldo seleccionado backup = webFrame.get_dom_document().get_element_by_id("card_clicked").get_value() # vuelve a cargar la vista de index fd = open(const.LOCATION + "/gui/index.html", "r") tmp_page = fd.read() fd.close() ''' Descarga el archivo en un nuevo thread de forma paralela Pide la ruta de Descarga ''' choose = ChooseDirectory() path = choose.getFolder() thread.start_new_thread(u.downloadFile, (r.downloadFile(backup), path,)) # Recupera anio y mes y, m, file = backup.split("-") # Remplaza los parametros tmp_page = tmp_page.replace("{goBakcButton}", '<a class="btn waves-attach" onclick="getRecover(true)"><span class="icon icon-lg margin-right">undo</span>volver</a>') tmp_page = tmp_page.replace("{backup-location}", ' > ' + str(y) + ' > ' + str(m)) tmp_page = tmp_page.replace("{card}", r.loadBackups(y, m)) tmp_page = tmp_page.replace("{msg}", '<div class="tile-wrap">' '<div class="tile tile-collapse tile-brand">' '<div data-target="#ui_tile_example_red" data-toggle="tile">' '<div class="tile-inner">' '<div class="text-overflow">Descargando respaldo: ' + file + '</div>' '</div>' '</div>' '</div>') # vuelve a cargar la vista '</div>') webview.load_html_string(tmp_page, const.LOCATION + '/html/') return True # Redirecciona a las preferencias del usuario elif scheme == 'admin' and path == "getSettings": webview.load_html_string(self.loadPreferences(), const.LOCATION + '/html/') return True # Vuelve a cargar los respaldos elif scheme == 'admin' and path == "getBackups": webview.load_html_string(self.loadRecover(), const.LOCATION + '/html/') return True elif scheme == 'admin' and path == "closeSession": from xamai.Login import Login l = Login() l.closeSession() webview.load_html_string(self.loadLogin(), const.LOCATION + '/html/') Gtk.main_quit() return True
def __init__(self): self.u = Upload() self.l = Login() self.user = self.l.returnUserData()
class Recover(): # codifica la ruta desde donde se descargara un archivo (no lo descarga) def downloadFile(self, args): year, month, file = args.split("-") month = self.monthsToInt(month) return "/" + str( self.user['IdCustomer']) + "/" + year + "/" + month + "/" + file # Devuelve una lista de backups por un mes determinado def getBackups(self, year, month): backups = [] month = self.monthsToInt(month) files = self.u.getBackups("/" + str(self.user['IdCustomer']) + "/" + year + "/" + month + "/") for i in files: path, name = os.path.split(i['path']) backups.append(name) backups = self.u.formatBackups(backups) return backups # regresa los backups en una tabla html def loadBackups(self, y, m): backups = self.getBackups(y, m) if not backups: cardsBackups = "<h3 style='color: #BDBDBD; text-align: center;'>No se encontraron respaldos</h3>" else: cardsBackups = '<div class="table-responsive">' \ '<table class="table" title="Descargar respaldo">' \ '<tbody>' for rfc in backups: cardsBackups = cardsBackups + '<tr><td colspan=3>' + self.extractRFC( rfc[0]) + '</td></tr>' for i in rfc: cardsBackups = cardsBackups + '<tr><td></td><td>' + self.formatBackupName(str(i)) + '</td>' \ '<td><button class="btn btn-flat btn-brand" id="card_year_' + str(i) + '" onClick="downloadBackup(true, \'' + y + '-' + m + '-' + str(i) + '\')">Descargar</button></td></tr>' cardsBackups = cardsBackups + "</tbody></table></div>" return cardsBackups # Devuelve el rfc de un respaldo def extractRFC(self, backup): m = re.search('([A-Zz-z]{4}\d{6})(---|\w{3})', backup) if m: return str(m.group(1)) else: return '' # Devuelve la fecha 2016-08-24 08:20:12 de un respaldo def formatBackupName(self, backup): m = re.search("(\d{14}).(\w{3})", backup) if m: fecha = str(m.group(1)) final = fecha[0:4] + "-" + fecha[4:6] + "-" + fecha[ 6:8] + " " + fecha[8:10] + ":" + fecha[10:12] + ":" + fecha[ 12:14] return final else: return '' # pasa los meses a digitos def monthsToInt(self, month): if month == "Enero": month = "01" elif month == "Febrero": month = "02" elif month == "Marzo": month = "03" elif month == "Abril": month = "04" elif month == "Mayo": month = "05" elif month == "Junio": month = "06" elif month == "Julio": month = "07" elif month == "Agosto": month = "08" elif month == "Septiembre": month = "09" elif month == "Octubre": month = "10" elif month == "Noviembre": month = "11" elif month == "Diciembre": month = "12" return month # Devuelve una lista de meses por un anio determinado def getMonths(self, year): months = [] files = self.u.getRemoteFilesList("/" + str(self.user['IdCustomer']) + "/" + year + "/") for path in files: id, month = os.path.split(path) if month == "01": months.append("Enero") elif month == "02": months.append("Febrero") elif month == "03": months.append("Marzo") elif month == "04": months.append("Abril") elif month == "05": months.append("Mayo") elif month == "06": months.append("Junio") elif month == "07": months.append("Julio") elif month == "08": months.append("Agosto") elif month == "09": months.append("Septiembre") elif month == "10": months.append("Octubre") elif month == "11": months.append("Noviembre") elif month == "12": months.append("Diciembre") return months # Devuelve un string HTML con los cardviews por cada mes def loadMonths(self, year): cardsMonths = "" months = self.getMonths(year) if not months: cardsMonths = "<h3 style='color: #BDBDBD; text-align: center;'>No se encontraron respaldos</h3>" else: for i in months: cardsMonths = cardsMonths + '<div class="col-md-4 col-sm-3">' \ '<div class="card-scanda">' \ '<div class="card-main">' \ '<div class="card-inner">' \ '<button style="text-align: center;" class="btn btn-flat card-heading waves-attach" id="card_year_' + str( i) + '" onClick="recoverMonth(true, \''+year+'-' + str(i) + '\')">' + str(i) + '</button>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' return cardsMonths # Devuelve una lista de anios por usuario def getYears(self): years = [] for path in self.u.getRemoteFilesList("/" + str(self.user['IdCustomer']) + "/"): id, year = os.path.split(path) years.append(year) return years # Devuelve un string HTML con los cardviews por cada anio def loadYears(self): cardsYears = "" years = self.getYears() if not years: cardsYears = "<h3 style='color: #BDBDBD; text-align: center;'>No se encontraron respaldos</h3>" else: for i in years: cardsYears = cardsYears + '<div class="col-md-4 col-sm-3">' \ '<div class="card-scanda">' \ '<div class="card-main">' \ '<div class="card-inner">' \ '<button style="text-align: center;" class="btn btn-flat card-heading waves-attach" id="card_year_' + str(i) + '" onClick="recover(true, '+str(i)+')">' + str(i) + '</button>' \ '</div>' \ '</div>' \ '</div>' \ '</div>' return cardsYears def __init__(self): self.u = Upload() self.l = Login() self.user = self.l.returnUserData()
def setUploadStatus(self, fileUploaded, chunk, total, status): # logs log = SetLog() # Carga el status de la subida a nivel local file = os.path.join(const.LOCATION, const.STATUS_FILE) # Si el archivo existe... if (os.path.exists(file)): #guarda los datos anteriores with open(file, 'r') as f: data = json.load(f) # abre el archivo y escribe los datos with open(file, 'w') as f: json.dump( { 'upload': { 'file': fileUploaded, 'chunk': chunk, 'total': total, 'status': status }, 'download': data['download'] }, f) else: log.newLog("error_file_status", "E", "") ''' 0 = Subida terminada 1 = Iniciando subida 2 = Subiendo 3 = Comprimiendo Si es diferente de 3 envia un log a la API ''' if status == 3 or status == 0: print "sincronizado" else: from time import gmtime, strftime url = "" # extrae la infor del user l = Login() user = l.returnUserData() # extrae la fecha actual formateada date = strftime("%Y%m%d%H%M%S", gmtime()) # valida el status de la subida # 1 para carga iniciada if status == 1: #i el chunk es de 5mb, entonces es el primero en subirse if chunk <= const.CHUNK_SIZE: # tamano del chunk de 5MB # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_SET?User='******'user'] + '&Password='******'password'] + '&StartDate=' + date + '&ActualChunk=' + str(chunk) + '&TotalChunk=' + \ str(total) + '&Status=EnProgreso&FileName=' + fileUploaded + '&TransactionType=1' # si el es diferente de 5 mb, se esta actualizando else: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_UPDATE?User='******'user'] + '&Password='******'password'] + '&ActualChunk='+str(chunk)+'&Status=EnProgreso&FileName=' + fileUploaded + '&TransactionType=1' elif status == 2: # Url de la api REST para la subida de archivos url = const.IP_SERVER + '/DBProtector/FileTransaction_DELETE?User='******'user'] + '&Password='******'password'] + '&FileName=' + fileUploaded + '&TransactionType=1' try: # Realiza la peticion req = urllib2.Request(url) response = urllib2.urlopen(req) except urllib2.HTTPError, e: log.newLog("http_error", "E", e.fp.read())