Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2006
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Question Actualizar mi programa por red

Hola a tod@s, he desarrollado una aplicación en delphi 7 con MySql 3.23 componentes Zeos, el programa funciona muy bien, pero, se me plantea una duda.

Lo he instalado en muchos equipos de mi empresa, y como todo programa nuevo le voy encontrando "fallos" que voy depurando, el problema que se me plantea es que cada vez que realizo varias mejoras en el programa y aumento su versión tengo que ir ordenador por ordeador volviendo a copiar mi ejecutable, molestando asi al usuario que hace uso de ese ordenador.

Entonces he pensado que como mi programa esta en el servidor, podria hacer que mi programa mirase si he echo alguna mejora en el ejecutable que hay en el servidor y si es así que se actualizase, es decir copiaria el exe del servidor a la maquina que desea actualizarse.

Para eso he pensado mirar la version del programa instalado en el servidor,y actualizarlo si es diferente a la que tiene el usuario.

¿Cómo puedo mirar la versión del Ejecutable que hay en el servidor?

Si alguien me puede echar una mano le estaría muy agradecido, por que es una faena muy costosa la de ir instalando ordenador por ordenador para cambiar un par de cosillas.

Gracias y un saludo.
__________________
Y ahora puedes aprender truquillos de windows en http://nbull.clubdelphi.com.
Responder Con Cita
  #2  
Antiguo 09-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Aquí tienes un truco que te devolverá la versión de un ejecutable... no sé si podrías adaptarlo a tus necesidades.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 09-06-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hace no mucho habíamos platicado al respecto pero desafortunadamente ese hilo se perdió.

Sin embargo, no tienes qué averiguar la versión del ejecutable en el servidor, simplemente "escribe" ésta en un archivo de texto. Tu aplicación baja ese archivo y compara la versión ahí escrita con la versión del ejecutable en el cliente (para lo cual te sirve el truco que menciona dec). En ese hilo perdido habíamos comentado la posibilidad de guardar no la versión sino el md5 del archivo ejecutable y compararlo on el md5 del ejecutable en el cliente: si difieren se baja la versión del servidor. Si no mal recuerdo, seoane había incluso hecho un prototipo de actualizador. Quizá aún lo tenga.

// Saludos
Responder Con Cita
  #4  
Antiguo 09-06-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Roman no solo tengo el programa, ademas lo tengo funcionando a pleno rendimiento en un par de ordenadores y va de maravilla. Los usuarios ni lo han notado, no lo tomemos por donde no es , si recordais el "hilo perdido" mi objetivo era poder actualizar de forma que el usuario no se enterara, que fuera un proceso transparente para el, y parece que lo consegui.

La unica pega es que es bastante dificil de configurar, se configura por medio de un fichero de texto, y no hice ninguna utilidad para crearlo asi que toca hacerlo con el bloc de notas

Bueno, recordemos el esqueleto de la criatura:

Código:
Paso 1: El programa descarga un fichero de texto con los comandos y hash md5
Paso 2: Ejecuta los comandos y comprueba los md5 de los ficheros
Paso 3: Si un md5 no coincide baja el archivo actualizado 
Paso 4: Comprueba el md5 del archivo bajado
Paso 5: Intenta sustituir el archivo viejo por el nuevo
Paso 6: Si no lo consigue, lo retrasa hasta el proximo reinicio del equipo (No hay prisa)
Paso 7: Esperar (15 minutos o lo que se programe)
Paso 8: Vuelve al Paso 1
Los comando de los que hablo son uno que permite cerrar el programa y otro que cambia el tiempo de espera. La razon de retrasar la actualizacion hasta el siguiente reinicio en vez de realizar una espera activa o forzar el cierre del programa es porque se intenta que el proceso estorbe lo menos posible al usuario, que el programa se actualice ahora o al dia siguiente al encender el equipo no importa demasiado en mi caso.

Ahora vamos a como se instala. Sencillo, guardalo en la misma carpeta que tu aplicacion y ejecutalo cuando creas oportuno, al iniciar windows, al iniciar tu programa, etc. Del lado del servidor, necesitaras un servidor web o ftp donde alojaras los archivos nuevos y el archivo de comandos.

Bien el programa tiene un archivo .ini en el se debe colocar la url completa del archivo de comandos, puede contener mas de una direccion cada una en una linea. En cuanto al archivo de comandos tiene la siguiente estructura:

Código:
#{A4EB244D-84F2-4F73-A5BD-F88BE805CB5E}

