Hola amigos blogueros, el post de hoy se basa en un problema que tuve el día de ayer, bueno más que problema fue una necesidad, para poder explicar que necesidad tuve les menciono algunos antecedentes.
En la empresa donde laboro tenemos un sistema desarrollado en java y antes que yo entrara a la compañía el proceso de actualización del "ejecutable" que es un .jar se lo realizaba de forma manual.
El 90% de los equipos de los usuarios eran Linux por lo que heredé unos scripts del administrador anterior, que si bien es cierto ayudaba en la gestión de actualizar el .jar pero que no era del todo independiente del administrador; en este caso de mí.
De aquel tiempo para acá la situación ha cambiado y ahora tenemos un 70% máquinas linux y un 30% máquinas windows; ¿ y esto se tradujo en ? que la actualización se volvió mas tediosa; es así que me prepuse crear scripts para que al iniciar el .jar en la máquina de los usuario primero verifique si hay una actualización y luego se ejecute.
Habiendo mencionado el antecedente lo primero es elegir un servidor o computador para usarlo como "Servidor de Actualización", se comparte una carpeta y se ubica el .jar actualizado.
Usando Robocopy en máquinas Windows (7 y XP)
Nota: Para ejecutar el .jar en las máquinas clientes es necesario ejecutar el siguiente comando desde el cmd: java -jar nombre_programa.jar, o pueden crear un .bat y lo guardan en el directorio donde está el .jar con la línea mencionada para así puedan poner el acceso directo al usuario.
El comando elegido para realizar la copia fue el robocopy, aquí la explicación del comando: http://bit.ly/11MIgL8
Sintaxis: robocopy origen destino [<File>[ ...]] [<Options>]
Uso: robocopy /L \\192.168.1.4\Actualizaciones_programa\ C:\Programa\ *.jar
Nota: Para ejecutar el .jar en las máquinas clientes es el mismo comando que en Windows solo que obviamente no es en el cmd si no en la consola. Pueden guardar el comando en un .sh darle permiso de ejecución y crear un acceso directo para facilitarle la vida al usuario.
Usando Rsync: Una breve explicación del comando: http://bit.ly/V1lAma
Sintaxis: rsync [OPTION] … SRC [SRC] … [USER@]HOST:DEST
Uso: rsync -av //192.168.1.4/Actualizaciones_programa/programa.jar /programa/
Hasta ahora realmente no hay nada el otro mundo pero .... Vamos a complicar un poco más las cosas.
Luego de que funcionara los scrips en Linux y en Windows empezaron a llamar los usuarios a indicar que se les demoraba demasiado al momento de abrir el programa, esto se generaba porque ambos comandos comparaban y copiaban siempre el .jar, aprovechando esto Gerencia me dijo "ya como estás en esas de una ves mira si puedes hacer para que pregunte primero antes de actualizar" y entonces ¿ que hacemos ?
Copio mi script y lo explico:
TITLE Ingresando al Sistema v1.0 Un titulo cualquiera a la ventanta
if %errorlevel%==0 goto :Continuar Si no encuentra diferencia lo envía a Continuar
if %errorlevel%==1 goto :ACT Si encuentra diferencia manda a preguntar ACT
SET var=1 Doy valor incial a la variable
#!/bin/bash
#
# Script v1.1
# Creado por Danny Obando
kdialog --title "Venta del Sistema" --yesno "Desea Actualizar el Sistema?" Pregunta al usuario si desea actualizar o no.
if [[ $? -eq 0 ]]; then Si el usuario dice que si se actualiza el Sistema
sudo mkdir /media/act_programa/ Creo una carpeta temporal
sudo chmod -R 777 /media/act_programa/ Le cambio los permisos
notify-send "Actualizando v1.3" Ventana de notificación al usuario
sudo mount -t cifs -o username=act_programa,password=act_programa //192.168.1.4/Actualizaciones_Programa /media/act_programa/ Monto la unidad de red en la carpeta creada
if [ -e /media/act_programa/log.txt ] Se me ocurrio tener en esa carpeta log.txt para confirmar que se haya montado la unidad de red, si existe quiere decir que está correcto then
sudo rsync -av /media/act_programa/Sistema.jar /Programa/ Actualizo el programa sudo sleep 1
sudo umount /media/act_programa/ Desmonto la unidad de red
else
echo "Problema montando"
fi
sudo umount /media/act_programa/
if [ -e /media/act_programa/log.txt ] Confirmo que se haya desmontado, caso contrario la vuelvo a desmontar
then
echo "Quedo montada"
else
sudo rm -r /media/act_programa Elimino la carpeta creada
fi
notify-send "Abriendo el Sistema"
java -jar Sistema.jar
else
# Solo se abre el Sistema
notify-send "Abriendo el Sistema"
java -jar Sistema.jar
fi
Uso: robocopy /L \\192.168.1.4\Actualizaciones_programa\ C:\Programa\ *.jar
Usando Rsync en máquinas Linux (Opensuse 11.2)
Nota: Para ejecutar el .jar en las máquinas clientes es el mismo comando que en Windows solo que obviamente no es en el cmd si no en la consola. Pueden guardar el comando en un .sh darle permiso de ejecución y crear un acceso directo para facilitarle la vida al usuario.
Usando Rsync: Una breve explicación del comando: http://bit.ly/V1lAma
Sintaxis: rsync [OPTION] … SRC [SRC] … [USER@]HOST:DEST
Uso: rsync -av //192.168.1.4/Actualizaciones_programa/programa.jar /programa/
Hasta ahora realmente no hay nada el otro mundo pero .... Vamos a complicar un poco más las cosas.
Luego de que funcionara los scrips en Linux y en Windows empezaron a llamar los usuarios a indicar que se les demoraba demasiado al momento de abrir el programa, esto se generaba porque ambos comandos comparaban y copiaban siempre el .jar, aprovechando esto Gerencia me dijo "ya como estás en esas de una ves mira si puedes hacer para que pregunte primero antes de actualizar" y entonces ¿ que hacemos ?
Complicando las cosas: Usando Robocopy con errorlevel (Windows)
Copio mi script y lo explico:
@ECHO OFF
color 17 Pongo color a la pantallaTITLE Ingresando al Sistema v1.0 Un titulo cualquiera a la ventanta
robocopy /L \\192.168.1.4\Actualizaciones_Programa\ C:\Programa\ *.jar
if %errorlevel%==1 goto :ACT Si encuentra diferencia manda a preguntar ACT
if %errorlevel%==3 goto :ACT Si encuentra diferencia manda a preguntar ACT
:ACT
cls Manda a borrar la pantalla
echo Seleccione la opción
echo.
echo 1. Continuar
echo 2. Actualizar Sistema
echo. Un pequeño menú
SET /p var= Con el /p espero qu el usario escriba una opción
if %var%==1 goto :Continuar
if %var%==2 goto :Actualizar
:Actualizar
cls
echo Actualizando el Sistema
xcopy /c /r /y /f /D "\\192.168.1.4\Actualizaciones_Programa\Sistema.jar" "C:\Programa"
goto :Continuar
:Continuar
cls
echo Abriendo el Sistema
javaw -version:1.6 -Xms128m -Xmx512m -jar Sistema.jar
goto :eof
Complicando las cosas: Usando Rsync
Este script me costó un poco más terminarlo, ¿ porqué?, luego de tener funcionando ambos scripts no se que usuario "chistoso" o por error borró el .jar de la carpeta de actualizaciones y obviamente mis scripts no servían, por lo que tuve que ponerle usuario y contraseña a la carpeta y darle solo permiso de escritura.
Copio mi script y lo voy explicando.
#
# Script v1.1
# Creado por Danny Obando
kdialog --title "Venta del Sistema" --yesno "Desea Actualizar el Sistema?" Pregunta al usuario si desea actualizar o no.
if [[ $? -eq 0 ]]; then Si el usuario dice que si se actualiza el Sistema
sudo mkdir /media/act_programa/ Creo una carpeta temporal
sudo chmod -R 777 /media/act_programa/ Le cambio los permisos
notify-send "Actualizando v1.3" Ventana de notificación al usuario
sudo mount -t cifs -o username=act_programa,password=act_programa //192.168.1.4/Actualizaciones_Programa /media/act_programa/ Monto la unidad de red en la carpeta creada
if [ -e /media/act_programa/log.txt ] Se me ocurrio tener en esa carpeta log.txt para confirmar que se haya montado la unidad de red, si existe quiere decir que está correcto then
sudo rsync -av /media/act_programa/Sistema.jar /Programa/ Actualizo el programa sudo sleep 1
sudo umount /media/act_programa/ Desmonto la unidad de red
else
echo "Problema montando"
fi
sudo umount /media/act_programa/
if [ -e /media/act_programa/log.txt ] Confirmo que se haya desmontado, caso contrario la vuelvo a desmontar
then
echo "Quedo montada"
else
sudo rm -r /media/act_programa Elimino la carpeta creada
fi
notify-send "Abriendo el Sistema"
java -jar Sistema.jar
else
# Solo se abre el Sistema
notify-send "Abriendo el Sistema"
java -jar Sistema.jar
fi
En color café están mis comentarios y en los condicionales le puse un color distinto para dar una mejor referencia de donde empiezan y donde terminan.
Ya con todo eso he logrado "automatizar" la actualización del sistema en mi empresa, claro está que van surgiendo más y más requerimientos día a día por lo que le he hecho unos cuantos cambios más, pero eso es tema de otro post.
Espero les sea de ayuda o sirva de referencia a alguien que ande buscando lo mismo o algo por el estilo.
Dejen sus comentarios, o escribanme al twitter @Danny_Obando por cualquier cosa.
Hasta mi próximo post !!!
Danny, yo tengo un caso similiar pero lo que hacemos es lo siguiente para ver si me das una ayuda.
ResponderEliminartengo rsync operando correctamente por medio de crones que ejecutan el rsync cada cierto tiempo, pero ahora se requiere que envie un correo cuando rsync compare, mida, liste la carpeta del servidor y carpeta del hosts y si hay transmision de nueva información mande el correo, actualmente lo tengo enviando correo una vez se ejecute pero no es la mejor practica.
Espero me des una luz,
Que tal Alfonso, ¿pero el correo q te envía es solo informativo? ¿Osea solo quieres saber que es lo que incrementó y copió ?. Sorry por no contestar antes.
EliminarHola, mi nombre es César, muy buena información,
ResponderEliminarsaludos y gracias por compartir tus conocimientos para quienes lo necesitamos
:)