kleyber Posted December 5, 2015 Report Share Posted December 5, 2015 Ariston, Como você faz para que o sistema periodicamente verifique o FTP pra ver se tem atualizações? Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted December 5, 2015 Report Share Posted December 5, 2015 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. Quote Link to comment Share on other sites More sharing options...
kleyber Posted December 6, 2015 Report Share Posted December 6, 2015 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. Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted December 6, 2015 Report Share Posted December 6, 2015 Ah, tá. Eu não tinha percebido que ele estava querendo para ftp. Quote Link to comment Share on other sites More sharing options...
fladimir Posted December 6, 2015 Report Share Posted December 6, 2015 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. Quote Link to comment Share on other sites More sharing options...
kleyber Posted December 6, 2015 Report Share Posted December 6, 2015 Sim, em background eu sei que dá pra fazer... mas dentro do próprio EXE do sistema? Quote Link to comment Share on other sites More sharing options...
fladimir Posted December 6, 2015 Report Share Posted December 6, 2015 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??? Quote Link to comment Share on other sites More sharing options...
kleyber Posted December 6, 2015 Report Share Posted December 6, 2015 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. Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted December 6, 2015 Report Share Posted December 6, 2015 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. Quote Link to comment Share on other sites More sharing options...
fladimir Posted December 7, 2015 Report Share Posted December 7, 2015 ....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? Quote Link to comment Share on other sites More sharing options...
kleyber Posted December 7, 2015 Report Share Posted December 7, 2015 Fladimir, A que eu fiz foi via app externa em tray. Quote Link to comment Share on other sites More sharing options...
Marca Posted December 7, 2015 Report Share Posted December 7, 2015 Bom dia a todos No meu caso eu gostaria de fazer a partir do próprio .exe Quote Link to comment Share on other sites More sharing options...
oliveiros Posted December 8, 2015 Report Share Posted December 8, 2015 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 Quote Link to comment Share on other sites More sharing options...
fladimir Posted July 12, 2017 Report Share Posted July 12, 2017 Fladimir, A que eu fiz foi via app externa em tray. No caso Kleyber, mesmo sendo via app externa em tray, como faz com o povo q tá usando o sistema e não fecha? Quote Link to comment Share on other sites More sharing options...
kleyber Posted July 13, 2017 Report Share Posted July 13, 2017 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. Quote Link to comment Share on other sites More sharing options...
Theotokos Posted July 13, 2017 Report Share Posted July 13, 2017 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? Quote Link to comment Share on other sites More sharing options...
evandro Posted July 14, 2017 Report Share Posted July 14, 2017 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. Quote Link to comment Share on other sites More sharing options...
cendon Posted July 25, 2017 Report Share Posted July 25, 2017 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.