domingo, 28 de agosto de 2016

Ideas para automatizar un actualización de jdk java con bash

Bueno les dejo un script que hace tiempo que desarrolle quizás necesite depurarse y customizarse para que puedan ustedes emplearlo, la idea de publicarlo es que sirva como estudio y pudiera ser empleado como ejemplo para el desarrollo de otros script es bastante simple y no considero mi fuerte el desarrollo, la idea básicamente es utilizar un servidor apache como repositorio, descargar los paquetes de ahí y después realizar la instalación, evidentemente parte de este código fue empleado para un cliente el cual omitiré nombrar por cuestiones y modificare el código para conservar su privacidad,
iré explicando los pasos linea por linea para que se entienda lo mejor posible con las acostumbradas  "//"
DESARROLLADO EN RED HAT 6 Y 7

#!/bin/bash                             // declaramos el shebang en este caso bash
#Author: JCPG licence GPL // aqui me cuelgo mis medallas XD jajaja
#Script to install a new java version ##### untested version SCRIPT Java_install_RC5_FINAL  ###
#Script modificado para instalar la version java 1.6.0_115 to 1.6.0_121  and 1.7.0_101 to 1.7.0_111
# Test servers Server 1 (java 7) and server tipo 2 (java 6) // el asunto aqui es que tenia un grupo de servidores con java 7 y otros con java 6 así que para evitar errores y no crear scripts por separado le di facultades (un case :-P ) para que el script pudiera distinguir la instalación que requería el server, cabe mencionar que ya se conoce la versión previa de java en cada caso

#Variables to retrieve the version and take java.security
VERSION=`rpm -q jdk | sort -r | head -1`  //asigno a esta variable la versión de java previamente instalada utilizando el manejador de paquetes

PACKAGE=p23218364_160121_Linux-x86-64.zip // el nombre de mi paquete java 6
PACKAGE2=p23218354_170111_Linux-x86-64.zip  // el nombre de mi paquete java 7
JAVAPKGOLD1=jdk-1.6.0_115-fcs.x86_64 //el nombre del paquete java 6 instalado
JAVAPKGOLD2=jdk-1.7.0_101-fcs.x86_64 //el nombre del paquete java 7 instalado
JAVAPKGBKP1=jdk1.6.0_115  // nombre de la carpeta del java 6 anterior
JAVAPKGBKP2=jdk1.7.0_101 // nombre de la carpeta del java 7 anterior
JAVAPKGNEW1=jdk1.6.0_121 // nombre de la carpeta del java 6 nueva
JAVAPKGNEW2=jdk1.7.0_111  // nombre de la carpeta del java 7 nueva
NEWRPM1=jdk-6u121-linux-x64-rpm.bin //el nombre del paquete java 6 descomprimido
NEWRPM2=jdk-7u111-linux-x64.rpm //el nombre del paquete java 6 descomprimido
OLDJAVAFOLDERS=jdk1.[6-7].?_??_old // carpeta backup existente o por existir
BACKUP_DATE=`/bin/date +%Y%d%H%M%S`  // fecha
VERSIONNEW=`rpm -qi jdk | head -2 | grep -i version | awk '{print $2}'` // extraigo la nueva version


#la función pre-patch valida que este instalado unzip, wget, y yum que son programas necesarios para # la operación del script de igual manera se valida si ya existe el folder de java

function pre_patch {
if [ -f "/usr/bin/unzip" ]
 then
echo "unzip installed"
else
 echo "unzip not installed trying to install it"
 yum install -y unzip
fi
if [ -f "/usr/bin/wget" ]
 then
echo "wget installed"
else
 echo "wget not installed trying to install it"
 yum install -y wget
fi
if [ -f "/usr/bin/yum" ]
  then
   echo "yum installed"
 else
   echo "Error yum not installed and it is a necessary package"; exit 2;
fi
if [ -d "/usr/java" ]
 then
  echo "Java path found"
 else
  echo "Error /usr/java path doesn't exists"; exit 2;
 fi

}

## esta es la función principal que básicamente es la que instala el java ##

