jueves, 30 de enero de 2014

Asistente Jarvis (Shell Script)


En este script podemos ver cómo integrar un software de sintetización de voz y hacer que reproduzca lo que deseemos. Se trata de un asistente que emite a través del comando espeak todo aquel texto que se le pase como parámetro. Según vamos escribiendo el asistente lo va emitiendo a través del sistema de audio del equipo. Es un ejercicio sencillo que puede servirnos para practicar el uso de parámetros.




#!/bin/bash

#Asistente Jarvis
clear


#Preconfiguramos el tono, velocidad y demás elementos 
#relacionados con el comando espeak, para que la voz de nuestro
#asistente se entienda adecuadamente.
 

parametros="-v es -s 150 -p45"
 


echo "ASISTENTE DE CONVERSACIÓN: JARVIS"
mensaje_bienvenida="Bienvenido al asistente de conversación digital: Jarvis"
 

espeak $parametros "$mensaje_bienvenida" 2>/dev/null
 

frase="Escribe tus mensajes a continuación"
 

espeak $parametros "$frase" 2>/dev/null

#Preparamos un bucle infinito que solicitará 
#contínuamente la introducción de cualquier texto
#para que sea reproducido. Podremos parar con Ctrl+C 
#La salida del programa debería mejorarse.

while [ 1 ]
do   
   
    read -p "Texto a emitir (* para salir): " texto

    if [ "$texto" == "*" ]
    then
         break
    else
         espeak $parametros "$texto" 2>/dev/null

    fi   
done
echo "Gracias por utilizar este software"

espeak $parametros "Gracias por utilizar este software"

exit 0

miércoles, 29 de enero de 2014

Script para automatizar la instalación de Webmin

A continuación os propongo un Shell Script que automatiza la instalación de Webmin para Linux en su versión 1.670. Webmin permite, entre otras cosas: gestionar múltiples servicios de un servidor, modificar la configuración del sistema y otras muchas utilidades que a un administrador de sistemas le pueden facilitar el trabajo diario con sus servidores Linux.

La mayor ventaja es que Webmin permite todas estas acciones a través de un navegador web, concretamente con la utilización del puerto 10000.

Pues bien, este código fuente intenta comprobar la existencia de Webmin en el servidor, si existe lo actualiza y si no existe procede a su descarga e instalación. Finalmente, se eliminan los archivos temporales utilizados.

Es interesante observar que los mensajes al usuario que el propio script muestra en pantalla, han sido destacados mediante letra en negrita. Esto se consigue utilizando unos patrones para el formateo del texto emitido con la orden echo. Aquí teneis un enlace para tener más información sobre Colores en Shell Scripts.

#!/bin/bash

#Script que automatiza la instalación de webmin en su versión 1.670
#Creación: 29/01/2014

#Variables para poner letra en negrita
abrenegrita="\033[1m"
cierranegrita="\033[0m"


if [ $LOGNAME != "root" ]
then
    echo -e "$abrenegrita Lo siento, este script requiere ejecutarse con privilegios de root. $cierranegrita"
    read
    exit 1
fi

#Comprobamos si Webmin está instalado
if [ -f /etc/init.d/webmin ]
then
    echo -e "$abrenegrita Webmin se encuentra instalado en su sistema. $cierranegrita"
    version=`cat /etc/webmin/version`   
    echo -e "$abrenegrita Versión actual: $version $cierranegrita "
else
    echo -e "$abrenegrita Webmin no se encuentra instalado en su sistema, procediendo a la instalación... $cierranegrita"
fi


#Comprobamos si está instalado aptitude
which aptitude > /dev/null
if [ $? -ne 0 ]
then
    apt-get install aptitude   
fi

#Instalamos los paquetes previos necesarios para Webmin
aptitude install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions
if [ $? -eq 0 ]
then
    echo -e "$abrenegrita Instalación satisfactoria de paquetes adicionales necesarios para webmin.$cierranegrita"
else
    echo -e "$abrenegrita Error en la instalación de paquetes necesarios para webmin.$cierranegrita"
    echo -e "$abrenegrita El script se cerrará.$cierranegrita"
    read
    exit 1
fi

#Descargamos en la carpeta tmp el paquete deb de instalación de webmin
#para ello creamos una carpeta específica

if [ -d /tmp/descarga_webmin ]
then
    echo -e "$abrenegrita Descargando...$cierranegrita"
else
    mkdir /tmp/descarga_webmin
fi

if [ $? -eq 0 ]
then
    cd /tmp/descarga_webmin
    #nos posicionamos en la nueva carpeta temporal y descargamos webmin
    wget http://prdownloads.sourceforge.net/webadmin/webmin_1.670_all.deb   
else
    echo -e "$abrenegrita Error en la descarga del paquete .deb de webmin.$cierranegrita"
    echo -e "$abrenegrita El script se cerrará.$cierranegrita"
    read
    exit 1
fi

if [ -f /tmp/descarga_webmin/webmin_1.670_all.deb ]
then
    echo -e "$abrenegrita El paquete webmin en su versión 1.670 existe, instalando...$cierranegrita"
    dpkg -i webmin_1.670_all.deb
    if [ $? -eq 0 ]
    then
        echo -e "$abrenegrita Instalación satisfactoria, pulsa una tecla para comprobar...$cierranegrita"
        firefox -new-window https://localhost:10000
    else
        echo -e "$abrenegrita Error al instalar webmin.$cierranegrita"
        echo -e "$abrenegrita El script se cerrará.$cierranegrita"
        read
        exit 1
    fi
else
    echo -e "$abrenegrita El paquete .deb no se encuentra en la ubicación predeterminada.$cierranegrita"
    echo -e "$abrenegrita Imposible instalar webmin.$cierranegrita"
    echo -e "$abrenegrita El script se cerrará.$cierranegrita"
    read
    exit 1
fi

#Eliminamos la carpeta temporal y el archivo descargado
respuesta=""

while [ "$respuesta" == "" ]
do
    read -p "¿Desea eliminar los archivos temporales utilizados en la instalación? (S/N)" respuesta
    case $respuesta in
        s|S) rm -r /tmp/descarga_webmin;break;;   
        n|N) echo "Ok, se mantendrán en /temp/descarga_webmin";break;;
        *)echo "No ha introducido una respuesta válida";;
    esac
done

echo -e "$abrenegrita Fin del Script. $cierranegrita"
read -p "Pulse una tecla."
exit 0

lunes, 27 de enero de 2014

Script para configuración de IP estática

El siguiente código fuente corresponde a un script cuyo objetivo es permitir la configuración de una única interfaz de red en una máquina Linux.

Hay que decir que el script no ha sido completado ya que se utilizó para comenzar las explicaciones relacionadas con la configuración de red de máquinas Linux y recordatorio de shellscripts. Dada la posible complejidad que pudiera derivarse al intentar dotar a este script de capacidad para configurar más de un interfaz de red, se optó por hacerlo para una sola.

Debemos tener en cuenta que si estamos trabajando con cualquier distro cuya gestión de interfaces de red esta realizada a través de Network Manager, será necesario desactivar dicho sistema de gestión.

Para ello bastaría con acceder al archivo de configuración de NetworkManager (/etc/NetworkManager/NetworkManager.conf) en la máquina en cuestión y poner a "false" la variable "managed". Si tienes alguna duda al respecto, te aconsejo que accedas al siguiente enlace: Desactivación de NetworkManager en Ubuntu.

Aquí teneis el código fuente:

#!/bin/bash

#Script que permite configurar de manera estática el direccionamiento IP
#de una tarjeta de red en una máquina Ubuntu Desktop 12.04.
#Para que los no nos afecte el gestor de red NetworkManager de Ubuntu
#deberemos desactivarlo. Accederemos a /etc/NetworkManager/NetworkManager.conf
#lo editaremos y modificaremos la variable "managed" poniéndola a false.

#los archivos a tener en cuenta en este script serían:
#a) Configuración IP: /etc/network/interfaces
#b) Resolución de nombres WAN: /etc/resolv.conf
#c) Resolución de nombre LAN: /etc/hosts (opcional)

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

function titulo()
{
    clear
    echo "****************************************************"
    echo "*   CONFIGURADOR DE DIRECCIONAMIENTO IP ESTÁTICO   *"
    echo "****************************************************"
}

function copiaseg()
{
          
    echo "Realizando copias de seguridad..."
   
    if [ -f /etc/network/interfaces ]
    then
        cp /etc/network/interfaces /etc/network/interfaces.original
        if [ $? -eq 0 ]
        then
            echo "El archivo interfaces ha sido salvaguardado con éxito."
        else
            echo "Error al salvaguardar el archivo interfaces."
        fi
    fi

    if [ -f /etc/resolv.conf ]
    then
        cp /etc/resolv.conf /etc/resolv_original.conf
        if [ $? -eq 0 ]
        then
            echo "El archivo resolv.conf ha sido salvaguardado con éxito."
        else
            echo "Error al salvaguardar el archivo resolv.conf."
        fi
    fi
   
}


function grabar_configuracion()
{

    echo "----------------------------------------------------"
    echo "La nueva configuración de red introducida es: "
    echo "Interfaz: $1"
    echo "Dirección IP: $2"
    echo "Máscara de red: $3"
    echo "Puerta de enlace / Gateway: $4"
    echo "DNS 1º: $5"
    echo "DNS 2º: $6"
    echo "----------------------------------------------------"

    # A partir de aquí abría que reescribir completos los archivos    
    # de configuración interfaces y resolv.conf
   
   
    #Modificación de /etc/network/interfaces
    interfaces="/etc/network/interfaces"
    echo "auto lo" > $interfaces
    echo "iface lo inet loopback" >> $interfaces
    echo "auto $1" >> $interfaces
    echo "iface $1 inet static" >> $interfaces
    echo "address $2" >> $interfaces
    echo "mask $3" >> $interfaces
    echo "gateway $4" >> $interfaces

    #Modificación de /etc/resolv.conf
    resolv="/etc/resolv.conf"   
    echo "#Generado por script configuraip.sh" > $resolv
    echo "nameserver $5" >> $resolv
    echo "nameserver $6" >> $resolv

    #reiniciamos los servicios de red para
    #que la nueva configuración tenga efecto
    /etc/init.d/networking restart

}



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

titulo

if [ $LOGNAME != "root" ]
then
    read -p "Lo siento, este script debe ser ejecutado con privilegios de root."
    exit 1   
fi

#Mostramos los interfaces de red
titulo
echo "Mostrando interfaces de red actuales..."
for nic in `lshw -short -class network | grep eth | tr -s " " | cut -f2 -d" " `
do
    echo "* Interfaz: $nic"
done
echo "-----------------------------------------------------"

nic_elegida=""
while [ "$nic_elegida" == "" ]
do
    read -p "Elige la interfaz que deseas configurar: " nic_elegida
done

nic_valida=1
for nic in `lshw -short -class network | grep eth | tr -s " " | cut -f2 -d" " `
do
    if [ $nic == $nic_elegida ]
    then
        nic_valida=0
    fi
done

if [ $nic_valida -ne 0 ]
then
    echo "Error, la interfaz $nic_elegida no es válida."
    read -p "Pulsa una tecla para cerrar el script..."
    exit 1
fi


echo "La interfaz elegida es: $nic_elegida"
read -p "Introduce la nueva dirección ip estática: " ip
read -p "Introduce la nueva máscara de red: " mascara
read -p "Introduce la puerta de enlace: " puerta
read -p "Introduce el DNS 1º: " dns1
read -p "Introduce el DNS 2º: " dns2
echo
read -p "Pulse una tecla para continuar."
titulo

respuesta=""
while [ "$respuesta" == "" ]
do
    read -p "Desea grabar estos datos de configuración (S/N): " respuesta
    case $respuesta in
        s|S)copiaseg; grabar_configuracion $nic_elegida $ip $mascara $puerta $dns1 $dns2;            break;;
        n|N)echo "Ok, no se modificarán los archivos de configuración"; read; break;;
        *) echo "No ha introducido una respuesta válida, vuelva a intentarlo.";;
    esac
done

echo "Fin del script."
read
exit 0