Patcher erstellen

  • Hallo,
    ich wollte mir für ein Projekt einen Patcher erstellen, nur hab ich 0 plan wie ich das machen soll. Der Patcher soll folgendes mache:
    eine versionsdatei im client auslesen ob sie aktuel ist und bei bedarf die ausgewählten datein runterladen und überschreiben (datein sollen in i-einer patch.ini z.B stehn) (Beispiel: Serverside versiondatei steht 1.0.0 und in der Client versionsdatei steht 1.0.0 --->soll nichts patchen, wenn unterschiedlich dann ausgewählte datein patchen)

    Ich hoffe ihr habt verstanden was ich mein und ihr könnt mir helfen =)

  • erstmal danke,
    aber was ist dort mit checksum gemeint??


    Jede Datei bekommt eie Prüfsumme. Wenn diese anders ist, hat sich die Datei geändert und muss aktualisiert werden (entweder gibt es eine neue Version oder der Anwender hat seine Datei geändert -> das ist also auch nicht erlaubt)

  • Du brauchst die neue AutoIt-Version 3.3.4.0.

    ok geht,
    nur übersteigt das script wo ich aus dem Thread hat meine kenntnissse,
    könnte mir mal jemand ein Beispiel dazu machen, am besten mit Idioten sicherer Erklärung
    Createlist.au3

    Spoiler anzeigen

    #include<Crypt.au3>

    ; Funktion zum Erstellen der Dateiliste, die der Updater runterladen wird
    ; $sFile ist die Datei, in der die Hash-Strings gespeichert werden
    ; $sUpdateDir ist das Verzeichnis, dess Dateien gelistet werden sollen (rekursiv)
    ; $sDownloadDir ist die URL mit Verzeichnis, in dem die aktuellen Dateien liegen werden.
    Func _CreateUpdatesList($sFile, $sUpdateDir, $sDownloadDir)
    ; Author: Prog@ndy
    If StringRight($sUpdateDir,1)<>'\' Then $sUpdateDir &= '\'
    If StringRight($sDownloadDir,1)<>'/' Then $sDownloadDir &= '/'
    Local Const $iDirLen = StringLen($sUpdateDir)
    Local $aFileList = _FileListToArrayRek($sUpdateDir)
    If @error Then Return SetError(1,0,0)
    Local $hFile = FileOpen($sFile, 258)
    If @error Then Return SetError(2,0,0)
    _Crypt_Startup()
    For $i = 1 To $aFileList[0]
    $sSubPath = StringTrimLeft($aFileList[$i], $iDirLen)
    $sHash = _Crypt_HashFile($aFileList[$i], $CALG_MD5)
    FileWrite($hFile, StringFormat("%s|%s|%s%s\r\n", $sSubPath, $sHash, $sDownloadDir, StringReplace($sSubPath, '\', '/', 0, 1)))
    Next
    _Crypt_Shutdown()
    FileClose($hFile)
    Return 1
    EndFunc

    Func _FileListToArrayRek($sPath)
    ; Author: Prog@ndy
    Local Static $files, $depth=0
    If StringRight($sPath,1)<>'\' Then $sPath &= '\'
    Local $hFind = FileFindFirstFile($sPath & "\*.*"), $sFile
    If @error=-1 Then Return SetError(1,0,0)
    $depth += 1
    While 1
    $sFile = FileFindNextFile($hFind)
    If @error Then ExitLoop
    Switch @extended
    Case 1
    Sleep(10)
    _FileListToArrayRek($sPath&$sFile)
    Case Else
    $files &= $sPath&$sFile&'|'
    EndSwitch
    WEnd
    FileClose($hFind)
    $depth -= 1
    If $depth=0 Then
    If $files='' Then Return SetError(1,0,0)
    Return StringSplit(StringTrimRight($files,1), '|')
    EndIf
    EndFunc

    ; ------------------------------------------------------------------------------------------------------------------------
    ; BEISPIEL:
    ; ------------------------------------------------------------------------------------------------------------------------
    _CreateUpdatesList(@ScriptDir&'\updates.txt', @ScriptDir&'\dateien', 'http://example.com/update')
    ; ------------------------------------------------------------------------------------------------------------------------
    ; ------------------------------------------------------------------------------------------------------------------------


    Update.au3

    Spoiler anzeigen

    #include<Crypt.au3>

    ; $sUpdateURL: Datei im Internet oder lokal, die die MD%-Hashes enthält
    ; $sUpdatePath: Das Verzeichnis, in dem die Dateien verglichen und werden
    Func _CheckUpdates($sUpdateURL, $sUpdatePath)
    ; Author: Prog@ndy
    ;~ ; Beispielformat für die Textdatei (UTF-8 ohne BOM):
    ;~ Dateiname|MD5-Hash|Download-Adresse{@CRLF}
    ;~ test.txt|0x16f50d7f1078ae2116f3e9fa4ba25203|http:/download.com/a.txt
    ;~ temp.txt|0x0401DEFCF635DE4EAE161DC1F0F643DA|http:/download.com/b.txt
    $sUpdatePath = StringReplace(StringReplace($sUpdatePath, '/', '\')&'\', '\\', '\')
    Local $aUpdateFiles[1][4] = [[0]]
    Switch StringInStr($sUpdateURL, "://")
    Case 0
    Local $hFile = FileOpen($sUpdateURL, 16)
    If @error Then Return SetError(1,0,0)
    Local $sSource = FileRead($hFile)
    FileClose($sSource)
    Case Else
    Local $sSource = InetRead($sUpdateURL)
    If @error Then Return SetError(1,0,0)
    EndSwitch
    ;~ $sSource = StringToBinary("test.txt|0x16f50d7f1078ae2116f3e9fa4ba25203|http:/download.com/a.txt" & @CRLF & _
    ;~ "temp.txt|0x0401DEFCF635DE4EAE161DC1F0F643DA|http:/download.com/b.txt", 4)
    $sSource = StringSplit(BinaryToString($sSource, 4), @CRLF, 1)
    If StringLeft($sSource[1], 3) = Chr(0xEF)&Chr(0xBB)&Chr(0xBF) Then $sSource[1] = StringTrimLeft($sSource[1], 3)
    Local $aFile, $sHash
    Local $aUpdateFiles[$sSource[0]+1][4] = [[0]]
    _Crypt_Startup()
    For $i = 1 To $sSource[0]
    $aFile = StringSplit($sSource[$i], '|', 2)
    If UBound($aFile)<>3 Then ContinueLoop ; Name|MD5|URL
    $sHash = _Crypt_HashFile($sUpdatePath & $aFile[0], $CALG_MD5)
    If $aFile[1] <> $sHash Then
    $aUpdateFiles[0][0] += 1
    $aUpdateFiles[$aUpdateFiles[0][0]][0] = $aFile[0]
    $aUpdateFiles[$aUpdateFiles[0][0]][1] = $aFile[1]
    $aUpdateFiles[$aUpdateFiles[0][0]][2] = $aFile[2]
    $aUpdateFiles[$aUpdateFiles[0][0]][3] = $sHash
    EndIf
    Next
    ReDim $aUpdateFiles[$aUpdateFiles[0][0]+1][4]
    _Crypt_Shutdown()
    Return $aUpdateFiles
    ; Rückgabe:
    ;~ Dateiname|MD5-Hash|Download-Adresse|lokaler MD5{@CRLF}
    EndFunc


    ; ------------------------------------------------------------------------------------------------------------------------
    ; BEISPIEL:
    ; ------------------------------------------------------------------------------------------------------------------------
    #include<Array.au3>
    $sZiel = @ScriptDir&'\dateien\'
    $aUpdates = _CheckUpdates(@ScriptDir&'\updates.txt', $sZiel)
    _ArrayDisplay($aUpdates)
    For $i = 1 To $aUpdates[0][0]
    MsgBox(0, '', "z.B. Download datei..."& @CRLF & $aUpdates[$i][0] & @CRLF & "Von: " & $aUpdates[$i][2] &@CRLF & "Nach: " & $sZiel)
    Next
    ; ------------------------------------------------------------------------------------------------------------------------
    ; ------------------------------------------------------------------------------------------------------------------------

  • Hi,

    ich hab sowas irgendwann mal geschrieben. Hintergrund war die Versionierung von Betriebssystemimages und deren Synchronisierung. Aber egal - die Methode war identisch ;). Ich habe damals einen Daemon gebaut, der von einem Referenzserver eine INI Datei holt und einen bestimmten Wert mit seiner lokalen Datei vergleicht. Sollte der Wert der heruntergeladenen Datei größer sein, wird synchronisiert - in deinem Fall gepacht.

    Ein Beispiel wäre das hier:

    [autoit]


    InetGet("ftp://server/pfad/zur/versionsdatei.ini", @TempDir & "\versionsdatei.ini") ;für SMB Verbindungen reicht ein simples FileCopy
    $remote_version = IniRead(@TempDir & "\versionsdatei.ini","Version","remote","")
    $local_version = IniRead("C:\pfad\zur\lokalen\versionsdatei.ini","Version","local","")
    If $remote_version > $local_version Then
    Run("start_update.exe")
    EndIf

    [/autoit]


    Die Idee mit der MD5 Summe halte ich für eine Versionierung recht ungeeignet, da sich die Summe verändert, sobald sich die Datei ändert. Prüft man die MD5 Summen und stellt eine Veränderung fest, kann man nicht zweifelsfrei feststellen ob sich die Programversion geändert hat und gepacht werden muss.

  • also 1 Woche ist doch keine Zeit, oder... ?

    PS: in meiner Sig hab ich ein Script, mit dem ich mal sowas umgesetzt habe.
    Die schwierigkeit ist für mich nur, zu erklären wie es funktioniert, da man dazu schon einiges an Vorarbeit leisten muss.
    Webspace, FTP-Zugang usw...
    Aber wenn jemand was damit anfangen kann.
    Gerne :D

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Zitat

    also 1 Woche ist doch keine Zeit, oder... ?


    Fast, eine woche UND EIN JAHR ^^

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • :rofl:
    sch***
    Hab ich gar nicht gesehn. Okay, Punkt für Dich

    Bin wohl noch nicht so ganz im Neuen Jahr angekommen :rofl:

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • bei den kleinen Zahlen vom Datum kann sich ein alter Mann ja auch mal vergucken :rofl:
    So gut jetzt. mea culpa :D

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)