Patcher Entwicklung

  • Ich frag mich nur wo im Script sich der Updater die updates.txt aus dem Inet holt? gar nicht :D?

  • Ich frag mich nur wo im Script sich der Updater die updates.txt aus dem Inet holt? gar nicht :D?


    _CheckUpdates lässt die Angabe von lokalen Pfaden und URLs zu. Zum testen hab ich einfach eine lokale datei verwendet ;)

    [autoit]

    _CheckUpdates('http://www.example.com/updater.txt', $sZiel)

    [/autoit]
  • Hab alles eingestellt und lokal versucht, allerdings kommt ein Error in Line 56.

    For $i = 1 To $aUpdates[0][0]
    For $i = 1 To $aUpdates^Error

    Error: Subscript used with non-Array variable.

  • Hab alles eingestellt und lokal versucht, allerdings kommt ein Error in Line 56.

    For $i = 1 To $aUpdates[0][0]
    For $i = 1 To $aUpdates^Error

    Error: Subscript used with non-Array variable.


    Das heißt, bei der Verbindung gab es einen Fehler. Ich musste aber noch was an der FUnktion ändern, da manche FTP-programme @CRLF in @LF umwandeln und dann das Splitten nicht mehr funktioniert hat. So läuft es bei mir:

    Spoiler anzeigen
    [autoit]

    #include<Crypt.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; $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 = StringSplit(StringStripCR(BinaryToString($sSource, 4)), @LF, 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ------------------------------------------------------------------------------------------------------------------------
    ; BEISPIEL:
    ; ------------------------------------------------------------------------------------------------------------------------
    #include<Array.au3>
    $sZiel = @ScriptDir&'\dateien\'
    ;~ $aUpdates = _CheckUpdates(@ScriptDir&'\updates.txt', $sZiel)
    HttpSetUserAgent("AppUpdater") ; für bplaced + square7 nötig
    $aUpdates = _CheckUpdates('http://...', $sZiel)
    _ArrayDisplay($aUpdates)
    For $i = 1 To $aUpdates[0][0]
    SplashTextOn("Download Patch", $aUpdates[$i][0] & @CRLF & "Von: " & $aUpdates[$i][2] &@CRLF & "Nach: " & $sZiel)
    If StringInStr($aUpdates[$i][0], '\') Then DirCreate( $sZiel & StringRegExpReplace($aUpdates[$i][0], '\\[^\\]*$', ''))
    InetGet($aUpdates[$i][2], $sZiel & $aUpdates[$i][0], 1)
    ;MsgBox(0, '', "z.B. Download datei..."& @CRLF & $aUpdates[$i][0] & @CRLF & "Von: " & $aUpdates[$i][2] &@CRLF & "Nach: " & $sZiel)
    SplashOff()
    Next
    ; ------------------------------------------------------------------------------------------------------------------------
    ; ------------------------------------------------------------------------------------------------------------------------

    [/autoit]
  • Hmm man muss den Patcher aber immer 2 mal ausführen!?
    Beim erstmal legt er nur die Unter Ordnern an und deren Dateien.
    Allerdings nicht die in /dateien/

    Einmal editiert, zuletzt von Silverlight (2. Februar 2010 um 22:26)

  • Hallo,
    ich weiß das dieses Thema schon älter ist, jedoch habe ich genau sowas gesucht.

    Hier nun meine Frage:

    Das Skript, so wie es hier von Progandy geschrieben ist funktioniert bei mir lokal mit einem xampp Server problemlos.
    Alle Verzeichnisse und Dateien werden problemlos "gepatcht" wenn veränderungen an diesen vorliegen.
    Jetzt aber wollte ich das ganze mit IIS 7.5 testen und er lädt nur die Verzeichnisse herrunter und keine Dateien ;(
    Den "mime-typ" habe ich für jeden Dateityp angepasst und es läßt sich auch anhand der url im Browser runterladen.
    Was müßte ich ändern, das es auch unter IIS 7.5 funktioniert?

    Einmal editiert, zuletzt von Jensen.. (15. September 2014 um 13:46)

  • Dann gibt halt mal @error von InetGet aus und schau was der Fehler ist.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke für die schnelle Antwort chip,

    mein Problem hat sich jedoch schon aufgelöst :)
    es lag nicht am Script wie ich anfangs vermutet hatte, ich habe noch einmal eine subdomain eingerichtet und die Berechtigungen gesetzt, jetzt funktioniert es auch mit ISS 7.
    Leider kann ich nicht mehr nachvollziehen was ich vorher verkehrt gemacht hatte.

    ...schönen Tag noch

  • Hallo,
    das mit der Progressbar würde mich auch noch interessieren.

    also mit einer Datei habe ich sowas auch schonmal gemacht, jedoch der Patcher stellt ja erst anhand von den md5-hash fest welche Datei er laden soll.
    Das heißt, dass die Größe der Dateien die geladen werden bei jeden unterschiedlich sein können.
    Vielleicht kann mir da mal jemand auf die Sprünge helfen?