def send_file(connection_socket): try: # Abrindo arquivo para enviar arquivo = open("backup{0}{1}{2}".format(getFileSeparator(), getNameFile(), ".zip"), "rb") # Lendo os primeiros bytes do arquivo l = arquivo.read(1024) print("Iniciando envio do arquivo de backup...") # Continua enviando equanto houver dados do arquivo para ser lido e enviado. while(l): connection_socket.send(bytes(l)) l = arquivo.read(1024) print("Envio finalizado!") # Fechando o arquivo arquivo.close() except (ConnectionResetError): gera_log(connection_log,"Erro no envio do(s) arquivo(s). Conexão reiniciada pelo cliente.") connection_socket.close() except (ConnectionAbortedError): gera_log(connection_log,"Erro no envio do(s) arquivo(s). Conexão abortada pelo cliente.") connection_socket.close() except (ConnectionRefusedError): gera_log(connection_log,"Erro no envio do(s) arquivo(s). Conexão recusada pelo cliente.") connection_socket.close()
def get_zip_files(): # Obtém o arquivo zip. zf = zipfile.ZipFile("backup{0}{1}{2}".format(getFileSeparator(), getNameFile(), ".zip")) # Obtém lista de arquivos do zip. arquivos_list = zf.namelist() # Retorna lista de arquivos do arquivo zip. return arquivos_list
def get_zip_md5(): # Abrindo arquivo para obter o checksum md5 arquivo = open("{0}{1}{2}{3}".format("backup",getFileSeparator(), getNameFile(), ".zip"), "rb") # Obtendo hash md5 do conteudo do arquivo checksum_md5 = hashlib.md5(arquivo.read()).hexdigest() # Fechando o arquivo arquivo.close() # retornando o checksum_md5 do conteudo arquivo zip return checksum_md5
def get_property(): # Armazenando em um dicionário os dados. dados = { "ip" : "{0}".format(get_ip_address()), # ip do host "porta": server_port, # porta de conexão "name_file": "{0}".format(getNameFile()), # nome do arquivo "checksum_md5": get_zip_md5(), # checksum_md5 do arquivo zip. "date": time.strftime("%d-%m-%Y"), # data de envio "hour": time.strftime("%H-%M-%S") # hora de envio } # Retornando dicionário com os dados. return dados
def main(): # Inicializando o connection_socket como nulo. connection_socket = None try: # Verifica se as pastas de log e backup existem. checkPath("log") checkPath("backup") # Cria o arquivo de backup. createZipFile("files") # Gera a senha de conexão key_connect = hashlib.md5("123456".encode("utf-8").strip()).hexdigest() # Obtém a conexão com o servidor de backup, caso contrário recebe None. connection_socket = get_connection() # Verificando se a conexão foi estabelecida. if (connection_socket): try: # recebendo a chave de conexão do cliente. key_server = connection_socket.recv(1024).decode("utf-8") # Gravando a informação sobre a conexão no histórico. history_data = "\n[{0} - {1}]: {2}".format(get_data(), get_hora(), "Conexão estabelecida com sucesso!") gera_log(history_log, history_data) #print ("Senha do Server: " + keyServer) # Verificando a chave do servidor de backup if (key_connect == key_server): if (os.path.exists("{0}{1}{2}{3}".format("backup",getFileSeparator(), getNameFile(), ".zip"))): # Enviando mensagem de acesso autorizado para o servidor de backup. connection_socket.send(bytes("Conectado!".encode("utf-8").strip())) # Obtendo propriedades do host e dos arquivos dados = get_property() # Transformando o dicionário para um objeto json para ser enviado ao servidor de backup. json_dados = json.dumps(dados) # Enviando os dados do host e do arquivo para o servidor de backup. send_property(connection_socket, json_dados) # Enviando o arquivo zip para o servidor de backup send_file(connection_socket) if(checkPath("log")): logData = "\n[{0} - {1} - {2}:{3}]\n\t{4}".format(get_data(), get_hora(), dados["ip"], dados["porta"], '\n\t'.join(get_zip_files())) # Gera o arquivo de relatório. gera_log(connection_log, logData) else: print("Não foi encontrado arquivo de backup.") # Finalizando a conexão connection_socket.close() # Gravando no log de conexões. history_data = "\n[{0} - {1}]: {2}".format(get_data(), get_hora(), "Conexão finalizada!") gera_log(history_log, history_data) except (socket.herror, socket.gaierror, socket.error): history_data = "\n[{0} - {1}]: {2}".format(get_data(), get_hora(), "Ocorreu um erro no estabelecimento da conexão.") if(checkPath("log")): gera_log(history_log, history_data) except (socket.timeout): history_data = "\n[{0} - {1}]: {2}".format(get_data(), get_hora(), "O tempo limite para estabelecimento de conexão foi atingido.") if(checkPath("log")): gera_log(history_log, history_data) except (KeyboardInterrupt, SystemExit): # verificando se há conexão estabelecida pra fechar. if(connection_socket != None): connection_socket.close()