# Datei von Website runterladen # ohne Angabe von ftp_ziel erfolgt Download ins aktuelle Verzeichnis import pathlib, base64, os #, datetime from datetime import datetime, timezone from datetime import timedelta from ftplib import FTP_TLS from cryptography.fernet import Fernet def get_size_format(n, suffix="B"): # converts bytes to scaled format (e.g KB, MB, etc.) for unit in ["", "K", "M", "G", "T", "P"]: if n < 1024: return f"{n:.2f}{unit}{suffix}" n /= 1024 def utc_diff(): # Winterzeit = 1 , Sommerzeit = 2 t1 = datetime.now().hour t2 = datetime.now(timezone.utc).hour return t1 - t2 def get_datetime_format(zeit): d1 = datetime.strptime(zeit, "%Y%m%d%H%M%S") # convert to datetime object d2 = d1 + timedelta(hours = utc_diff()) # UTC -> MEZ return d2.strftime("%Y-%m-%d %H:%M:%S") # convert to human readable date time string ############################################################## b64key = b'SGFucs05Y2stUNobGVpewmytU3RyTMftOTUwgjhIb2Y=' # generierter b64key fkey = Fernet(b64key) ftps_server = "???????" ftpuser = "????????" ftps_pw = "????????" #ftps_ziel = "D:\\geheim\aes\\" # lokal ftps_quelle = "/geheim//aes//" # Quell-Verz auf FTP server currdir = os.getcwd() # akt. Verz. merken ziel_verz = "" #"D:\\geheim\\" #--------- Download vom Server ------------------------------ try: ftps = FTP_TLS(ftps_server) except: print("kein Internet") #os.chdir("D:\\geheim\\aes\\") # lokales Zielverz. setzen (sonst aktuelles Verz.) ftps.login(ftps_user, ftps_pw) ftps.prot_p() # komplett verschlüsselte Übertragung ftps.encoding = "utf-8" print("FTPS welcome message:", ftps.getwelcome()) ftps.cwd(ftps_quelle) # Quell-Verz. auf Server setzen ################### NLST ######################## liste = [] i= 0 print("*"* 30, "NLST", "*"* 30) print("{:30} {:10} {:10}".format("Nr File Name", "File Size", " letzte Änderung")) print("-"* 64) liste = [] for file_name in ftps.nlst(): last_modified = ftps.voidcmd("MDTM " + file_name) # String! zeit = get_datetime_format(last_modified[4:]) # vorn 4 Zeichen abschneiden liste.append([file_name, zeit]) file_size = "N/A" try: ftps.cwd(file_name) except Exception as e: ftps.voidcmd("TYPE I") file_size = get_size_format(ftps.size(file_name)) print(i + 1, f"{file_name:30} {file_size:>10} {zeit:10}") i = i + 1 print("-"* 64) ######################################################## k = int(input("für Download Nr. eingeben (0=Ende): ")) if k < 1 or k > i: print("Abbruch") else: diff = 0 dateiname = liste[k-1][0] s2z_time = datetime.strptime(liste[k-1][1], "%Y-%m-%d %H:%M:%S") server_z = (s2z_time - datetime(1970, 1, 1)).total_seconds() #print("Zeit remote: ", server_z) # lokale_d = ziel_verz + dateiname[:-4] # lokal vorhanden ? lokale_d = ziel_verz + dateiname[:-4] try: lokale_z = os.path.getmtime(lokale_d) # wann zuletzt geändert ? #print("Zeit lokal ",lokale_z) diff = server_z - lokale_z # wenn diff > 0, dann ist Serverdatei aktueller #print("Diff: ",diff) except: print(f"{lokale_d} lokal noch nicht vorhanden") diff = 99 if diff > 0: # ok , Download with open(dateiname, "wb") as file: ftps.retrbinary(f"RETR " + dateiname, file.write) # Download in binary mode print(f"{dateiname} Download fertig") #---------- entschlüsseln ? ---------------- if dateiname[-4:] == ".aes": with open(dateiname, "rb") as file: encrypted_data = file.read() decrypted_data = fkey.decrypt(encrypted_data) with open(ziel_verz + dateiname[:-4], "wb") as file: file.write(decrypted_data) file.close() print("Entschlüsseln fertig") else: print(dateiname, "musste nicht entschlüsselt werden") else: print(f"{dateiname} - kein Download - lokale Datei ist aktueller") os.chdir(currdir) ftps.quit() x = input("fertig") # verhindert, dass sich Konsolenfenster schließt