Alle meine Laufwerke auf einen FTP Server spiegeln # fehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
bitbum
User
Beiträge: 9
Registriert: Mittwoch 5. September 2012, 10:40

Hi alle,

Ich schreibe gerade an einem Programm, dass für mich ein Spiegelbild des PC auf einem FTP Server erstellt.
Momentan klemmts noch ein bisschen. Hier ist was ich bisher habe.

Code: Alles auswählen

#!/usr/bin/python
import os, shutil, ftplib, platform, win32api

def WhoAreYou():
    targetidaslist = platform.uname()
    targetid = ' '.join(targetidaslist)
    return targetid # to be used as ftp folder

def WhatDrivesYouGot():
    alldrives = win32api.GetLogicalDriveStrings()
    drivelist = alldrives.split('\000')[:-1] # a list with all drives
    return drivelist

def FtpConnectAndSetDir(targetid):
    meinftp = ftplib.FTP("ftp.ich.de")
    meinftp.login("login","passwort")
	
    directory = targetid # steer into target FTP Folder!
    # create dir if it doesn't exist
    try:
        meinftp.cwd(directory) # change dir
    except:
        meinftp.mkd(directory) # make dir
	meinftp.cwd(directory) # change dir

    print directory
    return directory, meinftp

def CopyDataFromAllDrives(directory, drivelist):
    for drive in drivelist:
        for root, dirs, files in os.walk(drive):
            for item in files:
            full_fname = os.path.join(root, item)
            meinftp.storbinary('STOR ' + item, open(full_fname, 'rb')) # hier liegt mein problem momentan

# main operation
##########################
targetid = WhoAreYou()
drivelist = WhatDrivesYouGot()
directory, meinftp = FtpConnectAndSetDir(targetid)
CopyDataFromAllDrives(directory, drivelist)
Der Code kopiert ein paar dateien und dann...
Fehlermeldung:

Code: Alles auswählen

hiberfil.sys
Traceback (most recent call last):
  File "hdtoftpcopier30122012.py", line 56, in <module>
    CopyDataFromAllDrives(directory, drivelist, meinftp)
  File "hdtoftpcopier30122012.py", line 47, in CopyDataFromAllDrives
    meinftp.storbinary('STOR ' + item, open(full_fname, 'rb'))
IOError: [Errno 13] Permission denied: 'C:\\hiberfil.sys'

C:\code>
Für Fingerzeiger in die richtige Richtung bin ich sehr dankbar.
Auch wenn der ganze Ansatz Schrott ist bitte sagen.
Ich bin auch noch nicht sicher wie ich die Ordnerstruktur hinkrieg, dass es die exakt überträgt.
halp.

danke vielmals im voraus.

P.S. ich code nur als Hobby und wenn meine Syntax Müll ist bitte ich um Nachsicht, das ist mein ~7ter Code und bin Selbstbeibringer ohne Mentor (wie wahrschans die meisten).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Die Fehlermeldung sagt es eigentlich schon: Du hast nicht die nötigen Rechte um die Datei zu lesen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
bitbum
User
Beiträge: 9
Registriert: Mittwoch 5. September 2012, 10:40

aber ich bin auf admin account -__-
und eine datei auf meiner eigenen fepla lesen?

das passt irgendwie alles nicht.
BlackJack

@bitbum: Die Ausnahme ist doch recht deutlich: Das Programm, beziehungsweise der Benutzer unter dem es läuft, hat nicht die nötigen Rechte die Datei zu öffnen. Es kann sogar sein, dass alle Rechte der Welt nichts nützen wenn ein anderer Prozess eine Datei bereits exklusiv geöffnet hat. Letztendlich möchte man in einer Sicherungskopie solche Dateien auch gar nicht haben, denn man sichert da im Zweifelsfall einen inkonsistenten Dateizustand.

Beim Quelltext fällt als erstes auf, das sich die Funktionsnamen nicht an die üblichen Konventionen halten. Sowohl was die Schreibweise angeht, als auch die Namen selbst. Für ersteres siehe PEP 8 — Style Guide for Python Code. Ansonsten reflektieren Funktionsnamen in der Regel Tätigkeiten.

Du bindest viel an unnötige Namen. Die ersten beiden Funktionen könnten eigentlich Einzeiler sein.

In der ersten Funktion ist der Kommentar IMHO an der falschen Stelle. Wofür der Rückgabewert verwendet wird entscheidet der Aufrufer.

Der Kommentar in der zweiten Funktion ist IMHO überflüssig. Kommentare sollten einen Mehrwert enthalten. Irgend etwas was man nicht sowieso schon im Quelltext sieht.

Namen sollten in der Regel keinen konkreten Datentyp enthalten. Wenn man den einmal ändert, dann hat man irreführende Namen im Programm oder muss die alle ändern. In der ersten Funktion ist schon ein falscher Name: `platform.uname()` gibt gar keine Liste zurück sondern ein Tupel. Aber das Ergebnis würde ich wie gesagt sowieso nicht extra an einen Namen binden.

