nUpdate - Die komfortable Updatelösung

    • Release
    • Open Source

    Es gibt 990 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

      Wie meinst Du vorher abfangen, @thefiloe? Das soll ja gemacht werden.
      Edit @DerTim: Ich hab's mir jdf. nochmal angeschaut. Du willst ja eigentlich nicht wissen, ob es Updates gibt. Das Problem ist ja eigentlich nur, dass er die Anwendung nicht beendet, da Du das verhinderst.
      Folglich sollte man da nicht so ansetzen, zumal nicht sicher ist, ob der Benutzer das Update überhaupt installieren wird. Das ​UpdaterUI wurde so gebaut, dass alles automatisch abläuft und man als Entwickler nichts mehr machen muss. Also vorgesehen ist, dass man "Update" drückt und dann wird alles automatisch heruntergeladen und installiert. Nicht aber, dass man dann zwischendrin noch irgendwelche Dinge abfragen und setzen muss. Das kann ja auch gar nicht funktionieren, weil das alles in einen Methodenaufruf verpackt ist.
      Die Sache ist jetzt die, dass Du eigentlich nur dafür sorgen musst, dass die Anwendung immer beendet wird. Daher mein Ansatz:
      1. Implementiere eine Unterklasse von ​UpdateManager und nenne sie ​CustomUpdateManager.
      2. Überschreibe die Methode ​TerminateApplication und rufe da ​Environment.Exit auf.
      3. Ersetze Deine entsprechende Instanz mit einem Objekt dieser neuen, eigenen Klasse.
      Standardmäßig ruft nUpdate nämlich in der 3.x nur ​Application.Exit auf. Wenn Du das Schließen verhinderst, klappt es natürlich nicht mehr. Daher müsstest Du dann eben ohne Rücksicht darauf die Anwendung beenden.
      Um das Speichern von Daten etc. musst Du Dich natürlich vorher noch kümmern.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

      Nur kurze Meldung: nUpdate steht jetzt unter der MIT-Lizenz.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Ok also noch ein kleiner Fehler den ich gefunden hab:
      Es werden nicht immer alle Updates installiert...
      Reproduzierbar:
      1. neues Testprojekt erstellen
      2. drei Versionen auf den FTP hochladen
      3. Die Exe mit der niedrigsten Version starten und nach Updates suchen
      ^da funktioniert noch alles sehr gut
      4. Update Nr. 2 auf "Necessary" stellen
      5. Schritt 3 wiederholen
      nUpdate wird nun nach Updates suchen und zwei finden, nämlich Nr. 2 und Nr.3
      Klickt man nun aber auf installieren, wird nur Nr. 2 installiert. Danach muss nUpdate nochmal suchen. Findet dann natürlich nur noch Nr. 3 und die Installation davon klappt dann auch super...

      Edit: Fehler liegt in nUpdate UpdateInstaller.exe. Diese wird nämlich mit den richtigen Args aufgerufen:
      "[..]nUpdate UpdateInstaller.exe" "[..]nUpdate\testnUpdate\0.0.0.2.zip%[..]\nUpdate\testnUpdate\0.0.0.3.zip"|"[..]
      Edit2: Ich glaub das ist nen Logikfehler, bei dem das Program erst mit Packet Nr. 3 und dann danach mit Packet Nr. 2 überschrieben wird (also falschrum). Dann ist das letzte nämlich Nr. 2


      Lg Mokki
      ​Smartnotr - ein intelligentes Notizprogramm
      zum Thread

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mokki“ ()

      Danke, ich schaue mir das an. Das dürfte natürlich nicht passieren.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Das wäre natürlich toll, weil ich zur Zeit etwas verhindert bin. Aber ab nächste Woche habe ich dann wieder genug Zeit. :)

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Also ich hatte jetzt doch nicht so viel Zeit wie erwartet, aber das ist das was ich gefunden habe:
      Ich hab erstmal noch ein viertes Packet hinzugefügt und Nr. 3 auch auf "Necessary" gestellt-
      Dann musste nUpdate drei Mal starten.
      Danach habe ich nUpdate UpdateInstaller manuell aufgerufen und die Argumente soweit verändert, dass ich die Reihenfolge der .zips umgedreht war.
      ​Also anstatt:
      "[..]nUpdate UpdateInstaller.exe" "[..]nUpdate\testnUpdate\0.0.0.2.zip%[..]\nUpdate\testnUpdate\0.0.0.3.zip"|"[..]
      "[..]nUpdate UpdateInstaller.exe" "[..]nUpdate\testnUpdate\0.0.0.3.zip%[..]\nUpdate\testnUpdate\0.0.0.2.zip"|"[..]
      Das hat aber auch nichts geholfen, also muss der Fehler irgendwo im Code liegen und er muss irgendwo die Dateien umsortieren.
      Ich hab dann nochmal mit Procmon mitgehört:
      Spoiler anzeigen

      [...],"nUpdate UpdateInstaller.exe","11532","CreateFile","[...]\0.0.0.2.zip","SUCCESS","Desired Access: Generic Read, Disposition: Open, [...] OpenResult: Opened"
      [...],"nUpdate UpdateInstaller.exe","11532","CreateFile","[...]\0.0.0.3.zip","SUCCESS","Desired Access: Generic Read, Disposition: Open, [...] OpenResult: Opened"
      [...],"nUpdate UpdateInstaller.exe","11532","CreateFile","[...]\0.0.0.4.zip","SUCCESS","Desired Access: Generic Read, Disposition: Open, [...] OpenResult: Opened"

      [...],"nUpdate UpdateInstaller.exe","11532","ReadFile","[...]\0.0.0.4\Program\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"
      [...],"nUpdate UpdateInstaller.exe","11532","WriteFile","[...]\Debug\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"
      [...],"nUpdate UpdateInstaller.exe","11532","ReadFile","[...]\0.0.0.3\Program\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"
      [...],"nUpdate UpdateInstaller.exe","11532","WriteFile","[...]\Debug\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"
      [...],"nUpdate UpdateInstaller.exe","11532","ReadFile","[...]\0.0.0.2\Program\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"
      [...],"nUpdate UpdateInstaller.exe","11532","WriteFile","[...]\Debug\testnUpdate.exe","SUCCESS","Offset: 0, Length: 32.768, Priority: Normal"

      [...],"nUpdate UpdateInstaller.exe","11532","SetDispositionInformationFile","[...]\0.0.0.2\Program\testnUpdate.exe","SUCCESS","Delete: True"
      [...],"nUpdate UpdateInstaller.exe","11532","SetDispositionInformationFile","[...]\0.0.0.3\Program\testnUpdate.exe","SUCCESS","Delete: True"
      [...],"nUpdate UpdateInstaller.exe","11532","SetDispositionInformationFile","[...]\0.0.0.4\Program\testnUpdate.exe","SUCCESS","Delete: True"


      ​Die zips werden entpackt -> Reinfolge korrekt
      ​Die Exe wird kopiert -> Reinfolge nicht korrekt
      ​Alles wird gelöscht -> Reinfolge korrekt

      ​Der einzige Sortbefehl den ich jetzt beim Überfliegen des Codes gefunden habe, ist dieser: Program.PackageFilePaths.OrderBy(item => new UpdateVersion(Path.GetFileNameWithoutExtension(item))))

      ​Hab aber gerade keine Zeit alles zu pull, zu dbg und zu überprüfen ob des wirklich der Fehler ist. Hoffe es hilft dir trotzdem :)


      Lg Mokki
      ​Smartnotr - ein intelligentes Notizprogramm
      zum Thread

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mokki“ ()

      Jo, da liegt der Fehler, danke.
      github.com/ProgTrade/nUpdate/b…ore/UpdateVersion.cs#L161
      Das wird dann umgekehrt sortiert. So oder so ist das Sortieren aber eigentlich redundant, weil es ja bereits geordnet ist.
      Danke für Deine Mühen! Ich werde das demnächst beheben.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hallo Trade,

      gibts eigentlich eine Möglichkeit, dem Updater Benutzer/Pwd mitzugeben? Das Update-Verzeichnis auf dem Server sollte durch htaccess/htuser geschützt werden.
      Denn ohne, kann ich mir zumindest die json-Datei schonmal über http/s anzeigen lassen und auslesen.

      Ich hab in den Docs nix gefunden.

      Gruß, Sven
      Hi,

      nein, dafür gibt es keine Möglichkeit. Aber was ist daran problematisch, wenn die updates.json ausgelesen werdem kann?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Wenn Du da ein Passwort einrichtest, dann muss nUpdate das ja irgendwie eingeben können. Dazu muss man das ja bereitstellen, was aber wiederrum bedeutet, dass man auf dieses Zugriff hat und somit auch in dieses Verzeichnis kommt. Was nUpdate kann, kann dann auch der Benutzer.

      Verstehe Dich aber nicht. Inwiefern soll denn diese Download-Kontrolle was bringen?
      Jeder Benutzer kann doch Updates herunterladen. Das ist ja der Sinn. nUpdate macht ja nichts anderes, nur eben automatisiert.
      Zudem bringt einem das ja daher nichts.

      Wenn jemand dann was hochladen kann, dann stimmt allerdings etwas mit Deiner Servereinrichtung nicht.
      ich meine, stellst Du da etwa ein PHP-Skript bereit, mit dem Du irgendwelche Benutzer Dateien hochladen lässt?

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hochladen ist natürlich ein anderes Thema, stimmt schon.
      Aber wenn "irgendeiner" von außen den Server scannt und dann auf diese Daten stösst, fände ich dies nicht so prickelnd.
      Die Benutzer meines Programms sollen Zugriff haben und Aktualisieren dürfen, natürlich!
      Aber so könnte man den Zugriff einschränken, d.h. man müsste dann Benutzer/Pwd angegeben/mitgeben können.

      Es ist ja dann wiederum möglich, in der htuser mehrere Benutzer einzutragen und gegenzuprüfen, ob diese berechtigt sind!
      (für mich eine einfache Benutzerverwaltung ;) )
      So hab ich das mit dem updateSystem.Net gelöst - "Credentials" hieß das glaub ich.

      Sven
      Ich verstehe, was Du meinst.

      SvenS schrieb:

      Aber wenn "irgendeiner" von außen den Server scannt und dann auf diese Daten stösst, fände ich dies nicht so prickelnd.
      Naja, ich würde das nicht so eng sehen. In diesem Verzeichnis befinden sich (durch nUpdate allein) keine kritischen Daten. Das heißt, mit denen kann man nichts anfangen, außer updaten.
      Und im Internet ist nun mal alles so verfügbar, dass jeder darauf zugreifen kann, wenn es möglich ist. ;)
      In dem Fall kannst Du ja über .htaccess das Directory Listing ausmachen, um die Verzeichnisinhalte etc. nicht preiszugeben.

      Das Ding ist halt, dass eine Authentifizierung das Ganze nur noch komplizierter macht, als es eigentlich nötig wäre. Ich meine, es kann ja nichts passieren. Derjenige kann dann das Update herunterladen und die Dateien nutzen, aber das war's auch schon. So gesehen bringt das aber ja keinerlei Vorteil. Und dem Server macht das ja auch nichts.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Ich kenne diese Meinung nur allzu gut!

      Naja, ich würde das nicht so eng sehen. In diesem Verzeichnis befinden sich (durch nUpdate allein) keine kritischen Daten.


      Warum sollten wir Sicherheitsmechanismen nicht anwenden, wenn es doch schon solche gibt!?
      (Und ich hätte aber eine/meine "einfache Benutzerverwaltung" ! ;) )

      Ist es jetzt wirklich sooo aufwendig, Benutzer/Pwd-Abfrage als optionale Parameter zu integrieren?


      So gesehen bringt das aber ja keinerlei Vorteil

      - Sicherheit des Servers
      - einfache Benutzerkontrolle ;)

      Gruß, Sven
      @SvenS so schwierig wird es bestimmt nicht sein, aber warum hast du angst, selbst wenn Directory Listing aus ist, das jemand zugriff auf die Package von nUpdate hat? (Zumal man sowieso den genauen Dateinamen bräuchte um diese zufinden). Der Inhalt dieser Package ist doch einfach das Update was der Nutzer so und so herunterladen kann? Wenn sich solch "kritische" Dateien in diesem Verzeichniss befinden kannst du doch einfach ein Unterordner machen und die nUpdate JSON-Konfigurationsdatei durch nUpdate in diesen verschieben.
      Hi Leute,
      ich würde das eben gern haben! Ist ja optional - muss doch keiner verwenden.
      Aber da müssen wir (Desktop-Progger) uns nicht wundern, wenn der Admin des WebServers (das muss ja nicht immer wir selbst sein, sondern in einer Firma) sich über uns (Desktop-Progger) beschwert!
      Das ist nun einmal meine Meinung, das man Sicherheits-Vorgaben des WebServer-Admins/Hoster/etc. auch bedienen kann.

      Zudem, jetzt komme ich wieder zur Benutzerkontrolle, wäre es doch ein tolles neues Feature, wenn man über die nUpdate-Administration eine kleine Benutzerkontrolle führen kann.
      Es wird dann halt die htuser/... jedesmal aktualisiert.
      Bei großen Installationen macht das natürlich keinen Sinn, tausende Benutzer-Daten mitzuführen.
      Aber wie beschrieben, diese Benutzerkontrolle muss ja nicht integriert werden-wäre nur ein New Feature, aber die "Credentials"!

      Gruß
      @SvenS
      Kenne keinen der sich beschwert weil ich kein HTACCESS nutze für die Updates.
      In dem Ordner sind ja keine sensiblen Daten. Nur das was halt eben jeder sehen.
      Und selbst wenn du diese zugangsdaten brauchst:

      JEDER der dein Programm dann besitzt liest diese Daten dann aus und kann auch ohne Programm darauf zugreifen.
      Verstehe also an sich den Sinn dahinter nicht da es eh wiederum jeder auslesen kann und dann auch ohne dein programm nutzen kann.
      Grüße , xChRoNiKx

      Nützliche Links:
      Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
      @xChRoNiKx
      zur Erklärung:
      - in der htuser hinterlegst Du Benutzername/Pwd jedes einzelnen Anwenders Deiner Anwendung
      - Du gibst dann Benutzername/Pwd dem Anwender in die Hand, die dieser dann in der Anwendung eintragen soll
      - sofern der Benutzer Zugriffsrechte auf Aktualisierungen hat, kann er eben darauf zugreifen
      - wenn Du nun den Benutzername/Pwd aus der htuser entfernst hat er keinen Zugriff mehr auf die Aktualisierungen, kann aber die Anwendung weiter benutzen - nur ohne Updates!

      Benutzername/Pwd sollten natürlich nicht in die Anwendung einkompiliert werden - das muss der Anwender eingeben.
      Ich schreibe das mal auf die ToDo-Liste.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: