domingo, 28 de agosto de 2016

Activar el modo debug en bash

Yo se me van a amar aquellos que apenas empiezan como yo en el mundillo de bash y la programación en shell script

veamos cuando la opción x en bash es agregada, bash imprimirá cada comando que ejecutará antes de ejecutarlo en la salida de standard error. eso después de aplicar cualquier expansión . como resultado  tu podras ver lo que ocurre. hay que poner especial atención en el entrecomillado. Bash utiliza las comillas para presentar exactamente las cadenas que son pasadas al script como argumentos únicos 

Básicamente hay tres formas de activar el modo debug
  • Correr el script con bash -x:
    $ bash -x ./scriptsito_del_mal
  • Cambiar el shebang (header):
    #!/bin/bash -x
    [.. script ..]
  • O:
    #!/usr/bin/env bash
    set -x
  • O agregar set -x agregar -.x o +x en bloques específicos de tu codigo para prender o apagar el modo debug y solo afectar a esa parte de tu código:
    #!/usr/bin/env bash
    [..aquí no importa este código..]
    set -x
    [..aquí había problemas activar el modo debug..]
    set +x
    [..aqui ya no esta activo el modo debug ..]
la salida del modo debug usualmente se despliega en stderr,lo que implica que la observaras en la pantalla de la terminal. pero como siempre podemos utilizar una tubería para redireccionar la salida a un archivo y evitar que se despliegue todo en pantalla:
exec 2>> /home/miarchivito.out
set -x


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.

sábado, 28 de mayo de 2016

Por que casi abandono la musica streaming

Es una entrada algo extraña pero queria expresar mi punto de vista respecto de las apps en streaming apesar de su practicidad, dezeer y spotify son los servicios que mas eh utilizado ambos los eh utilizado en paga y me van muy bien en linux.

PERO....
resulta que me concidero algo melomano y amante del HI-FI, a decir verdad eh "invertido" en equipo de audio que saque el mejor provecho de los CD's, MP3 y etc... o por lo menos trato de apreciar la musica de la mejor forma y defintivamente ni tidal ni dezeer ni spotify me han terminado de llenar el ojo en cuanto a HI-FI se refiere por mas calidad que le ponga ya me mal acostumbre al FLAC o al ya muy viejito e impractico WAV del CD que en cuanto a calidad es muy dificil de superar.

ahora, me di cuenta de otra cosa mas y es que sigue siendo muy practico el MP3 de 320kbps, resulta que el storage se ha vuelto mas barato, las apps que convierten el WAV a formatos de compresion como FLAC, ogg, mp3 y AAC son muy eficentes y sin duda siempre superior al streaming.

Organizar la biblioteca de mp3 me resulta mas practico por lo menos a mi en el smarphone o en la PC, no requiero conexion de datos permanente para poder disfrutar de la musica y puedo conservar mejor calidad al hacer streaming via bluetooth o wifi.

STREAMING NO TE ABANDONARE
Definitivamente no abandonare totalmente las apps de streaming por que es sumamente util escuchar los nuevos lanzamientos antes de adquirir un CD o descargar archivos, el gasto que representa mensualmente es bastante conciderable en México para las versiones de paga, y personalmente solo compro CD's de aquellos que valen mas la pena para mi; que en comparacion con un pago mensual que generalmente es menor en mi caso a la suma de gasto anual por el streaming, a los demas prefiero escucharlos como si fuera radio o con las limitantes del streaming gratis, no concidero que valga la pena el gasto y quizas la nostalgia de ver el folleto/librito, el arte en la portada y las ediciones especiales con sus extras y el insuperable WAV me hacen regresar con cierto cariño a mis CD's.

PROS y CONS

Streaming Pros
-Es practico y comodo tener a la mano millones de artistas
-Hay variedad de servicios (spotify, deezer,Tidal, rdio... etc...)
-Nuevos lanzamientos a la palma de la mano
-Excelente para un preview
-playlist interesantes/ mixes

Streaming Cons
-las versiones que no son de paga limitan el poder almacenar la musica
-aun almacenando la musica la calidad sigue siendo limitada
-las apps en streaming no son muy eficientes en su ejecucion aveces se traban aun con equipos buenos
-dependen totalmente de los datos para moviles en especial
-las apps de escritorio dejan que desear en cuanto a ecualizacion y customizacion
-poca compatibilidad en comparacion con el clasico mp3 aunque cada vez mas y mas equipos son compatibles con estas app hablo muy en especial de smartvs y equipo de audio (home theater)

Formatos de audio tradicionales Pros
-Aunque el CD podria descartarse por que ya muchos autos y equipos en general ya no tienen un reproductor de cd, la calidad del WAV es insuperable e igualmente mp3, aac, ogg, FLAC con tasas de bits aun cercanos a los 256kbps se oyen mucho mejor que la calidad inclusive alta de las apps en streaming

- El mp3 y AAC siguen siendo los formatos mas compatibles y utilizados en la mayoria de los equipos
- No requieren de datos
-Se los puedo compartir a mis amigos sin necesidad de pagar nada adicional (cierto no beneficia mucho a la musica pero es como comprar un libro yo se lo puedo prestar a quien yo quiera)


- Si cuentas con equipo adecuado la experiencia suele ser mas enriquecedora
- Me encanta el material fisico en el caso de los CD's
- Siguen siendo muy practicos tanto para moviles como equipos (Home theater, smartv, share points llamese NAS o discos compartidos y otros reproductores)
-la organizacion de la biblioteca es realmente util por lo menos para mi

 Formatos de audio tradicionales Cons
-requieren de un medio de almacenamiento y este generalmente representa un costo adicional
-si el formato fisico se daña adios a la preciada colleccion
- biblioteca limitada a solo lo que tienes aunque claro podemos torrentear un rato o convertir nuestros cds a formatos digitales para ampliar.


Conclusion
Quizas en funcion del usuario pueda resultar mas practica una u otra solucion, definitivamente seguire utilizando apps de streaming aunque no muy dispuesto a gastar en ellas, la enorme nostalgia y gusto por los formatos tradicionales y mi gusto por escuchar la mejor calidad de audio dentro de mi alcance me empuja a seguir en los formatos tradicionales e incluso a aprender cuestiones mas tecnicas, como la ecualizacion, equipos y apps especializadas para sacar el mejor provecho de los distintos formatos.

por ultimo una interesante prueba jejeje
http://www.npr.org/sections/therecord/2015/06/02/411473508/how-well-can-you-hear-audio-quality

yo atine 4 en wav y 2 en 320 pero con audifonos jeje con las bocinas de la compu solo 2 de wav y 3 de 320, la de jay z esta dificil


lunes, 18 de enero de 2016

obtener las variables asociadas a un proceso en linux

Una entrada super veloz y bien útil, que de vez en cuando me toca en el trabajo, obtener las variables de entorno involucradas para un proceso

cat /proc/$PID/environ

donde $PID es el numero de procesos
podemos obtener el numero de proceso con varios comandos como:
ps -ef | grep httpd o apache o ....
pgrep | httpd

etc...
:-) espero sea de ayuda, basicamente lo que arroja son las rutas y variables involucradas, por ejemplo la variable PATH con la que este corriendo etc...

[root@server css]# cat /proc/6254/environ
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binLANG=CNOTIFY_SOCKET=@/org/freedesktop/systemd1/notify

jueves, 27 de agosto de 2015

remover paquetes o dependencias huerfanas en red hat 7/ centos 7 /fedora 7 y tambien 6

facil y veloz, entra como root o superusuario y ejecuta:

yum autoremove    //y veras una pantalla como la siguiente en donde tu aceptas o no remover
 
Complementos cargados:fastestmirror, langpacks
Resolviendo dependencias
--> Ejecutando prueba de transacción
---> Paquete centos-bookmarks.noarch 0:7-1.el7 debe ser eliminado
--> Resolución de dependencias finalizada
--> Buscando dependencias sobrantes innecesarias
Found and removing 0 unneeded dependencies

Dependencias resueltas

===================================================================================================================================================================================================================
 Package                                                  Arquitectura                                   Versión                                           Repositorio                                       Tamaño
===================================================================================================================================================================================================================
Eliminando:
 centos-bookmarks                                         noarch                                         7-1.el7                                           @anaconda                                         1.1 k

Resumen de la transacción
===================================================================================================================================================================================================================
Eliminar  1 Paquete

Tamaño instalado: 1.1 k
Está de acuerdo [s/N]:s
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Eliminando    : centos-bookmarks-7-1.el7.noarch                                                                                                                                                              1/1 
  Comprobando   : centos-bookmarks-7-1.el7.noarch                                                                                                                                                              1/1 

Eliminado(s):
  centos-bookmarks.noarch 0:7-1.el7                                                                                                                                                                                

¡Listo!
 
para debian ;-)

apt-get autoremove

instalar VLC en centos 7 :-)

Navegando por la web me encontre con un repo bastante bueno para poder instalar vlc en centos

instalamos el repositorio:

rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
 
actualizamos la base de datos de repos
yum update
 
instalamos el paquete :-) 
 
yum  install vlc 

en las ultimas versiones quizá podemos utiliza dnf en vez de yum

también te recomiendo agregar el repositorio de epel por si falta algo
yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
 
o bien de la forma manual: 
 
touch /etc/yum.repos.d/epel.repo
editamos el archivo /etc/yum.repos.d/epel.repo
agregando las siguientes lineas

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

y ejecutamos yum update y despues yum repolist y yum install vlc 
 
listo tenemos VLC 

jueves, 11 de junio de 2015

Donde estan los logs del sistema en linux

Bueno hoy les traigo una entrada cortita pero muy util funciona en fedora, red hat, ubuntu, mint y varios mas, en donde se encuentran los logs de linux?, si bien no son todos estos son los que por lo menos concidero los basicos.

logs y para que sirve ?
/var/log/messages
la mayoria de los mensajes del syslog se guardan aqui. con excepcion de los mensajes relacionados a la autenticación y los mensajes del servicio de correo, algunos otros mensajes de debug
/var/log/secure
Aqui vamos a poder ver los logs relacionadios con la autenticación del sistema, es decir quien entro, quien salio y errores
/var/log/maillog
  Este es el log del servicio estandar de correos por lo general sendmail o postfix
/var/log/cron
Este es el log relacionado con las tareas programadas en el crontab de todos los usuarios y aqui podemos ver parte de su ejecucion y el resultado
/var/log/boot.log
 
Finalmente aqui podremos ver los logs relacionados con el arranque e inicio del sistema