Präfixe wie `my` oder in diesem Fall `mein` kann man sich auch sparen. Das macht das Programm kein Stück verständlicher.

Die API von `FtpConnectAndSetDir()` ist eigenartig. Warum wird da intern `targetid` an den Namen `directory` gebunden und warum wird das auch zurückgegeben? Der Aufrufer kennt diesen Wert doch schon — er hat ihn ja selbst beim Aufruf übergeben!

„Nackte” ``except:``-Anweisungen ohne konkrete Ausnahmen sollte man vermeiden. Damit maskiert schnell mal eine unerwartete Ausnahme, also einen Programmfehler, den man dann ewig sucht weil er an der Stelle völlig falsch behandelt wird. Selbst wenn man einmal wirklich *alle* Ausnahmearten behandeln möchte, sollte man in der Behandlung dafür sorgen, dass die Ausnahmen auf irgend eine Weise protokolliert werden, damit man bei der Fehlersuche eine Chance hat. In diesem Fall wäre aber wohl `ftplib.Error` ein passender Kandidat.

In der Kopierfunktion ist ein Einrückungsfehler.

Es werden alle Dateien aus den verschiedenen Unterordnern auf dem FTP-Server in einen Ordner gespeichert. Die Verzeichnishierarchie wird nicht mitgesichert. Was auch bedeutet, dass Dateien mit dem selben Namen sich gegenseitig überschreiben. Das `directory`-Argument wird überhaupt nicht verwendet.

`item` ist ein guter Name wenn einem absolut nichts besseres einfällt. Für einen Dateinamen sollte das aber möglich sein. Zum Beispiel `filename`. Dateien und Dateinamen sind zwei unterschiedliche Dinge. Darauf sollte man auch sorgfältig bei der Namensvergabe achten.

Metadaten wie Benutzer und Zugriffsrechte werden nicht gesichert — können dementsprechend auch nicht wiederhergestellt werden. Damit eignet sich das nur zum Sichern von Daten bei denen einem das egal ist. Ist es das wirklich?

Bei unterschiedlichen Dateisystemen sind unterschiedliche Zeichen in Dateinamen erlaubt. FTP dürfte da sowieso notorisch unterspezifiziert sein, dass heisst was erlaubt ist und was nicht dürfte von dem Dateisystem auf dem FTP-Server abhängen. Es kann also gut sein, dass man nicht alle Dateinamen auf dem FTP-Server sichern kann.
Benutzeravatar
bitbum
User
Beiträge: 9
Registriert: Mittwoch 5. September 2012, 10:40

hey BlackJack

erstmal danke für deine ausführliche antwort. Ich werde den code nochmal entsprechend deinen vielen hinweisen überarbeiten, soweit ich dazu fähig bin.
ich denke ich muss davor noch ein bissi lesen.
wenn der code überarbeitet ist werde ich ihn nochmal posten und hoffe du schaust dann nochmal drüber.

nebst der vielen optischen mägel habe ich den hauptfehler kurzfristig durch ein try/except gelöst. die hiperfill.sys muss wohl von system gebraucht werden.
das problem dass die ordnerstruktur nicht 1 zu 1 übertragen wird, darüber werde ich morgen mal nüchtern nochmal nachdenken.
wenn du bis dahin einen tip hast... bin ich ganz ohr.
Ich denke ich werde wohl wieder auf eine "for x in y:" lösung bauen.

vielen dank nochmal.
ich poste dann wie gesagt den überarbeiteten code.
gruß.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

bitbum hat geschrieben:die hiperfill.sys muss wohl von system gebraucht werden.
In die hiberfil.sys schreibt Windows beim Wechseln in einen Ruhezustand den Inhalt des Arbeitsspeichers um diesen dann beim Aufwachen wieder herstellen zu können.
Demnach völlig sinnfrei, diese Datei zu sichern.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
lunar

Ist es nicht eigentlich allgemein völlig sinnfrei, eine eigene Backup-Lösung zu entwickeln, wo es doch zig gute Backup-Programme gibt?
Benutzeravatar
bitbum
User
Beiträge: 9
Registriert: Mittwoch 5. September 2012, 10:40

lunar hat geschrieben:Ist es nicht eigentlich allgemein völlig sinnfrei, eine eigene Backup-Lösung zu entwickeln, wo es doch zig gute Backup-Programme gibt?
ich code momentan noch zum lernen und nicht um nischensoftware zu entwickeln. um die netzprotokolle und python zu verstehen bieten sich standartsachen nunmal an. könnte mir ehrlichgesagt kein kontraproduktiveres comment in einem pythoncodingforum ausdenken.

es geht in dem projekt auch nicht darum ein "sinnvolles" backup zu erstellen, sondern lediglich darum einfach ein backup zu machen. als proof of concept.. oder einfach nur als test. oder wasauchimmer.
die verfeinerung dessen was letztendlich gesichert werden soll kann dann immernoch einfließen.

hab mittlerweile gelesen dass ftp nicht das beste protokoll für sowas ist. mal schauen..
Antworten