function install_java {
LINK=`ls -ld [i,w,d]??_java | awk '{print $9}'`  // esta variable extra el nombre de un softlink que puede cambia al que el aplicativo requería ingresar esta con una expresión regular ya que dependiendo del server cambia su nombre ( no me pregunte por que rayos estaba así pero ellso llamaban al java asi )

## comienza el case ## // aqui validamos que versión manejamos
case "$VERSION" in

  "$JAVAPKGOLD1" ) // para java 6
     echo "java found:"$VERSION // confirmo que encontre la version
     wget -nv http://server01.chipocludo/java/$PACKAGE // descargo el paquete de java
    mv $JAVAPKGBKP1 "$JAVAPKGBKP1$BACKUP_DATE" || { echo "Could not move folder $JAVAPKGBKP1"; exit 2; } // hago un pequeño backup moviendo la carpeta actual ( no necesita ser exacto en este caso)
    unzip $PACKAGE || { echo "Could not unzip package $PACKAGE"; exit 2; } // descomprimo el paquete
    mv readme.txt readme.txt_"$BACKUP_DATE" || { echo "Could not move old readme.txt under /usr/java/"; exit 2; } // hago un backup de el readme.txt que explica los cambios del release anterior
    yum remove -y jdk // remuevo cualquier version de jdk previamente instalada
    yes | ./$NEWRPM1 // como el paquete es un rpm.bin (como un exe para no entrar en detalles) utilizo yes mas una tubería para aceptar por default los valores necesarios y forzar de alguna manera a que sea "desatendido"

    cp /usr/java/"$JAVAPKGBKP1$BACKUP_DATE"/jre/lib/security/*.jar /usr/java/$JAVAPKGNEW1/jre/lib/security/ || { echo "Could not move JARS under /usr/java/$JAVAPKGNEW2/jre/lib/security"; } //creo un backup de los jars security que dificilmente se actualizan entre versiones en este casos son estos los que utiliza la app

    cp -p /usr/java/$JAVAPKGNEW1/jre/lib/security/java.security /usr/java/$JAVAPKGNEW1/jre/lib/security/java.security_"$BACKUP_DATE" || { echo "WARNING: Could not backup java.security"; } //copio el archivo security al nuevo folder de la nueva version

    sed 's/jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768/\#jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768/g' /usr/java/$JAVAPKGNEW1/jre/lib/security/java.security_"$BACKUP_DATE" > /usr/java/$JAVAPKGNEW1/jre/lib/security/java.security // esta linea se vuelve algo muy extraño de la app que no es compatible con certificados SSL y cifrados so comento una linea para omitir esta operacion dentro de java.security

    unlink $LINK || { echo "WARNING: Could not delete the softlink $LINK"; } // quito el softlink anterior ya que necesita se actualizado y reapuntarse a la nueva carpeta donde esta instalado jdk
    ln -s /usr/java/$JAVAPKGNEW1 $LINK || { echo "WARNING: Could not create the softlink $LINK"; } //y creamos el nuevo link
    grep SSLv3 /usr/java/$JAVAPKGNEW1/jre/lib/security/java.security // hago este grep solo para validar que la linea fue modificada correctamente y se muestre en pantalla el comentario
remove_old // mando llamar a la función remove_old para depurar los backups que pudieran existir y liberar espacio
;;
// no comentare todo el case para la versión 7 pero es bastante parecido.
"$JAVAPKGOLD2" ) // para java 7
    echo "java found:"$VERSION
    wget -nv http://server01.chipocludo/java/$PACKAGE2
    mv $JAVAPKGBKP2 "$JAVAPKGBKP2$BACKUP_DATE" || { echo "Could not move folder $JAVAPKGBKP2"; exit 2; }
    unzip $PACKAGE2 || { echo "Could not unzip package $PACKAGE"; exit 2; }
mv readme.txt readme.txt_"$BACKUP_DATE" || { echo "Could not backup old readme.txt under /usr/java/"; exit 2; }
    yum remove -y jdk
    yum localinstall -y $NEWRPM2 // a diferencia de la versión 6 el jdk 7 es un rpm normalito y puede ser instalado o bien con yum, o dnf o rpm, en este caso como yo proveo el rpm utilizo localinstall y el -y para asumir yes a cualquier pregunta del instalador
    cp /usr/java/"$JAVAPKGBKP2$BACKUP_DATE"/jre/lib/security/*.jar /usr/java/$JAVAPKGNEW2/jre/lib/security/ || { echo "Could not move JARS under /usr/java/$JAVAPKGNEW2/jre/lib/security"; }
    cp -p /usr/java/$JAVAPKGNEW2/jre/lib/security/java.security /usr/java/$JAVAPKGNEW2/jre/lib/security/java.security_"$BACKUP_DATE" || { echo "WARNING: Could not backup java.security"; }
    sed 's/jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768/\#jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768/g' /usr/java/$JAVAPKGNEW2/jre/lib/security/java.security_"$BACKUP_DATE" > /usr/java/$JAVAPKGNEW2/jre/lib/security/java.security // la linea del sed cambia un poco en el reemplazo del archivo pero básicamente se comenta igual
    unlink $LINK || { echo "WARNING: Could not delete the softlink $LINK"; }
    ln -s /usr/java/$JAVAPKGNEW2 $LINK || { echo "WARNING: Could not create the softlink $LINK"; }
    grep SSLv3 /usr/java/$JAVAPKGNEW2/jre/lib/security/java.security
   remove_old
;;
 "*" ) // para cualquier otra condición o versión de java
    echo "Wrong Java Version or not previously installed"
;;
esac
 
}

#esta es una función para validar que versión se encuentra instalada y que sea una de las actuales#
function validation {

if [ "$VERSIONNEW" = "$JAVAPKGNEW1" ] ||  [ "$VERSIONNEW" = "$JAVAPKGNEW2" ]
 then
   echo "the installed Java is up to date: $VERSIONNEW"
   exit 0
 else
      install_java
 fi

}

#esta función se lleva o elimina los folders y paquetes utilizados en la instalación y paquetes viejos que se quedaron cuando el proceso se realizaba a mano la salida de lo que se borra se guarda en /var/tmp/error_removejava.out igual lo pueden guardar en /tmp o donde mas les plasca#
function remove_old {
## function that delete old files and rpm,bin,tar and gz files used during the installation ##

echo "Log Old files removed under /usr/java $BACKUP_DATE" > /var/tmp/error_removejava.out
rm -R $OLDJAVAFOLDERS >> /var/tmp/error_removejava.out 2>&1 || { echo "WARNING: Could not delete old folder $OLDJAVAFOLDERS"; }
rm -fv /usr/java/*[Ll]inux*.[rbz][pi][mnp] >> /var/tmp/error_removejava.out 2>&1 || { echo "WARNING: Could not delete old *.gz *.bin .rpm files"; } // adios a los rpm,bin y zips igual se puede hacer con [rpm,bin,zip] y es algo mas preciso que la expresion regular que igual se me hizo un buen ejercicio jeje
rm -fv /usr/java/sun-javadb-*.rpm >> /var/tmp/error_removejava.out 2>&1
echo "---- End task Log Old files removed under /usr/java $BACKUP_DATE ---" >> /var/tmp/error_removejava.out  // aqui elimino un tipo muy especifico de archivo que son los sun-javadb

}
####### Main program ##### // y esta es la secuencia del programa
pre_patch  // entra la funcion pre patch para validar los requisitos
validation // validamos que no este instalado y procedemos a instalar o si ya esta instalado es exitoso
cd /usr/java // nos posicionamos en el folder donde se va a instalar
validation // validamos que no este instalado y procedemos a instalar o si ya esta instalado es exitoso

espero los comentarios sean claros y sirva como un caso de estudio igual para no llamar 2 veces a la función de validation podemos agregar un ciclo y etc... pero me pareció bastante simple así y no considere necesario iterar mas veces.
espero les sirva y aporte algunas ideas para sus scripts.

No hay comentarios.:

Publicar un comentario