$AppPath\Programa.exe;http://servidor.com/Programa.exe;4CB70FB78F1254EFC2ADF2AA1042289D
$AppPath\Documento.doc;http://servcidor.com/Documento.doc;0DF57ED8F158F55AE6F6A368169C7D23
La primera linea es una firma, debe colocarse tal cual en la primera linea para que el programa procese el resto de lineas. En cuanto a cada linea se compone de la ruta local del archivo, la url del archivo actualizado y el md5 del archivo actualizado.

Bueno, creo que ya llego de explicion por ahora. Aqui te dejo un zip con el codigo del programa, un archivo de configuracion de ejemplo y un programa para generar los md5.

Es tarde y puede que mi explicacion no este muy clara, ademas el codigo va sin comentarios una FEA costumbre que tengo. Pero aui estoy para explicar cualquier duda que tengas sobre el o sobre algunas de las funciones que utilizo.

Saludos
Archivos Adjuntos
Tipo de Archivo: zip agent.zip (10,0 KB, 341 visitas)

Última edición por seoane fecha: 09-06-2006 a las 02:49:37.
Responder Con Cita
  #5  
Antiguo 09-06-2006
Yosuun Yosuun is offline
Miembro
 
Registrado: jun 2004
Ubicación: Bilbao-Bizkaia
Posts: 28
Poder: 0
Yosuun Va por buen camino
Hola, yo estoy en tu misma situacion, y la solucion que le e dado es que el usuario no ejecuta directamente el programa sino por llamarlo de alguna forma un intermediario que compara el programa del ordenador cliente con el que esta en un direcctorio del servidor y si no coinciden copia el nuevo sobre el viejo y lanza el programa. Espero que te sirva de ayuda la idea.

Un Saludo.
Responder Con Cita
  #6  
Antiguo 09-06-2006
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Hola a todos, y muchisimas gracias por responderme, he solucionado el problema con el truco que me has pasado Dec, lo que he hecho a sido:

1º) Miro la versión del archivo del servidor
2º) Miro la versión del archivo que hay en el pc del usuario
3º) Las comparo y si son diferentes copio el archivo del servidor al pc del usuario.

Este se da cuenta de que se ha actualizado el programa por que se lo digo, pero, al contario que seoane no me importa que se entere, ademas le cierro el programa y tiene que volverlo abrir.
Ahora sí, actualizado sin que me tenga que pasear ordenador por ordenador pidiendo permiso al usuario para actualizarle el programa.

La pregunta que me surge ahora es si hay alguna manera de cerrar el programa y que se vuelva abrir el solo ya actualizado sin que el usuario haga nada.

Seoane disculpame pero mi nivel en programacion deja bastante que desear y no he entendido nada, dado que no se lo que son los md5 no se si te apetecera, pero seria interesante que explicaras más sobre el tema(Por lo menos a mi me interesa).
Si no tienes tiempo o no te apetece(Completamente comprensible)podrias decirme donde puedo encontrar algun tutorial que hable del md5 y las api´s que has utilizado y sus aplicaciones para el tema de actualizar los programas.

Muchas gracias a todos y un abrazo que disfruteis del finde semana.
__________________
Y ahora puedes aprender truquillos de windows en http://nbull.clubdelphi.com.

Última edición por Nbull fecha: 09-06-2006 a las 17:48:22.
Responder Con Cita
  #7  
Antiguo 09-06-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo del md5 no tiene ciencia. Es sólo un algoritmo que asocia a cada archivo (de hecho a una secuencia de bytes) una cadena de caracteres. Las probabilidades de que dos archivos distintos tengan el mismo md5 son ínfimas y por ello es bastante confiable para comparar dos versiones de un archivo.

Una razón que vimos en ese entonces para usar el md5 en lugar la versión interna del ejecutable es que de esta forma puedes usar el mismo método para actualizar otro tipo de archivos que requiera tu aplicación: un archivo de ayuda, un documento de word, una base de datos, etc.

El cómo obtienes el md5 no es algo que deba preocuparte. En lo que manda el compañero seoane ya se incluyen rutinas para calcularlo. Vamos, que no tienes tú que implementar el algoritmo.

Ahora, lo de reiniciar tu aplicación una vez actualizada toma en cuenta que un programa no puede inicarse el sólo, siempre es algo más quien lo inicia. Por eso es importante que releas el mensaje de Yosuun en este mismo hilo.

// Saludos
Responder Con Cita
  #8  
