Italian community of Lazarus and Free Pascal

Programmazione => Lazarus e il web => Topic aperto da: antoniog - Marzo 25, 2021, 11:50:21 pm

Titolo: [RISOLTO] Verificare aggiornamento programma
Inserito da: antoniog - Marzo 25, 2021, 11:50:21 pm
Buonasera,
ho in archivio due programmi gestionali da me scritti con Lazarus, aggiornato alla ver. 2.0.6, vorrei verificare all'avvio dei programmi se ci sono degli aggiornamenti nel mio sito web, quindi con collegamento al mio sito ed analisi delle cartelle e dei file di download ed eventuale segnalazione all'utente, ma non so da dove cominciare, qualcuno può aiutarmi?
Titolo: Re:Verificare aggiornamento programma
Inserito da: schumi - Marzo 26, 2021, 08:34:47 am
il sistema più semplice è creare un eseguibile stile "launcher" che come prima cosa controlla dal sito l'ultima versione,
se non ci sono aggiornamenti lancia l'eseguibile principale del gestionale, se invece trova un aggiornamento lo scarica e applica (da valutare se con una richiesta dell'utente).
Ci sono varie strade su come scaricare un pacchetto di aggiornamento, FTP, HTTP, drive, ecc ognuno valido.

ciao
Titolo: Re:Verificare aggiornamento programma
Inserito da: bonmario - Marzo 26, 2021, 10:25:03 am
Oltre a quanto scritto da "schumi", potresti anche valutare il fatto di far uscire un messaggio all'utente con cui gli dici che c'è un nuovo aggiornamento, poi decide lui quando caricarlo.

Io anni fa', avevo fatto una cosa simile:
- sul mio sito, nella directory "download" c'era uno zip per ogni mio programma
- nel mio programma avevo messo un bottone "verifica aggiornamenti"
- cliccandoci sopra, mi collegavo al mio sito e reperivo la data di ultima modifica dello zip
- se tale data era superiore rispetto a quella del .exe del io programma, gli segnalavo che c'era un aggiornamento disponibile.

Se invece vuoi fare qualcosa di più fine e che però ti comporta anche più manutenzione, potresti fare così:
- sul tuo sito metti un file txt in cui, in ogni riga scrivi: nome eseguibile, ultima versione, elenco modifiche
- dal tuo eseguibile scarichi questo file, e reperisci le info dell'eseguibile. Se la versione attuale è inferiore rispetto a quella letta dal file di testo, procedi con l'aggiornamento e/o la segnalazione all'utente

