Jump to content
Fivewin Brasil

atualizar executavel


edutraini

Recommended Posts

Oi, Kleyber.

Ainda não faço backup em FTP. O exemplo acima, conforme você pode notar, só serve para rede local com pasta compartilhada.

Mas tenho um programinha que faz leitura em FTP periodicamente, só que com outra finalidade.

A função abaixo mostra um exemplo de como ele funciona.

*------------------------------------------------------------------------------*
STATIC FUNCTION ChecaEntTxt()
   LOCAL cFldEn := ALLTRIM(GetPvProfString( "ENTIRE_CFG", "PastaEntrada", " ", cAppPath+"\SISCOM.INI"))
   LOCAL c_Ftp := GetPvProfString( "CONNECTION", "eFtp", " ", ".\siscomon.ini")
   LOCAL c_Usr := GetPvProfString( "CONNECTION", "eLog", " ", ".\siscomon.ini")
   LOCAL c_Psw := GetPvProfString( "CONNECTION", "ePsw", " ", ".\siscomon.ini")
   LOCAL c_Fld := GetPvProfString( "CONNECTION", "eDir", " ", ".\siscomon.ini")
   LOCAL cMsg := "", lNovo := .F.

   Count1 ++
   if Count1 < nWait1 ; RETURN NIL ; ENDIF // Só verificar se decorrido o tempo de espera definido em nWait1
   Count1 := 0   // Resetar o tempo decorrido
   nWait1 := 600 // Apos a primeira vez, verificar a cada 10*60 segundas (10 minutos)

*  ShowMsgTray("Verificando FTP", "Aguarde...")
   TRY
      oFTP := qFTPClient():New(c_Ftp, 21, {|cMessage| Logfile("logftp.txt",{cMessage})},,c_Usr, c_Psw)
      oFTP:lPassive := .T.
      if oFTP:Connect()
       if oFTP:Cd(c_Fld)
         if oFTP:Dir()
           a_Fls := {}
           FOR nLin := 1 TO LEN(oFTP:acDir)
               IF ".TXT" $ Alltrim(Substr(oFTP:acDir[nLin],40,256)) // Não pegar se não for txt (ex: index.php)
                  n_At := AT("ARPED_", oFTP:acDir[nLin])
                  AADD(a_Fls, Alltrim(Substr(oFTP:acDir[nLin],n_At,256)) )
               ENDIF
           NEXT
           IF LEN(a_Fls) > 0
              for nPd := 1 TO LEN(a_Fls)
                 c_Arq := a_Fls[nPd]
                 IF ! EMPTY(c_Arq)
                    IF ! FILE(cFldEn+"\"+c_Arq)
                       lRtr := oFTP:Retr(c_Arq, cFldEn+"\"+c_Arq) // c_Fld+"/"+
                       IF lRtr
                          lNovo := .T.
                          ShowMsgTray(c_Arq, "Novo pedido")
                       ELSE
                          ShowMsgTray(c_Arq+": Não recuperado", "Pedido externo")
                       ENDIF
                    ENDIF
                 ENDIF
              next
           ELSE
            * ShowMsgTray("Próxima verivicação em 10 minutos.", "Sem novos pedidos")
            * SysWait(3)
            * ShowMsgTray()
           ENDIF
           oFTP:Quit()
           oFTP:End()
         else
         * ShowMsgTray("Próxima verivicação em 10 minutos.", "Sem novos pedidos")
           oFTP:Quit()
           oFTP:End()
         * SysWait(3)
         * ShowMsgTray()
         endif
       else
         oFTP:Quit()
         oFTP:End()
       endif
      endif
   CATCH oErr
      ShowMsgTray(oErr:Description, "Erro de FTP")
   END TRY
   IF ! lNovo // Sem novos pedidos. Apenas avisar se existir algum não importado na pasta.
      cEntFld := ALLTRIM(GetPvProfString( "ENTIRE_CFG", "PastaEntrada", " ", cAppPath+"\SISCOM.INI"))
      IF lIsDir(cEntFld)
         aFiles := Array( ADir( cEntFld+"\SDZ*.TXT" ) )
         ADir   := ADir( cEntFld+"\SDZ*.TXT", aFiles )
         IF LEN(aFiles) > 0
            IF EMPTY(cMsg) ; cMsg += "Chegou pedido" ; ENDIF
            cMsg += " da SANDOZ"
         ENDIF
         aFiles := DIRECTORY(cEntFld+"\ARPED*.TXT")
         IF LEN(aFiles) > 0
            IF EMPTY(cMsg) ; cMsg += "Chegou pedido" ; ELSE ; cMsg += "e" ; ENDIF
            cMsg += " do SISCOMDroid"
         ENDIF
      ENDIF
      SysRefresh()
      IF ! EMPTY(cMsg)
         ShowMsgTray(cMsg, "Novo pedido")
      ENDIF
   ENDIF
RETURN NIL

Se te interessar, me avisa que posto is prgs por email.

Link to comment
Share on other sites

Obrigado Ariston... é que a dúvida do Marcelo Marca é como fazer essa verificação em um FTP dentro do EXE principal de tempos em tempos... tipo, como se houvesse um timer executando independentemente do que o sistema está fazendo. Eu só consegui fazer isso com um EXE rodando no tray, assim com um timer eu verifico de tempos em tempos se há atualizações no FTP.

Link to comment
Share on other sites

Kleyber daria pra fazer em Background, tipo aproveitar a sugestão do Ariston e fazer verificar em background se tem algo no FTP ou Tabela MySQL q seja mais atual e em caso positivo rodar a sugestão do Ariston...

Exemplo:

function Main()

    *-- Só executa a atualizacao se veio com parametro pra verificar e nao esta sendo visto isto ainda
    if Upper(pVez) == 'RotinaVerificacao' .and. Config->VendoAtu != 'S'
        VerificaAtualizacao() //
        quit
    endif    

   .... código

    *-- Pra BackGround caso sistema inativo
        #include "hbthread.ch"
        Public nTask, nIdle
        Public nTimeEspera := 900 // (tempo em segundos) 900 = 15 min
        Public nTempo := ( Seconds() + nTimeEspera )

        nTimeEspera := Config->TempoVerificaAtu                        
                
         nTask := HB_BackGroundAdd( {|| ChecaTempoCorrido() } )
         nIdle := HB_IdleAdd(       {|| HB_BackGroundRun( nTask ) } )
        *-- No final chama as rotinas pra desativar...

....

        *-- Pra desativar o BackGround
        HB_BackGroundDel( nTask ) // coloque antes de sair do sistema
        HB_IdleDel( nIdle )

return nil


//------------------------------------------------------------------------------
 * Função para controle de rotinas em BackGround
function ChecaTempoCorrido()
    local cTelaChkTime

    if ( NextKey() > 0 )
        nTempo := Seconds()
    
    elseIf Seconds() >= ( nTempo + nTimeEspera ) // se ficou ocioso pelo tempo determinado...
    
        HB_BackGroundDel( nTask ) // remove as acoes da Idle evitando recursividade
        HB_IdleDel( nIdle )
        
        *-- Só roda se nao foi feito verificacao no dia.
        if .not. lVeSeTemAtu
            MyRun( 'TeuEXE RotinaVerificacao', .F.) // Aki abre uma copia do teu EXE em background com um parametro X q é verificado no inicio do sistema
        endif
        
        nTempo := Seconds()                                     // atualiza nTempo
        nTask  := HB_BackGroundAdd( {|| ChecaTempoCorrido() } ) // reativa a idle
        nIdle  := HB_IdleAdd( {|| HB_BackGroundRun( nTask ) } )
    
    endif

return Nil

**********************************************************************************************************************
function VerificaAtualizacao()

    if Config->VendoAtu == 'S' // se Esta Verificando não continua
        return .f.
    endif


... Se for FTP

   ftpServer := 'teuservidorFTP.no-ip.org'  // caminho do FTP
   ftpUser   := 'usuario'          // usuario do FTP
   ftpPass   := 'senha'       // senha de acesso do FTP
   ftpPorta  := 21  
   cURL      := 'ftp://' + ftpuser +':'+ ftppass +'@'+ ftpserver

   *-- Atencao importante tipclient versoes __XHARBOUR__ < 1 e tipclientftp >1
   oURL  := TURL():New(cUrl)
   oCred := TIPCredentials()
   oFTP  := TIPClientFTP():New(oUrl,,.T.)

   oFTP:nConnTimeout := 20000
   oFTP:nDefaultPort := ftpPorta

   if .NOT. Inetestaconectada() //-> Verefica se tem acesso a internet
       Fim_Run()
       Return .F.
   endif
       
   *-- Marca q j  tem 1 terminal rodando 
   Config->VendoAtu := 'S'
   *---------------------------------------------------

... Rotina pra verificar se tem arquivo no FTP e se é mais atual
... Se sim baixa e entra na sugestão do Ariston comparando as versões e rodando o BAT
    
    

... Se for por MySQL

... Conecta no Banco, abre Tabela, verifica se tem registro de nova versão
... Caso tenha, pega informações, compara com as da versão q esta sendo executada
... Caso versao nova vai pra sugestão do Ariston rodando BAT.


*-- Marca como nao executando 
    Config->VendoAtu := 'N'

return .T.
Link to comment
Share on other sites

Sim dentro do proprio EXE.

Não tenho atualização automática geral, pois prefiro atualizar individualmente alguns clientes e deixar rodando e depois atualizar geral.

Eu uso a função acima (não para atualizações) mas para Backup, apenas troquei o nome das chamadas para Backup para Atualização, pois o principio é o mesmo no meu ponto de vista.

Não testei mas acredito q funcione.

Minha preocupação é a questão de dar um Kill na aplicação rodando, pois isso pode ser muito problemático e gostaria de saber do Ariston e demais colegas q assim o fazem como tratam isso, no sentido de q o usuário do sistema pode estar no meio de uma venda ou no meio de um cadastro ou entrada de notas e ai???

Link to comment
Share on other sites

Minha preocupação é a questão de dar um Kill na aplicação rodando, pois isso pode ser muito problemático e gostaria de saber do Ariston e demais colegas q assim o fazem como tratam isso, no sentido de q o usuário do sistema pode estar no meio de uma venda ou no meio de um cadastro ou entrada de notas e ai???

Exatamente!!!! Por isso a minha pergunta... e acho que é a mesma do Marcelo Marca também.

Link to comment
Share on other sites

Amigos, eu não tenho rotina de atualização automática via ftp. A atualização no servidor eu mesmo faço e somente com todos terminais fechados.

Apenas os terminais executam a rotina de atualização automática pegando os arquivos atualizados do servidor. Isto é feito na primeira execução após a atualização do servidor.

Em breve pretendo desenvolver uma rotina para atualização via ftp. Minha idéia é deixar um programinha rodando no tray que fará verificação periódica no ftp. Se detectar uma atualização ele vai baixar o instalador e apenas avisar. A atualização só será feita mediante confirmação. E se algum terminal ainda estiver com o sistem rodando, não vou deixar fazer a atualização.

Link to comment
Share on other sites

....Minha idéia é deixar um programinha rodando no tray que fará verificação periódica no ftp. Se detectar uma atualização ele vai baixar o instalador e apenas avisar. A atualização só será feita mediante confirmação. E se algum terminal ainda estiver com o sistem rodando, não vou deixar fazer a atualização.

Tem colegas q fazem atualização automática aki no fórum... todos são via Tray ou app externo?

Link to comment
Share on other sites

Olá pessoal,

Tem uma solução do BielSys que uso há algum tempo e funciona bem para atualização via FTP. Ele consulta as datas do executável de sua máquina e do executável do FTP, se o executável da sua máquina é inferior ao do executável do FTP, caso sejam identicas, compara o horário de criação de cada arquivo. Sendo necessário atualizar ele baixa o executável do FPT como temporário em sua máquina, sai do sistema, atualiza e retorna para o sistema. Vejam no link http:/bielsys.blogspot.com.br - no titulo "actualización automática de aplicaciones via FTP". Lá você vai encontrar os fontes também.

Até mais.

Oliveiros Junior

Link to comment
Share on other sites

  • 1 year later...

Simples,

O sistema em tray fica verificando de tempos em tempos se tem uma versão nova. Se houver, mostra uma tela informando ao usuário que existe uma nova versão e que precisa sair do sistema para poder proceder com a atualização. Se ele tentar atualizar sem sair do sistema, a atualização não acontece.

Link to comment
Share on other sites

 

Simples,

O sistema em tray fica verificando de tempos em tempos se tem uma versão nova. Se houver, mostra uma tela informando ao usuário que existe uma nova versão e que precisa sair do sistema para poder proceder com a atualização. Se ele tentar atualizar sem sair do sistema, a atualização não acontece.

@kleyber neste caso então o sistema no tray fica instalado em todas maquinas? ou apenas no servidor? Dá para compartilhar a rotina deste sistema no tray?

Link to comment
Share on other sites

Olá,

O melhor é usar HRB. A atualização é de apenas arquivos pequenos, os HRBs. A não ser quando tem alteração no EXE que vai conter apenas as funções de uso geral. Estou migrando meu sistema para usar esta modalidade. Não é preciso sair do executável para atualizar uma rotina qualquer. Só sair da rotina que conste do HRB. 

Link to comment
Share on other sites

  • 2 weeks later...

Luiz Fernando, não sei se você resolveu o problema da tela do prompt do DOS ficar na barra de acesso, mas vai a dica,

quando terminar a checagem chamar o programa usando call [programa.exe] e depois exit, o call executa o comando e continua o script

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...