Antiguo 09-06-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
... dado que no se lo que son los md5 ...
Segun la wikipedia http://es.wikipedia.org/wiki/MD5
Cita:
En criptografía, MD5 (acrónimo de Message-Digest Algorithm 5, Algoritmo de Resumen del Mensaje 5) es un algoritmo de reducción criptográfico de 128 bits ampliamente usado
Y segun yo es un algoritmo que a partir de un monton de bytes obtiene una cadena de 32 caracteres, y si cambias un solo bit y vuelves a calcularlo la cadena de caracteres resultante es diferente.

Asi que podemos usarlo para comparar dos archivos, asi como para comprobar su integridad. Puede que hayas visto alguna vez en algun ftp que ademas del archivo a descargar se puede encontrar otro archivo de texto con su md5, esto se utiliza para que una vez descargado calcular su md5 y comprobar que se ha descargado bien.

Pues yo lo que hago es lo mismo, coloco un archivo de texto con los md5 de los archivos actualizados y los comparo con el md5 de los que tengo en el ordenador, si no coinciden es que los archivos no son iguales y debemos actualizar. Te preguntaras porque no bajamos el archivo entero y comparamos los dos byte a byte, un proceso sin duda mas preciso, pues la razon es simple imaginate que tenemos un archivo de 2 megas en un servidor en internet, si cada vez que tenemos que hacer la comprobacion lo tenemos que descargar entero seria generar un trafico en la red inutil. Ademas ¿como comprobariamos que el archivo descargado llego correctamente?

Cita:
... algun tutorial que hable del md5 y las api´s que has utilizado ...
Las api que utilizo las puedes ver descritas aqui en la propia web de microsoft. Incluso creo que viene algun ejemplo.

De todas formas, creo que para lo que quieres hacer tu mi programa seria como matar moscas a cañonazos , por lo que entiendo, en tu caso hablamos de una red local en la que tienes compartidos los archivos (corrigeme si me equivoco) dada la velocidad de una red local tampoco te cuesta mucho comprobar los archivos bytes a byte en vez de su md5, y ademas veo que cuentas con la colaboracion de tus usuarios para realizar la actualizacion.

La verdad es que volvi a publicar el programa porque el hilo que se perdio hablamos bastante del tema y, al menos para mi, resulto bastante interesante y queria compartir el resultado.

Cita:
.. La pregunta que me surge ahora es si hay alguna manera de cerrar el programa y que se vuelva abrir el solo ya actualizado sin que el usuario haga nada ...
En aquel hilo se hablo de esto y creo que se llego a soluciones bastante imaginativas, haber si alguien recuerda alguna y la coloca aqui, en concreto creo recordar una de Roman en la que pedia al usuario que cerrara el programa hacia una espera hasta que comprobaba que lo habia cerrado y luego hacia la actualizacion.

Me despido, y si necesitas mas explicaciones tu pregunta que ya ves que el tema me interesa bastante
Responder Con Cita
  #9  
Antiguo 13-10-2006
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Hola a todos!!!

tengo el siguiente problema, quiero checar las versiones del programa que estoy haciendo, ya tengo la funcion para verificar las versiones de los archivos (estos archivos estan en diferentes computadores) que es la siguiente:

Código Delphi [-]
function Tform1.VersionExe(const ruta: string) : string;
var
  Pt, Pt2: Pointer;
  Size, Size2: DWord;
begin
  Result := '';
  if not FileExists(ruta) then Exit;
  Size := GetFileVersionInfoSize(PChar(ruta), Size2);
  if (Size > 0) then begin
    GetMem(Pt, Size);
    try
      GetFileVersionInfo(PChar(ruta), 0, Size, Pt);
      VerQueryValue (Pt, '\', Pt2, Size2);
      with TVSFixedFileInfo (Pt2^) do begin
        Result :=
        IntToStr(HiWord(dwFileVersionMS))+'.'+
        IntToStr(LoWord(dwFileVersionMS))+'.'+
        IntToStr(HiWord(dwFileVersionLS))+'.'+
        IntToStr(LoWord(dwFileVersionLS));
      end;
    finally
      FreeMem(Pt);
    end;
  end;
end;

pero el problema es que siempre el Size 2 me da cero y por consiguiente nunca entra en los siguientes renglones y no me da nada en la version.

Alguien sabe porque???

Tengo otra funcion que sirve para lo mismo, pero solamente me compara los archivos locales, la funcion es la siguiente

Código Delphi [-]
GetVersion: string;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(ruta), Dummy);
  if VerInfoSize = 0 then Exit;
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do
  begin
    Result := IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;

la verdad es que le busque y busque y no le encuentro.