Ciao, Mario
Titolo: Re:Verificare aggiornamento programma
Inserito da: antoniog - Marzo 27, 2021, 01:43:08 pm
Grazie per le risposte ma prima dovrei scrivere qualcosa che mi consenta di collegarmi al mio sito, quindi quale pacchetto installare e vedere qualche esempio. Ho provato ad utilizzare le istruzioni di Maverich che sono del dicembre 2011, Indy gestiore server FTP lato Client (http://www.lazaruspascal.it/index.php?page=70)
 ma mi vengono segnalati molti errori
Titolo: Re:Verificare aggiornamento programma
Inserito da: DragoRosso - Marzo 27, 2021, 02:28:09 pm
Ti posto un pezzo di codice da cui partire, l'ho buttato giu senza neanche testarlo quindi và rifinito (gestione degli errori, .....)

Spero ti sia di aiuto.

Codice: [Seleziona]

procedure Download_FTP(NomeFile: string, NomeHost, NomeUtente, PassworUtente: string);
var
  tempStream: TFileStream;
  IdFTP: TIdFtp;
begin
  try
tempStream:= TFileStream.create(NomeFile, fmCreate)
IdFTP := TIdFtp.create(self);
    with IdFTP do begin
      Host:= NomeHost;
      Username:= NomeUtente;
      Password:= PassworUtente;
    end
    IdFtp.Connect(true, 1500)
    IdFtp.Passive:= true;
    IdFtp.ChangeDir('/Ripositorio');       //Qui devi indicare la direcotry remota da cui scaricare il file
    IdFtp.Get(NomeFile, tempStream, false);
    //Se vuoi vedere quanto hai scaricato: ShowMessage(IdFtp.size(NomeFile).toString));
  finally
    tempStream.Free;
    IdFtp.Quit;
    IdFtp.Free;
  end; 
end;


Saluti
Titolo: Re:Verificare aggiornamento programma
Inserito da: DragoRosso - Marzo 27, 2021, 02:37:48 pm
Quella è un piccola procedura per scaricare (download) di un file tramite FTP.

Se vuoi fare un client completo (me non ne vedo la necessità per la tua applicazione) la cosa è più complessa. Giusto per capire la funzionalità di un client ftp prova a scaricarti FileZilla https://filezilla-project.org/ (https://filezilla-project.org/).

Ciao
 
Titolo: Re:Verificare aggiornamento programma
Inserito da: antoniog - Marzo 27, 2021, 03:14:56 pm

Ciao DragoRosso, grazie per la dritta, proverò e faro sapere. Mi serve anche verificare nella directory /miosito/download l'eventuale presenza di una versione (nome file) aggiornata.
FileZilla lo uso da sempre per caricare file sui vari siti web da me realizzati, è ottimo ma in questo caso non mi serve.

Titolo: Re:Verificare aggiornamento programma
Inserito da: DragoRosso - Marzo 27, 2021, 03:55:34 pm
Dopo il "connect" e il "ChangeDir" puoi usare la funzione List per caricare in una lista di stringhe il contenuto della directory.
La dichiarazione var è da aggiungere ovviamente nella sezione apposita della procedura.

In Elenco dovresti avere un lista di stringhe che corrispondono al contenuto della tua direcotry remota.

Codice: [Seleziona]

var Elenco: TStringList;
begin
  Elenco := TSringList.Create;
  IdFTP.List(Elenco, '', false);
 // ..... fai qualcosa
 Elenco.Free;
end;

Titolo: Re:Verificare aggiornamento programma
Inserito da: antoniog - Marzo 28, 2021, 06:54:12 pm
DragoRosso, grazie per i tuoi suggerimenti che mi sono stati molto utili.
Prendendo spunti da varie parti h
o scritto una procedura che all'attivazione della form verifica se ci sono aggiornamenti, . La procedura funziona anche se al momento verifica l'esistenza di un file e chiede se si vuole scaricarlo.  La verifica corretta dovrebbe essere sulle date di compilazione fra il programma in uso e il file da scaricare, se la data di compilazione del file da scaricare è successiva a quella del programma in uso verrà avanzata la richiesta di download. Posto il programma
Codice: [Seleziona]
unit Unit1;


{$mode objfpc}{$H+}


interface


uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
  Buttons, ExtCtrls, CodyCtrls, IdTCPClient, IdFTP, IdFTPCommon;


type


  { TForm1 }


  TForm1 = class(TForm)
    IdFTP1: TIdFTP;
    IdTCPClient1: TIdTCPClient;
    LbDirectory: TListBox;
    SaveFile: TSaveDialog;
    procedure ConnettiServerFTP;
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure Download_FTP(NomeFile: string);
    procedure ListafileFTP;
  private


  public


  end;


var
  Form1: TForm1;
  mDir: string = '/public_html/gescomp/download/' ;
  sRootDirFTP : string;
implementation


{$R *.lfm}
procedure TForm1.ConnettiServerFTP;
var sMesg: string;
    bEsito: Boolean;
    FLastDirStack : TStringList;
    tempStream: TFileStream;
    IdFTP: TIdFtp;
begin
   sMesg := 'L''aggiornamento non è andato a buon fine, riprova più tardi..';


   //Test Client su Server
   bEsito := False;


   idTCPClient1.Host := 'ftp.xxxxxxxx.xx';
   idTCPClient1.Port := 21; //porta per comuicare con il server FTP
   //un test per verificare se il servizio Host risponde
   try
   idTCPClient1.Connect;


     try
       IdTCPClient1.IOHandler.WriteLn('Client message');
       //Self.Caption := IdTCPClient1.IOHandler.ReadLn;
     finally
       IdTCPClient1.Disconnect;
       bEsito := True;
     end;


   except
     ShowMessage(sMesg);
     IdTCPClient1.Disconnect;
   end;


  //se il server ha risposto possiamo procedere
  if bEsito  then
    begin


      IdFTP1.Host := 'ftp.xxxxxxxx.xx';
      IdFTP1.Port := 21;


      try
        //utilizzate il vostro account per accedere al server FTP
        IdFTP1.Username := 'xxxxxxxxxx';
        IdFTP1.Password := 'xxxxxxxxxx';


        //per utilizzare la modalita ftBinary dovete aggiungere
        //nelle uses la unit IdFTPCommon


        IdFTP1.TransferType := ftBinary;
        if IdFTP1.Connected then IdFTP1.Disconnect;
        IdFTP1.Connect;
         IdFtp1.Passive:= true;
         IdFtp1.ChangeDir(mDir);
        FLastDirStack := TStringList.Create;
        FLastDirStack.Clear;


        sRootDirFTP := IdFTP1.RetrieveCurrentDir; //memorizziamo la directory radice
        IdFTP1.List;
        //DisplayFTP;
        ListafileFTP;
      except
        ShowMessage(sMesg);
        IdFTP1.Disconnect;
      end;
    end;
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
  ConnettiServerFTP;
end;


procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  IdTCPClient1.Disconnect;
end;




procedure TForm1.ListafileFTP;
var i, c : Integer;
    s : String;
   Lista: TStringList;
begin
  Lista := TStringList.Create;
  IdFTP1.List(Lista ,'',false);
  //DMPcopia.ZDati.GetTableNames('', Lista);
  For c:= 0 to Lista.Count-1  do
    begin
      s := lista[c];
      i := IdFTP1.Size(s);
      if s='Aggiorna_Gescomp.exe' then
               if  MessageDlg('c''è un aggiornamento, vuoi scaricarlo?', mtConfirmation, mbYesNo, 0) = mrYes then
                  Download_FTP(s) else IdTCPClient1.Disconnect;
    end;
 Lista.Free;
end;


procedure TForm1.Download_FTP(NomeFile: string);
var i, iDimFile : Integer;
    ext, s : String;
    b : boolean;
begin
  Screen.Cursor := crHourGlass;
  i := lbDirectory.ItemIndex;
      s := nomefile;
      i := IdFTP1.Size(s);
       // File
          ext := ExtractFileExt(s);
          SaveFile.Filter := ext + ' files|*' + ext + '|All Files|*.*';
          SaveFile.FileName := s;
          if SaveFile.Execute then
            begin
              b := true;
              if FileExists(SaveFile.FileName) then
                if MessageDlg('File già presente : sovrascrivere ?', mtWarning, [mbYes,mbNo], 0) = mrYes then
                  DeleteFile(SaveFile.FileName);


                IdFTP1.TransferType := ftBinary;


              if b then
                IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported);
            end;
 Screen.Cursor := crDefault;
 IdTCPClient1.Disconnect;
end;




end.



Titolo: Re:Verificare aggiornamento programma
Inserito da: DragoRosso - Marzo 28, 2021, 07:02:29 pm
Sono contento di esserti stato utile.
Solo un ultimo consiglio, invece delle date di compilazione, su cui ci possono essere false interpretazioni (dipende dal file system, dal paese, etc...) ti consiglio di evidenziare il file presente sul server (Aggiorna_Gescomp.exe) con i dati di release per esempio:

Aggiorna_Gescomp_xx.exe

dove xx è un numero progressivo.

Così è più chiaro, e potrai mantenere anche diverse versioni sul server (ad esempio se devi fare degli aggiornamenti incrementali).

Saluti
Titolo: Re:Verificare aggiornamento programma
Inserito da: antoniog - Marzo 28, 2021, 07:38:09 pm
DragoRosso, grazie. Penserò come organizzarmi per le ver. incrementali.
Al momento ho riscritto la procedura sulla verifica della data di compilazione, sarà da sostituire la precedente procedura
Citazione
TForm1.ListafileFTP
con la seguente e a questo punto posso mettere [RISOLTO]
Codice: [Seleziona]
procedure ListafileFTP;
var i, c : Integer;
    s,f,o : String;
   Lista: TStringList;
   Sd, Sf : TDateTime;
   fa : Longint;
begin
  try
     {$IFDEF WINDOWS}
       fa:=FileAge(Application.Location+'Gescomp.exe');
        f:='Aggiorna_Gescomp.exe'
     {$ENDIF$}
      {$IFDEF LINUX}
       fa:=FileAge(Application.Location+'Gescomp');
        f:='Aggiorna_Gescomp.zip';
      {$ENDIF$}
     If Fa<>-1 then
        begin
          Sd:=FileDateTodateTime(fa);
          //showmessage('I''m from : '+DateTimeToStr(Sd));
        end;
  Lista := TStringList.Create;
  GescompF.IdFTP1.List(Lista ,'',false);
  For c:= 0 to Lista.Count-1  do
    begin
      s := lista[c];
      i := GescompF.IdFTP1.Size(s);
      Sf:= GescompF.IdFTP1.FileDate(s);
      if s=f then
         begin
           //showmessage('data su pc : '+DateTimeToStr(Sd)+' data sul sito : '+DateTimeToStr(Sf));
           if (Sd<Sf) then
               if  MessageDlg('c''è un aggiornamento, vuoi scaricarlo?', mtConfirmation, mbYesNo, 0) = mrYes then
                  Download_FTP(s) else GescompF.IdTCPClient1.Disconnect;
           exit;
         end;
    end;
  finally
     Lista.Free;
     GescompF.IdTCPClient1.Disconnect;
  end;



end;