miércoles, 19 de febrero de 2014

Streaming de audio en Ubuntu (Icecast2 + Ices2)

Este año estamos detrás de un proyecto para un museo en el que queremos crear audioguías a través del teléfono móvil. El concepto se basa en recibir en el móvil un streaming de audio de la obra de arte que el usuario puede tener delante en ese momento. Este streaming sólo se emite a demanda a través de una red local y el contenido no está disponible fuera de dicha red local.

Mediante códigos QR el usuario realizaría una fotografía de éstos y directamente en su móvil se accedería al streaming correspondiente a esa obra.

Como punto de partida utilizaremos, bajo Ubuntu, la pareja Icecast2 e Ices2. No vamos a hacer una retransmisión en directo con nuestro streaming. En principio, sólo emitiremos una playlist que podrá ser "sintonizada" desde cualquier dispositivo que se encuentre en nuestra red.


Icecast2 es una aplicación de servidor para streaming de Ogg Vorbis (.ogg) y MP3 (.mp3). Ices2 será el complemento que creará el flujo de audio o stream de audio en el servidor. 

La instalación de ambos paquetes puedes realizarla a través del comando:

sudo apt-get install icecast2 ices2

Comenzando por configurar Icecast2...


  1. Edita el archivo icecast.xml mediante sudo gedit /etc/icecast2/icecast.xml
  2. Busca las etiquetas "source-password" y el "admin-password" en la sección de "<authentication>" y establece tú la contraseña que estimes. source-password es la contraseña utilizada para conectarse al servidor Icecast2. El admin-password es la contraseña que se utilizará para el acceso a la interfaz web de Icecast2 (http://localhost:8000/admin). Una recomendación, deja ambas contraseñas con el mismo valor, más tarde podrás cambiarlas y ponerlas diferentes. Busca también <hostname> y cambia de localhost a la ip de tu servidor.

  3. Ahora debes ir a editar otro archivo de configuración de Icecast2, hazlo con sudo gedit /etc/default/icecast2. Una vez abierto, busca la línea que contenga “ENABLE=false” y pon la variable "ENABLE=true". Guarda y cierra el archivo.

  4. Por ahora, ya tendríamos instalado y configurado básicamente el servidor Icecast2. Puedes iniciarlo tecleando sudo /etc/init.d/icecast2 start, o bien, sudo service icecast2 start. Con esto iniciaremos el demonio de Icecast2. 
  5. Para probar que el servidor está operativo, abre en el navegador la dirección “http://localhost:8000” en la barra de direcciones para probar la configuración. Te aparecerá una página de administración del servidor Icecast2, si pulsas sobre el enlace de "Administración" te pedirá usuario y contraseña. Éstos son los que has configurado en el paso 2.

Configuración de Ices2
  1. En primer lugar debes crear tres carpetas para que Ices2 pueda funcionar correctamente, utiliza los siguientes comandos.
    sudo mkdir /var/log/ices (lugar para el fichero log)
    sudo mkdir /etc/ices2 (lugar para los ficheros de configuración)
    sudo mkdir /etc/ices2/music (lugar para los archivos de música)

  2. A continuación, vamos a crear el archivo de configuración específico de Ices2. Lo haremos tomando como base un fichero de configuración de ejemplo que el propio Ices2 nos ofrece. Este fichero ejemplo se encuentra en la carpeta /usr/share/doc/ices2/examples. En concreto, nos fijaremos en el fichero con nombre ices-playlist.xml. Debemos copiar este fichero a la carpeta que hemos creado para ices2 en /etc. El comando sería 
    sudo cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2
  3. Una vez lo hayas copiado, edítalo con gedit o nano. 

  4. Realiza los siguientes cambios:
    a) Cambia el numero "0" a "1" en la sección “<background>0<background>”. 
    b) Edita la sección “<metadata>...<metadata>” para personalizar los datos de tu emisora.
    c) Edita “<param name="file">/etc/ices2/playlist.txt</param>” para incluir la ruta a tu lista de reproducción. 
    d) Edita “<password>hackme</password>” para incluir constraseña orígen desde Icecast2. Esta contraseña es la que pusiste cuando configuraste Icecast2.
    e) Modifica <mount> para indicar el punto de montaje de tu playlist, puedes poner /emision.ogg por ejemplo. Este valor será el que las máquinas clientes deberán poner en la dirección que tendrán que utilizar para acceder al stream. (http://ip_servidor:8000/emision.ogg)
Indica la música que quieres reproducir...
  1. Mueve a la carpeta /etc/ices2/music todos los archivos ogg que desees incluir en tu playlist.
  2. Crea un archivo nuevo en /etc/ices2 con el nombre playlist.txt
  3. Edítalo y añade todas las rutas absolutas de los archivos que quieras que formen parte de tu playlist. Guarda y cierra el archivo.4
  4. Ahora, lanza ices2 para crear el flujo de audio. Hazlo con el comando:
    sudo ices2 /etc/ices2/ices-playlist.xml
  5. Ve al navegador y comprueba a través de http://localhost:8000 que se está emitiendo tu lista de música. Para probarlo en una máquina cliente, abre el navegador en ella y pon la dirección http://ip_servidor:8000/punto_montaje y podrás escuchar lo que en ese momento se está emitiendo. (para nuestro ejemplo podría ser http://ip_servidor:8000/emision.ogg)
 Espero que os haya sido útil este post.

lunes, 17 de febrero de 2014

Abrir aplicaciones gráficas a través de crontab

En esta ocasión vamos a ver cómo realizar la programación de tareas en un equipo Linux para poder abrir aplicaciones que funcionan en entorno gráfico, a través del archivo crontab. Este archivo se encuentra en la carpeta /etc de tu sistema Linux.

Como root, debemos editar el archivo e insertar una línea en blanco antes de la última # que aparece en dicho archivo. Una vez hecho esto, escribimos la línea que hará que se ejecute la tarea programada. Por ejemplo, vamos a abrir el minuto 59 de cada hora el navegador web firefox. Para ello debemos añadir la siguiente línea:

59 * * * * root DISPLAY=":0" /usr/bin/firefox

Monitorización con Zabbix (Iniciación)

En esta ocasión iniciamos nuestro camino hacia el uso de una herramienta profesional de monitorización como Zabbix. A continuación, te ofrecemos una serie de enlaces básicos y muy interesantes que te serán útiles en tus primeros pasos hacia el control de esta herramienta.


El proceso que describo ahora está basado en una instalación hecha sobre un Ubuntu 12.04:

1)Instalamos el servidor Zabbix: 
sudo apt-get install zabbix-server-mysql
Cuando se inicia la instalación se nos solicita ponerle contraseña al usuario root de mysql, es muy recomendable hacerlo. Posteriormente, como Zabbix utiliza una base de datos que creará en Mysql, hay que indicar la clave del usuario administrador de dicha base de datos. Te recomiendo pongas la misma clave que la de tu root de Mysql. A continuación puede que se te solicite que establezcas otra clave, sigue poniendo la misma que la del root de Mysql. Siempre tendrás tiempo de cambiarlas más tarde.