Ya le hice cambios a la segunda, pero no se puede, me marcan errores.

Si alguien sabe en donde puedo encontrar la solución, se los agradeceria.

Gracias!!!!
Saludos!!!
Responder Con Cita
  #10  
Antiguo 13-10-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Este Seoane cada vez me sorprende más. ¿Hay algo para lo que no tenga respuesta y solución?

Perdón por el SPAM pero no conozco otra forma de marcar el hilo en la lista de suscripciones, y este es de los que no hay que perder de vista.
Responder Con Cita
  #11  
Antiguo 10-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
acabo de subir el truco 401, que calcula el MD5 dado el nombre de un archivo.

Acabo de ver que se trata del mismo algoritmo usado por seoane, pero no tenía firma... Bueno, se queda en los trucos ya.

Espero sea de ayuda.

Ñuño: arriba del hilo, en el menú Herramientas, tienes la opción de suscribirte y quitar la suscripción.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 10-05-2007 a las 12:17:09.
Responder Con Cita
  #12  
Antiguo 10-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Lepe
acabo de subir el truco 401, que calcula el MD5 dado el nombre de un archivo.
¿De donde lo sacaste Lepe?
Responder Con Cita
  #13  
Antiguo 10-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Lepe
Acabo de ver que se trata del mismo algoritmo usado por seoane, pero no tenía firma... Bueno, se queda en los trucos ya.
Yo me dí cuenta porque es el mismo código que puse hace tiempo en un hilo, y en el que con las prisas incluí la función SHGetFolderPath que ahí no pintaba nada, pero al copiar y pegar se me paso. Solo lo preguntaba por si encontraras el código fuera del clubdelphi, era curiosidad
Responder Con Cita
  #14  
Antiguo 10-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No sé que decirte, lo ví, lo guardé y hasta hoy no lo he usado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 10-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Lepe
No sé que decirte, lo ví, lo guardé y hasta hoy no lo he usado.
No importa, ya dije que era solo por curiosidad. Espero que no te molestara la pregunta

De todas formas, añadí al truco que pusiste, como comentario, la unit que utilizo ahora que creo esta un poco mas completa. Con unas pocas modificaciones se podría incluir sha1 además md5, si a alguien le interesa que lo diga
Responder Con Cita
  #16  
Antiguo 10-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
¿molestarme? ¿por qué?.

Pero eso que te sirva de lección y a todo Unit que tires fuera del pc, pues un Unit header al estilo de Neftali, que quede clarita la cosa desde un principio

Saludos y gracias por la unidad.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 11-05-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Gracias Lepe. Como dicen en mi pueblo: "Más vale tarde que nunca"
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #18  
Antiguo 31-07-2007
Avatar de raorre
raorre raorre is offline
Miembro
 
Registrado: dic 2005
Ubicación: valencia
Posts: 51
Poder: 19
raorre Va por buen camino
Ayuda por favor

Estoy intentando acceder al fichero agent.zip pero no hay manera, este foro esta modificado desde hace tiempo no se si me contestaran pero me podrian enviar el fichero, gracias de todos modos.
Responder Con Cita
  #19  
Antiguo 31-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por raorre
Estoy intentando acceder al fichero agent.zip pero no hay manera, este foro esta modificado desde hace tiempo no se si me contestaran pero me podrian enviar el fichero, gracias de todos modos.
El archivo existe, pero, se ve que no tienes los permisos suficientes para acceder al mismo. Puesto que se están haciendo ahora pruebas sobre todo esto, haciendo una excepción puedo enviarte yo mismo el archivo. Indica una dirección de correo electrónico a la que poder hacerlo, por favor.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #20  
Antiguo 31-07-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Cita:
Perdón por el SPAM pero no conozco otra forma de marcar el hilo en la lista de suscripciones, y este es de los que no hay que perder de vista.
Yo te perdono porque voy a hacer lo mismo
Este hilo se me había pasado hasta ahora...

Gracias Seoane...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar programa turminator Internet 1 15-05-2006 01:49:34
Actualizar los puestos de un programa instalado en el servidor VRO Conexión con bases de datos 3 19-07-2005 20:53:16
Ejecutar un programa externo desde un programa de Delphi Roger_Fernandez Varios 3 02-09-2004 18:05:36
Ejecutar un programa DENTRO de otro programa seduerey Varios 8 12-11-2003 13:56:20
actualizar mi programa nicocer SQL 1 27-10-2003 12:16:47


La franja horaria es GMT +2. Ahora son las 05:47:30.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi