jueves, 7 de febrero de 2013

Usando Rsync en Linux y Robocopy en Windows


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



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 pantalla
TITLE Ingresando al Sistema v1.0    Un titulo cualquiera a la ventanta

robocopy /L \\192.168.1.4\Actualizaciones_Programa\ C:\Programa\ *.jar

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
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 var=1               Doy valor incial a la variable
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.

#!/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



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 !!!


3 comentarios:

  1. Danny, yo tengo un caso similiar pero lo que hacemos es lo siguiente para ver si me das una ayuda.

    tengo 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,

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  2. Hola, mi nombre es César, muy buena información,
    saludos y gracias por compartir tus conocimientos para quienes lo necesitamos

    :)

    ResponderEliminar