2) Instalamos el front-end de la aplicación:
sudo apt-get install zabbix-frontend-php
Durante la instalación de esta aplicación web para la gestión de Zabbix, se nos solicitará a través de qué sistema de gestión de bases de datos queremos instalarla. En este caso, indicaremos que a través de Mysql. Si nos pide alguna clave, volveremos a establecer la misma que la del root de mysql.


3) Instalamos el agente Zabbix: 
sudo apt-get install zabbix-agent 

Con todo esto instalado, reiniciamos todos los servicios relacionados para que cualquier cambio en las configuraciones tenga efecto.

sudo /etc/init.d/zabbix-server restart
sudo /etc/init.d/zabbix-agent restart

4) Acceso a Zabbix a través de nuestro navegador web:
Una vez instalado, nos vamos al navegador y ponemos como dirección de acceso nuestra IP/zabbix. Se nos solicitará entonces un Login. En mi caso, el usuario por defecto que Zabbix estableció era admin y como contraseña zabbix. Cuando introduces estos datos de autentificación se abre la ventana de gestión de Zabbix y ya puedes empezar a utilizar la herramienta.

Si tienes problemas para que te muestre la ventana de Login con los campos de usuario y contraseña (te muestra un cuadro con una advertencia en rojo sobre problemas de autentificación), te recomiendo que busques el archivo de configuración de zabbix, se llama dbconfig.php y está en la misma carpeta /etc/zabbix. En este archivo, puedes cambiar la línea donde indica el usuario de la base de datos, e incluir allí tu usuario administrador de mysql. Una vez cambiado, reinicias el servicio de mysql (sudo /etc/init.d/mysql restart) y te saldrá en el navegador la ventana de entrada correctamente. Hacemos Login con usuario: admin y contraseña: zabbix y a configurar.

5) Modificar valores en php.ini para que Zabbix funcione correctamente: 
Es posible que al entrar en Zabbix, en la ventana principal, te aparezcan algunos avisos en rojo sobre valores de variables del archivo php.ini que no tienen un valor adecuado. Busca en tu sistema dicho archivo (locate php.ini), edítalo como root y cambia estos valores a los que se te indican en dicha ventana principal. Reinicia el servidor Zabbix y vuelve a hacer login en la aplicación. Comprueba que los avisos han desaparecido.

Los valores de php.ini que tienes que cambiar son los siguientes:
max_execution_time = 300
max_input_time = 600
post_max_size = 32M 
date.timezone = Europe/Madrid

Script para enviar totales de tráfico de red vía email

El siguiente código fuente muestra cómo podemos enviar vía email los totales de tráfico de red obtenidos a través del software ipfm (IP Flow-meter). Realizando una correcta configuración de ipfm podemos obtener en un archivo con el formato ipfm-global-YYYY-mm-dd.log el volumen de tráfico generado diariamente (por ejemplo). Estos totales pueden ser volcados a un archivo de texto que constituirá el cuerpo del mensaje de correo electrónico que enviaremos a nuestra cuenta de monitorización.

De manera paralela, a través de este archivo de totales podemos incorporar en nuestro apache un script realizado en php que, tomando los datos de dicho archivo, nos mostrará en formato web lo descargado por los equipos que forman nuestra red. Puedes encontrár más información sobre esto en: http://scripfm.sourceforge.net/



Este es el código fuente:

#!/bin/bash

#Script que envía el estado del log de tráfico de ipfm a través
#de un mensaje de correo electrónico enviado desde la consola

servidor="[nombre del servidor]"
hoy=`date +%Y_%d_%m`
actual=`date +%Y-%m-%d`

if [ -f estadotrafico.txt ]
then
    rm estadotrafico.txt
else
    touch estadotrafico.txt
fi

echo "Subject: Estado del tráfico $servidor" >> estadotrafico.txt
echo
echo
echo "Trafico: $hoy" >> estadotrafico.txt
#Enviamos contenido archivo con totales diarios
cat /var/log/ipfm/ipfm-global-$actual.log >> estadotrafico.txt


sudo ssmtp tudirecciondecorreo@dominio.com < estadotrafico.txt

Instalación de LAMP, phpmyadmin y demás a través de un Shell Script

1) Instalamos tasksel - sudo apt-get install tasksel
2) Ejecutamos tasksel - sudo tasksel
3) Instalamos LAMP
4) Instalamos phpmyadmin - sudo apt-get install phpmyadmin
5) Descargamos paquete deb de webmin
6) Instalamos paquete webmin con dpkg
7) Abrimos el navegador con https://localhost:10000 para mostrar que funciona

Dos ejercicios prácticos interesantes (WakeOnLan y Rsync)

Wake On Lan
Backups con Rsync

Expresiones regulares, grep, awk y sed

Cuando nos encontramos realizando scripts para Linux, son múltiples las ocasiones en las que necesitamos filtrar o buscar un determinado conjunto de caracteres o algún patrón especial. Para ello utilizamos las expresiones regulares combinadas con algunos de los comandos grep, awk o sed. 

Para conocer expresiones regulares diferentes, así como su explicación correcta debes acceder al siguiente enlace: Expresiones Regulares en la shell. Ejemplos de uso con grep, awk y sed.

Por otro lado, las expresiones regulares habrán de ser combinadas con el comando grep o egrep para realizar las búsquedas adecuadamente. Por hacer un simil, considero a grep como un perro buscador. En cambio, cuando lo que necesitamos es cambiar o sustituir algún patrón de texto o cadena de caracteres, utilizaremos el comando sed.

Ejecución descontrolada de procesos - Bombas FORK

Buscando en Internet información relativa a comandos sobre procesos, he encontrado una información muy interesante sobre la Ejecución descontrolada de procesos en un sistema Linux a través del comando fork.

En definitiva, se trata del clásico problema de ejecución de múltiples procesos que solicitan recursos en un sistema hasta que lo dejan KO. Gracias a los datos aportados en la web Planet Ubuntu, podemos aprender mucho más sobre lo vulnerable que es un sistema operativo. Puedes acceder a toda la información en este enlace: Bombas FORK. o pasándote por el Blog de Vicente Navarro: Fork, ulimit y limits.conf que es la fuente original.

lunes, 10 de febrero de 2014

Filtro básico de entrada con CASE

Aquí os dejo un filtro básico de letras realizado con expresiones y la estructura condicional múltiple case-esac.

#!/bin/bash

#Este script implementa un filtro de datos
#a través de expresiones y la estructura
#condicional múltiple case


dato=""
while [ "$dato" == "" ]
do
    read  -p "Introduce una letra mayúscula: " dato
    case $dato in
        [A-Z]) echo "Ok, has introducido la letra $dato";;
        [a-z]) echo "Error, has introducido una minúscula";;
        [0-9]) echo "Error, has introducido un número";;
        *) echo "Error, ¿Qué has introducido?";;
    esac

done

viernes, 7 de febrero de 2014

Instalador servicio correo ssmtp para alertas por email

Complementando las entradas de script de instalación y configuración automática de servicios en un servidor, os propongo una posible solución para dotar a un servidor de capacidad para enviar correos electrónicos de alerta a su administrador. Para ello, se realiza la instalación del servicio ssmtp (servicio de correo electrónico simple) y su correspondiente configuración modificando los archivos ssmtp.conf y revaliases, según la configuración que se indique desde teclado.


Para comprobar el correcto funcionamiento del servicio ssmtp, una vez haya sido instalado y configurado desde el script, sólo tendremos que teclear en la consola de comandos algo como esto:

ssmtp dirección_destino@loquesea.com < mensaje.txt

donde mensaje.txt deberá tener un formato adecuado, tal que así:

from: servidor que envia la alerta
subject: asunto de la alerta
# línea en blanco
texto de la alerta, tantas líneas como se necesiten

En este enlace puedes encontrar más información relacionada con el envío y preparación de correos electrónicos a través de consola. Y hacia el final de esta otra entrada podrás encontrar la primera versión de instalación automática del servicio ssmtp y envío de alertas por email.

En próximas entradas de este mismo blog, os mostraremos scripts que construirán mensajes de alerta automáticos en función del servicio/os que puedan haber caído.

#!/bin/bash

#Script que instala y configura servicio
#de correo electrónico ssmtp

#-------------------------------------
#     FUNCIONES
#-------------------------------------

function eresroot()
{
    if [ "$LOGNAME" != "root" ]              
    then
        echo "Este script debe ser ejecutado con privilegios de root."
        exit 1
    fi 
}

function configura()
{

    #1) Saco copia de seguridad
    if [ -f /etc/ssmtp/ssmtp.conf.old ]
    then
        echo "No se sacará copia de seguridad de ssmtp.conf"
    else
        cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.old
    fi

    if [ -f /etc/ssmtp/revaliases.old ]
    then
        echo "No se sacará copia de seguridad de revaliases"
    else
        cp /etc/ssmtp/revaliases /etc/ssmtp/revaliases.old
    fi


    #2) Modifico ssmtp.conf

    read -p "Introduce el usuario de gmail (sin @gmail.com): " usuario_gmail
    read -s -p "Introduce la contraseña: " clave_gmail

    echo "root=$usuario_gmail@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=
hostname=$usuario_gmail
AuthUser=$usuario_gmail@gmail.com
AuthPass=$clave_gmail
FromLineOverride=YES
UseSTARTTLS=YES " > /etc/ssmtp/ssmtp.conf

    #3) Modifico revaliases
    echo "root:$usuario_gmail@gmail.com:smtp.gmail.com:587
tu_usuario_linux:$usuario_gmail@gmail.com:smtp.gmail.com:587" >> /etc/ssmtp/revaliases

}

function instala()
{

    which ssmtp
    if [ $? -ne 0 ]
    then
        # Hacemos una instalación silenciosa y sin confirmación
        sudo apt-get install -y -q=2 ssmtp
        if [ $? -eq 0 ]
        then
            echo "Instalación correcta de ssmtp"
            configura
        else
            echo "Error en la instalación de ssmtp"
            exit 1
        fi
    else
        configura   
    fi


}


#-------------------------------------
#     PROGRAMA PRINCIPAL
#-------------------------------------
eresroot
instala



miércoles, 5 de febrero de 2014

Preinstalación automática de Servidor (Shell Script)

El código fuente de este script nos puede ser muy útil para realizar la instalación inicial de los servicios básicos de un Servidor. Entre otros, podremos instalar: Apache, PHP, MySQL, SSH, Servicio de correo electrónico, sistema de alertas por email, Webmin, PHPMyadmin, etc. Todo de una manera muy automática y relativamente cómoda.

Revísalo y cambia lo que necesites, podría tener algún bug. Es código directamente generado en clase de 2ºSMR - 2014 IES Oretania.


#!/bin/bash

#Este script sirve para preparar rápidamente un
#servidor con los servicios básicos más comunes.

#Además, es posible instalar webmin a través de 
#un script previo que se publicó en este mismo blog.
#Otras funciones añadidas permiten instalar phpmyadmin,
#así como habilitar un servidor básico de correo
#electrónico para que el servidor pueda enviar
#alertas por email a su administrador del sistema.

#----------------------------------------------------
#    FUNCIONES
#----------------------------------------------------

function menu()
{

    clear
    echo "*********** MENU SERVICIOS ***********"
    echo "*                     *"
    echo "*  1.- Iniciar asistente instalación *"
    echo "*  2.- Instalar Webmin               *"
    echo "*  3.- Instalar Php MyAdmin          *"
    echo "*  4.- Alertas por email             *"
    echo "*  5.- Salir                         *"
    echo "*                     *"
    echo "**************************************"

}

function asistente()
{

    which tasksel > /dev/null 2>&1
    if [ $? -ne 0 ]
    then   
        echo "Inicializando asistente, un momento por favor..."
        apt-get install -y tasksel #> /dev/null 2>&1
        if [ $? -ne 0 ]
        then
            echo "Error, no puede ejecutarse Tasksel."
            read -p "Pulse una tecla para finalizar."
            exit 1
        fi   
    fi
    tasksel

    #Instalaremos lo que necesitemos a través de esta
    #herramienta.

}

function phpmyadmin()
{

    which phpmyadmin > /dev/null 2>&1
    if [ $? -ne 0 ]
    then   
        echo "Instalando phpmyadmin, un momento por favor..."
        apt-get install -y phpmyadmin #> /dev/null 2>&1
        if [ $? -ne 0 ]
        then
            echo "Error, no puede ejecutarse phpmyadmin."
            read -p "Pulse una tecla para finalizar."
            exit 1
        fi   
    fi
    #Abrimos phpmyadmin para que el usuario empiece a usarlo
    firefox http://localhost/phpmyadmin

}

function webmin()
{
    #Llamamos al script de instalación de webmin
    ./instalawebmin.sh
}

function alertasemail()
{
    which ssmtp > /dev/null 2>&1
    if [ $? -ne 0 ]
    then   
        echo "Instalando ssmtp, un momento por favor..."
        apt-get install -y ssmtp #> /dev/null 2>&1
        if [ $? -ne 0 ]
        then
            echo "Error, no puede ejecutarse ssmtp."
            read -p "Pulse una tecla para finalizar."
            exit 1
        fi   
    fi

   
    read -p "Indica la dirección de destino de las alertas: " email_alertas

    if [ -f /etc/ssmtp/ssmtp.conf ]
    then
        #sacamos copia seguridad
        if [ -f /etc/ssmtp/ssmtp_old.conf ]
        then
            echo "no se sacará copia de ssmtp.conf"
        else
            cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp_old.conf
            read -p "Indica la dirección de email del servidor(sin @gmail.com): " email_servidor
            #Solicitamos contraseña de manera oculta
            echo "Indica la constraseña de la cuenta: "   
            read -s clave
        fi
        #comprobación errores?


        #Volcamos aquí toda la configuración a
        #los dos archivos de configuración de ssmtp
        echo -e "root=$email_servidor@gmail.com \n
mailhub=smtp.gmail.com:587 \n
#rewriteDomain= \n
hostname=$email_servidor \n
AuthUser=$email_servidor@gmail.com \n
AuthPass=$clave \n
FromLineOverride=YES \n
UseSTARTTLS=YES" > /etc/ssmtp/ssmtp.conf
       
    else

        echo "Error al intentar configurar ssmtp: ssmtp.conf."
        exit 1
    fi

    if [ -f /etc/ssmtp/revaliases ]
    then
        #sacamos copia seguridad
        if [ -f /etc/ssmtp/revaliases_old ]
        then
            echo "no se sacará copia de ssmtp.conf"
        else
            cp /etc/ssmtp/revaliases /etc/ssmtp/revaliases_old
        fi
       
        #Modificamos ahora el archivo
        echo "root:$email_servidor@gmail.com:smtp.gmail.com:587" >> /etc/ssmtp/revaliases
        #el nombre de usuario debe de ser uno con privilegios de
        #administrador
        echo "alumno:$email_servidor@gmail.com:smtp.gmail.com:587" >> /etc/ssmtp/revaliases
    else
        echo "Error al intentar configurar ssmtp: revaliases.conf"
        exit 1
    fi
   
    #Enviamos un email de confirmación
    ssmtp $email_alertas < correo.txt

    
    #Donde correo.txt debe tener el formato
    #from: origen del mensaje
    #subject: asunto del mensaje
    #texto del mensaje que se quiere enviar

}




#----------------------------------------------------
#    PROGRAMA PRINCIPAL
#----------------------------------------------------


menu
opcion=""
while [ "$opcion" == "" ]
do
    read -p "Introduce la opción elegida: " opcion
    case $opcion in
        1)asistente;read;;
        2)echo "Instalando Webmin...";webmin;;
        3)echo "Instalando Php MyAdmin";phpmyadmin;;
        4)echo "Alertas por email";alertasemail;;
        5)echo "Finalizando script";exit 0;;
        *)echo "Opción no válida";opcion="";;
    esac
    menu   
    opcion=""
   
done

 El correo electrónico que se ha de generar en el archivo correo.txt que se ha de enviar en la función de "alertasemail" tendría la siguiente forma:

from: servidor que envía la alerta
subject: asunto de la alerta
Este es un correo de confirmación de la correcta instalación y configuración del servicio de alertas por correo electrónico.

sábado, 1 de febrero de 2014

"Despechejando" un Servidor

Aquí os dejo un video demostrativo de cómo dos técnicos de DELL despellejan y destripan uno de sus nuevos servidores. Nos cuentan sus bondades y características más relevantes. Pero lo más importante para nosotros como Administradores de Sistemas, es comprender cómo se organizan este tipo de servidores de alta gama.

Más información en este enlace.