AutoUpdate

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

AutoUpdate

Message par Parole De JOJO »

j'essaye de faire une procedure pour tous mes progs, qui verifie sur mon site est ce qu'il y a une nouvelle version, et si oui il la telecharge et l'installe tout seul (en lancant un deuxieme prog qui efface l'ancien et met a la place le nouveau)
la verite est que j'ai fini mais c'a ma l'ai assez complique, et en plus ca marche pas tout le temps, et je me suis dis que surement quelqun avait deja pnse a ca, et je serais donc interresse de le voir
merci
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: AutoUpdate

Message par Ar-S »

Perso je ne mets pas (encore) à jour les logiciels, en revanche, mes programmes (presque tous) vérifient si une nouvelle version est dispo.
Voilà comment je procède :
Dans un espace de mon site, j'ai toujours le même fichier de misère à jour en .zip (ou .z7) qui se nomme "nomduprogr_update.zip" que j'appelerai "B"
J'ai aussi un fichier texte "C" que je nomme "nomduprogr_maj.txt" qui contient uniquement le numéro de version sous la forme :
*- 1.2 -*
*- et -* sont mes marqueurs.

Lorsque le programme A en locale vérifie sur le net, il récupère donc la source de "C" et compare ce qu'il trouve entre les marqueurs.
if "C_version" > "A_version"
Alors sauve le zip au même emplacement que A.

Ensuite je peux afficher un messagerequester indiquant que la MAJ nécessite de quitter le prog et j'ouvre l'explorer à cet endroit avec un runprogram() juste avant de quitter.

L'utilisateur n'a plus qu'à dé-ziper et ecraser l'exe original.

A terme, je vais aussi faire un Auto updtate.

Je vais procéder de la même façon mais j'aurai un fichier exe supplémentaire qui contiendra la procédure d'installation de la maj.

"A" vérifiera si maj diso
- si OUI -> "A" telecharge la mise à jour en "zip" (j'aime pas télécharger directement un .exe) puis lance autoupdate.exe
Que fait autoupdate ?

1 - il vérifie que le zip est présent
2 - il vérifie que "A" ne tourne pas en tâche de fond, s'il tourne, il le ferme
3 - il renomme "A" en "A.bak" (sécurité sécurité)
4 - il extrait le nouveau A' du zip, Si l'extraction s'est bien passée, il efface "A" et il efface le "zip"
5 - Il lance A' et se ferme
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: AutoUpdate

Message par Parole De JOJO »

ok ca m'a l'air assez complique, je crois que je vais rester sur mon petit update tout simple...

il y a peut etre d'autres moyens?
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: AutoUpdate

Message par Ar-S »

Ba tu veux pas montrer ton programme ?

voilà ma procédure de maj

Code : Tout sélectionner

;-Mise a jour LDV MULTIMEDIA
Global MajZIP$="http://monsite.com/nomduprog_maj.zip"

;{- --- RECUPERATION SOURCE PAGE WEB
ProcedureDLL.s Url2Text2(Url.s, OpenType.b,ProxyAndPort.s)
  ;/ Author : Pille
  isLoop.b=1
  INET_RELOAD.l = $80000000
  hInet.l=0
  hURL.l=0
  Bytes.l=0
  Buffer.s= Space (2048 )
  RES.s= ""
  hInet = InternetOpen_ ( "" , OpenType, ProxyAndPort, "" , 0)
  hURL = InternetOpenUrl_ (hInet, Url, #Null , 0, INET_RELOAD, 0)
  Repeat
    InternetReadFile_ (hURL,@Buffer, Len (Buffer), @Bytes)
    If Bytes = 0
      isLoop=0
    Else
      RES = RES + Left (Buffer, Bytes)
    EndIf
  Until isLoop=0
  InternetCloseHandle_ (hURL)
  InternetCloseHandle_ (hInet)
  ProcedureReturn RES
EndProcedure

ProcedureDLL.s Url2Text(Url.s)
  ProcedureReturn Url2Text2(Url,1, "" )
EndProcedure 
;}- --- FIN RECUPERATION SOURCE PAGE WEB

Procedure MAJour()
  SourceMaj$=Url2Text("http://monsite.com/nomprog.txt")
  MajVersion$=AffichEntre(SourceMaj$,"*-","-*") ; AffichEntre est une lib perso a base de findstring, mid etc... qui affiche le contenu entre 2 caractère donnés (mes marqueurs) 

  If MajVersion$=v$ ; Si la version update est la même que celle du programme
    SetGadgetText(#AFF,"Vous avez déjà la dernière version")
  Else ;
    QuestionTelech=MessageRequester("Mise à jour","Une nouvelle version est disponible, voulez vous la télécharger ?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
    If QuestionTelech=6
      MAJ=ReceiveHTTPFile(MajZIP$,"Update.zip")
      
      If MAJ=1
        SetGadgetText(#AFF,"Le téléchargement est terminé, la mise a jour se trouve dans le répertoire "+Chr(10)+DefPath$)
        
      Else
        SetGadgetText(#AFF,"Le fichier est indisponible, merci de ré-essayer dans quelques minutes.")
      EndIf
    EndIf
  EndIf
EndProcedure

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: AutoUpdate

Message par blendman »

salut
Je me permets de relancer ce sujet, car en ce moment, j'essaie de faire un update automatiquement pour mon jeu.

J'ai donc regarder ta méthode Ar-s.
Et le système de comparer 2 fichiers texte est pas mal ;).

J'aurai 2 questions néanmoins :
Ar-S a écrit :4 - il extrait le nouveau A' du zip, Si l'extraction s'est bien passée, il efface "A" et il efface le "zip"
comment fais-tu cela, j'ai trouvé pureZip, mais lors de l'installation, windows me dit qu'installer ce fichier est risqué, alors, je ne l'ai pas fait :P.

Existe-t-il d'autres libs disons sans installation pour utiliser un zip ?

Je me demandai aussi si on pouvait "vérifier" l'intégrité d'un fichier, la date, le poids, etc (par exemple, pour vérifier qu'on a bien le bon fichier updaté, avec la bonne date, etc..).

Si oui, sais-tu comment on peut faire ça ?

Merci
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: AutoUpdate

Message par Atomo »

PureZip est clean, tu peux le prendre sans soucis, sinon tu peux utiliser la lib "Packer" qui est inclue dans PureBasic.
Enfin, pour vérifier l'intégrité d'un fichier, regarde les fonctions de la lib "Cipher".
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: AutoUpdate

Message par Ar-S »

Si tu n'as qu'un fichier à mettre à jour, met le directement dans ton ftp sans archive.
Sinon tu peux toujours les récupérer un à un. Au pire tu les nommes tous avec une fausse extension genre .xxx et tu les renommes pour les installer. ça évite d'éventuelles soucis (hebergeur reticent pour les exe ou autre antivirus débile lançant des faux positifs.)
Pour PureZip tu n'as rien à craindre.

--edit : grillé par Atomo :)--


Tu peux aussi utiliser une archive vbin2 dont on a déjà parlé.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: AutoUpdate

Message par falsam »

Lire le contenu d'un fichier texte et le comparer à un autre.

Code : Tout sélectionner

ProcedureDLL.s ReadUrlFile(URL.s, OpenType.b=1, ProxyAndPort.s="") 
  ;  OpenType
  ; 1 INTERNET_OPEN_TYPE_DIRECT (Resolves all host names locally.)
  ; 0 INTERNET_OPEN_TYPE_PRECONFIG (Retrieves the proxy Or direct configuration from the registry)
  ; 4 INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY  (Retrieves the proxy Or direct configuration from the registry And prevents the use of a startup Microsoft JScript Or Internet Setup (INS) file.)
  ; 3 INTERNET_OPEN_TYPE_PROXY (Passes requests To the proxy unless a proxy bypass list is supplied And the name To be resolved bypasses the proxy. In this Case, the function uses INTERNET_OPEN_TYPE_DIRECT. )
  
  isLoop.b=1 
  INET_RELOAD.l = $80000000 
  hInet.l=0 
  hURL.l=0 
  Bytes.l=0 
  Buffer.s=Space(2048) 
  RES.s="" 
  
  hInet = InternetOpen_("", OpenType, ProxyAndPort, "", 0) 
  hURL = InternetOpenUrl_(hInet, URL, #Null, 0, INET_RELOAD, 0) 
  
  Repeat 
    InternetReadFile_(hURL,@Buffer, Len(Buffer), @Bytes) 
    If Bytes = 0 
      isLoop=0 
    Else 
      RES = RES + Left(Buffer, Bytes) 
    EndIf 
  Until isLoop=0 
  
  InternetCloseHandle_(hURL) 
  InternetCloseHandle_(hInet) 
  ProcedureReturn RES 
EndProcedure 

Debug ReadUrlFile("http://tonsite.fr/fichier.txt")
Il suffit de comparer le résultat de ReadUrlFile à un autre fichier
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: AutoUpdate

Message par blendman »

salut

Merci pour vos réponses aussi rapides !

Je vais ajouter quelques détails sur ce que je voudrais faire (car j'en ai oublié ;)) :
- en fait, j'ai 2 exe : jeu.exe et update.exe. pour jouer, on clique sur update.exe, qui vérifies d'abord s'il y a une nouvelle version disponible, pour le jeu. Pour cela, la technique d'AR-s de comparer 2 fichier texte, avec chacun un numéro de version est nickel :).
- s'il y a un update de disponible, je télécharge ce fichier. Le fichier est une archive (zip ou autre) contenant des dossiers et d'autres fichiers.

par exemple, imaginons qu'il y ait une nouvelle version (un nouveau zip ou autre), dans ce zip, j'aurai :
- jeu.exe (la nouvelle version)
- un dossier data
- dans le dossier data, j'aurai un dossier image et des fichiers "personnage01.pack", "personnage02.pack", "ennemi02.pack", etc...
- un dossier texte, et dans ce dossier des fichiers genre quete1.txt, quete154.txt, sorts56.dat,
etc...

j'aimerai donc que mon update.exe vérifie s'il y a un update (ça c'est ok), qu'il récupère alors l'archive (zip, vbin2, ou autre : ça c'est ok), et qu'il ouvre cette archive et mette les nouveaux fichiers au bon endroit (ça, je ne sais pas encore faire :)).

Ensuite, j'aimerai vérifier le fichier jeu.exe :
- vérifier si la date de création est ok, si le poids (la taille en ko/mo) est ok, et peut être vérifier d'autres fichiers si besoin.
Pas vraiment vérifier l'intérieur d'un fichier, car pour un exe c'est pas évident, mais au moins la date de création et le poids par exemple).

Ar-S a écrit :Si tu n'as qu'un fichier à mettre à jour, met le directement dans ton ftp sans archive.
Sinon tu peux toujours les récupérer un à un. Au pire tu les nommes tous avec une fausse extension genre .xxx et tu les renommes pour les installer. ça évite d'éventuelles soucis (hebergeur reticent pour les exe ou autre antivirus débile lançant des faux positifs.)
ah oui, l'idée est intéressante, en plus ça me permet de réaliser une barre de progression de téléchargement je pense :).

Je vais essayer ça tiens ;).

Tu peux aussi utiliser une archive vbin2 dont on a déjà parlé.
exact, je l'avais oublié celle-ci, je vais y rejeter un oeil, c'est vrai que ça peut être pas mal pour ce genre de chose :).
Enfin, pour vérifier l'intégrité d'un fichier, regarde les fonctions de la lib "Cipher".
j'ai regardé cette lib, mais je n'ai pas trouvé comment vérifier par exemple la date de création d'un fichier ou le poids (ko) de celui-ci.

mais je me demande si ce que je cherche n'est pas ça :
DirectoryEntryDate(#Repertoire, TypeDate)

falsam : merci pour ton code, ça me servira sans doute par la suite ;)

encore merci pour vos réponses.
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: AutoUpdate

Message par Atomo »

Pour vérifier si 2 fichiers sont identiques, le mieux est d'utiliser la commande : CRC32FileFingerprint(Filename$).
Extrait de la doc :
CRC32 is a 32 bit fingerprint not intended for password storage as it's easily crackable, but for quick data integrity checks. The main advantage of CRC32 over MD5 or other hash algorithm is its very high speed.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: AutoUpdate

Message par blendman »

Atomo a écrit :Pour vérifier si 2 fichiers sont identiques, le mieux est d'utiliser la commande : CRC32FileFingerprint(Filename$).
Extrait de la doc :
CRC32 is a 32 bit fingerprint not intended for password storage as it's easily crackable, but for quick data integrity checks. The main advantage of CRC32 over MD5 or other hash algorithm is its very high speed.
oki, merci pour cette astuce ;).

ça me sera utile effectivement si je dois comparer 2 fichiers.

En fait, pour CRC32, je peux sans doute stocker le résultat dans un fichier et ensuite comparer ce résultat avec le nouveau fichier ?



En fait, je cherchais simplement ceci :

Code : Tout sélectionner

size = FileSize("jeu.exe") 
Resultat = GetFileDate("jeu.exe", #PB_Date_Modified)
Debug "date : "+ Str(resultat) + "/ taille : "+ Str(size)
Etant donné que je connaitrais la date de création et la taille du fichier, je pourrais vérifier si le fichier n'a pas été changé ou s'il n'y a pas un problème avec ce fichier par exemple.
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: AutoUpdate

Message par falsam »

blendman a écrit :j'ai 2 exe : jeu.exe et update.exe. pour jouer, on clique sur update.exe, qui vérifies d'abord s'il y a une nouvelle version disponible, pour le jeu. Pour cela, la technique d'AR-s de comparer 2 fichier texte, avec chacun un numéro de version est nickel :).
je confirme aussi , c'est nickel.
blendman a écrit : .... qu'il ouvre cette archive et mette les nouveaux fichiers au bon endroit (ça, je ne sais pas encore faire) ...
Ton programme Update.exe pourrait charger un autre programme depuis ton hébergement qui contiendra les instructions de mise à jour de ton jeu.

Certains hébergeurs n'aiment pas que des programmes .exe se trouvent sur leurs serveur.
Renomme ton exécutable en .zip

Ton update pourrait contenir une portion de code comme celui-çi.

Code : Tout sélectionner

InitNetwork() And ReceiveHTTPFile("http://tonsite.fr/mamiseajour.zip", GetTemporaryDirectory()+"mamiseajour.exe")
  
  RunProgram(GetTemporaryDirectory()+"mamiseajour.exe")
  
Else
  ;Ton code d'erreur ..... ou pas 
EndIf

mamiseajour.exe contiendrait le code relatif à la mise à jour de chacun des dossiers de ton jeu.

Code : Tout sélectionner

If InitNetwork()
  ReceiveHTTPFile("http://tonsite.fr/quete1.txt",  GetCurrentDirectory()+"quete1.txt")
  ReceiveHTTPFile("http://tonsite.fr/quete2.txt",  GetCurrentDirectory()+"quete2.txt")
  ReceiveHTTPFile("http://tonsite.fr/pack.dat",  GetCurrentDirectory()+"data\pack.dat")  
EndIf
Dernière modification par falsam le mar. 05/avr./2011 17:48, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: AutoUpdate

Message par blendman »

falsam a écrit :
blendman a écrit :j'ai 2 exe : jeu.exe et update.exe. pour jouer, on clique sur update.exe, qui vérifies d'abord s'il y a une nouvelle version disponible, pour le jeu. Pour cela, la technique d'AR-s de comparer 2 fichier texte, avec chacun un numéro de version est nickel :).
je confirme aussi , c'est nickel.
blendman a écrit : .... qu'il ouvre cette archive et mette les nouveaux fichiers au bon endroit (ça, je ne sais pas encore faire) ...
Ton programme Update.exe pourrait charger un autre programme depuis ton hébergement qui contiendra les instructions de mise à jour de ton jeu.

Certains hébergeurs n'aiment pas que des programmes .exe se trouvent sur leurs serveur.
Renomme ton exécutable en .zip

Ton update pourrait contenir une portion de code comme celui-çi.

Code : Tout sélectionner

InitNetwork() And ReceiveHTTPFile("http://tonsite.fr/mamiseajour.zip", GetTemporaryDirectory()+"mamiseajour.exe")
  
  RunProgram(GetTemporaryDirectory()+"mamiseajour.exe")
  
Else
  ;Ton code d'erreur ..... ou pas 
EndIf

mamiseajour.exe contiendrait le code relatif à la mise à jour de chacun des dossiers de ton jeu.

Code : Tout sélectionner

RIf InitNetwork()
  ReceiveHTTPFile("http://tonsite.fr/quete1.txt",  GetCurrentDirectory()+"quete1.txt")
  ReceiveHTTPFile("http://tonsite.fr/quete2.txt",  GetCurrentDirectory()+"quete2.txt")
  ReceiveHTTPFile("http://tonsite.fr/pack.dat",  GetCurrentDirectory()+"data\pack.dat")  
EndIf
ah oui, pas mal du tout !
ça me plait bien dis donc comme technique :)

merci énormément, ça va m'être super utile tout cela ! :D
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: AutoUpdate

Message par Ar-S »

Pense à virer le(s) fichier(s) temp après utilisation.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: AutoUpdate

Message par Le Soldat Inconnu »

Ma méthode est assez complexe également.
Elle passe par une page PHP de mon site.
On renseigne dans le lien le nom du programme et sa version, et la page retourne, toujours dans le lien, OK si le prog est à jour ou NOK sinon.
La page est la pour exemple :
http://www.lsi-dev.com/index.php?mod=ch ... a/2.0%20b1
je l'ouvre avec un webgadget
et cela se transforme en
http://www.lsi-dev.com/index.php?mod=ch ... a/2.0%20b1
donc si result=OK dans le lien, le programme est à jour.
Cela nécessite du codage en PHP par contre, avec une base de donnée qui connait la version de chaque logiciel.

Après, faut télécharger manuellement.

Si ça peut donner des idées
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre