Como fazer update online?

Programação C em geral

Moderadores: 51, guest2003

Como fazer update online?

Mensagempor joao » 12 Dez 2008 13:42

Então, lá vamos nós para mais uma ajuda dos universitários(Ou dos grandes mestres da arte de programação :) )

O que eu quero fazer é um sistema de updates no meu programa. Ou seja, ele tenta achar na web e faz um update dos arquivos.
A idéia é que quando ele veja que tem updates, ele faça os updates e avise ao usuário que precisa fazer o update.

O que eu tava pensando em fazer era baixar os arquivos novos numa pasta temporaria e setar um flag no prog. O mesmo então mostra uma mensagem para o usuário.
Caso o usuário opte por fazer o update, o sistema então reboota, mas no destructor ele verifica o flag. Se setado ele manda um rodar um programa a parte e dai fecha.

O programa a parte apenas faz um wait de alguns segundos(para ter certeza que o programa principal morreu), verifica a pasta temp e faz um move de tudo que está lá para os seus respectivos lugares e starta novamente o sistema e morre.

O que acharam desta opção para fazer um update automatico sem a necessidade do usuário fazer algo? Vocês recomendam outra idéia/solução? Eu estou aceitando sugestões! :)

Obrigado,
Joao
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 12 Dez 2008 13:48

update que reboota o sistema ?! voce trabalha na microsoft ? =D
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Jorge_Francisco » 12 Dez 2008 14:00

Quando diz "sistema", quer dizer o seu ou o SO Win? Não entendi muito bem, entendi que quer fazer um sistema de auto-upload, mas se o seu sistema verifica se tem arquivo novo para ser baixado para o PC, então seria Download neh?hehehe. Posso ajudar, mas diz o que quer exatamente,blz?

Abraço
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor joao » 12 Dez 2008 14:33

Ok,
vamos lá:

Sistema entenda como o meu projeto, que engloba um SW e um HW mas o SW roda sobre um SO que não será rebootado. Apenas o meu SW será atualizado.

A idéia é simples. Tem n usuários que tem o meu sistema rodando e os mesmos terão acesso a web. Assim que eu resolver um problema no meu SW, eu simplesmente boto a correção em um server e os n usuários poderão ter este fix também.

Pronto. A idéia é essa.

Minha visualização da solução:
Simplesmente jogo numa pasta os arquivos que fiz donwload e o meu programa principal chama um programa secundário que se encarrega em copiar os novos arquivos para os seus respectivos lugares e chama novamente o programa principal. De modo geral é apenas isso.

1 - Qual seria a solução que vocês imaginariam para a minha idéia?
2 - Sem ter que rebootar o programa eu só consigo imaginar a solução de bibliotecas dinamicas, na qual eu poderia atualizar elas, não seria? Mas caso eu mexa no programa principal, continuo tendo que resetar o SW.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 12 Dez 2008 14:44

Faria assim do modo que falou. O principal(main) abre o secundário encarregado de fazer Upload(seria download neh?) acessa uma lista de atualizações, compara com a lista que tem no PC do usuário, faz o download das DLL's ou lib's, mata(killer) o principal e executa-o de novo e suicida-se(hehehe).
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor joao » 12 Dez 2008 15:26

Valeu!

Só queria saber se a minha idéia de como fazer o download(Não upload! :) ) estava errada ou se existia algum outro método louco para se fazer...

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 12 Dez 2008 16:48

por isso eh interessante fazer cliente servidor, mesmo no aspecto interno.

se vc imaginar apenas um front-end e uma serie de modulos internos, os updates podem ocorrer a medida que novas instancias dos modulos sao alocadas.

para um caso ideal, vc precisa duas coisas:

a) quebrar o aplicativo em varias partes
b) usar um mecanismo interprocesso state-less

a primeira situacao eh obvia. partes do aplicativo nunca precisam ser atualizados e partes precisam. quebrar em pedacos menores facilita quebrar a dependencia, quer dizer, o usuario nao precisa fechar tudo e reiniciar para fazer um update.

a segunda situacao eh como as partes trabalham. um exemplo que eu acho bacana eh o nfs: ele nao tem estado armazenado no servidor, entao cada pequena transferencia pode ser independente. se vc restartar o servidor nfs, os clientes aguarda ele voltar e continuam do ponto que pararam.

nada eh perdido. um caminho similar seria tratar cada modulo como um plug-in: vc carrega o plug-in quando vai usar. se o usuario jah esta usando uma instancia, vc simplesmente aguarda ele liberar. novas instancias jah pegam a versao nova. algo assim...
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 12 Dez 2008 17:23

Mas é que o meu programa não é nada gigante. :)
Na verdade até que ele vai se tornar grande, algo em torno de 3MB no produto final, eu acho.

Mas ainda assim acho mais fácil mandar 3MB e atualizar td do que criar modulos.

Mas me diz ai..

Em C++ como eu faria os modulos, no código? Pois no meu caso eu to criando vários arquivos, ou seja, posso dizer que o programa está bem estruturado, já que o meu poderá usar N databases e 3 diferentes SOs(Mac, Linux e Windows). mas no final eu gero um arquivo com todos os .o que eu gerei.

Eu teria que usar, bibliotecas dinamicas não é? Como eu gero isso em gcc?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 13 Dez 2008 00:37

pow, 3MB deve ser grande! o sistema embarcado que eu trabalhei ano passado tinha uns 34MB de codigo fonte para gerar um binario de 500KB! eh codigo que nao acaba mais! hehehe :)

bom, sobre carga dinamica de modulos, vc linka um .so (shared object) com -shared. a carga e manipulacao eh feita com as funcoes: dladdr, dlclose, dlerror, dlopen, dlsym e dlvsym... a descricao e exemplos vc encontra na man page do dlopen em qq unix.

assim, o modulo principal pode ir carregando e descarregando sob demanda, da na hora de fazer um update, vc baixa, descarrega e carrega o modulo sem restartar a aplicacao inteira hehehe :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x