Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

lunes, 17 de febrero de 2014

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

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

miércoles, 13 de febrero de 2013

Tweets desde consola de comandos Linux (twidge y TTYtter)


Twidge y TTYtter son dos alternativas muy útiles para enviar tweets desde la terminal de comandos.

En un post anterior os ofrecía una guía para poder enviar correos electrónicos desde la consola de comandos de GNU/Linux (Ubuntu). Concretamente a través del servidor ssmtp. En esta ocasión vamos a ver qué tenemos que hacer para poder enviar Tweets desde una Shell.

El objetivo del envío de estos Tweets es recopilar en un hastag mensajes de monitorización de los servidores que pudiera tener a su cargo un administrador de sistemas. Estos Tweets, al ser cortos y muy concretos en su información, pueden ofrecer una visión rápida del estado de los servidores o alertas que tengamos configuradas en ellos.

Manos a la obra. La primera herramienta que vamos a utilizar se denomina Twidge y para instalarla/configurarla haremos lo siguiente:

1) Actualiza tu sistema Ubuntu mediante un: 
sudo apt-get update

2) Realiza la instalación de Twidge:
sudo apt-get install twidge

3) Una vez instalado, debemos proceder con la configuración básica de Twidge:
sudo twidge setup

Al lanzar este comando, se nos mostrará en pantalla una URL que deberemos copiar y pegar en nuestro navegador web. Seguidamente, el programa de configuración de Twidge queda a la espera de la introducción de un código numérico.

Este código numérico lo obtendremos siguiendo las indicaciones que se marcan en la URL indicada anteriormente. Una vez en la página correspondiente a dicha dirección, deberemos hacer un login con nuestro usuario y contraseña de Twitter para autorizar a Twidge el uso de dicha cuenta, de cara al envío de Tweets. Después de hacer login, se mostrará el código numérico que debemos ingresar en la línea de comandos, para finalizar correctamente la instalación de Twidge.

Ya estaríamos preparados para empezar a enviar Tweets a través de consola. Para ello utilizaríamos el siguiente formato:

twidge update 'Texto a enviar - máximo 140 caracteres'

Si necesitamos obtener algo más de información sobre las opciones de twidge podemos teclear:

man twidge
twidge lscommands

Por cierto, es muy recomendable que accedas a tu cuenta en Twitter y edites las preferencias de tu cuenta para modificar la seguridad de tus envíos y la forma en la que pueden seguir tus Tweets el resto de usuarios de Twitter, tú mismo.

Ahora ya solo quedaría generar Shell Scripts en GNU/Linux que sean capaces de recopilar información interesante para un administrador de sistemas y enviarla vía Twitter a tu cuenta para mantenerte informado al momento. Espero que en próximas entregas podamos ver el código fuente de algún script que haga algo relacionado.

En segundo lugar, analizaremos el uso alternativo de TTytter, ya que es posible que al intentar enviar los tweets con twidge en Ubuntu 12 os genere algún error 410 de usuario no autorizado. Este error se produce por una modificación que se realizó en la API de twitter y que dejó a twidge fuera de combate, si lo quieres ejecutar en un Ubuntu 12. Para resolver esto tendreis que seguir el siguiente enlace y realizar los pasos que os indica: Instalación y configuración de TTYtter para envío de tweets bajo terminal de comandos mediante TTYtter. Otros enlaces relacionados que pueden ser interesantes son estos: posible alternativa a twidge, TTYtter.

Yo he probado TTYtter desde consola de comandos y ha bastado con escribir esto en la terminal para recibir correctamente los tweets.

ttytter -status="Este es un mensaje de prueba desde TTYtter"
(Ojo, primero debes autorizar a TTYtter, pero esto lo podeis hacer desde el enlace que os he pasado más arriba.)

viernes, 29 de junio de 2012

Cómo instalar Pandora FMS y Cacti

Una de las acciones más interesantes que podemos llevar a cabo sobre nuestros servidores o sobre una granja de servidores es su monitorización. Para ello, podemos emplear diferentes herramientas existentes como Nagios, Cacti o Pandora FMS entre otros.

En el siguiente vídeo puedes acceder a un videotutorial sobre "Cómo instalar Pandora FMS" realizado por nuestro alumno Juan Antonio Pardo de 2º ASIR del IES Oretania de Linares (Jaén) durante el curso 2011/2012 en el módulo profesional de Administración de Sistemas Operativos.


En este otro videotutorial se muestran los pasos básicos para realizar la instalación del software Cacti, empleado también para monitorización y análisis de datos en servidores y sistemas de comunicaciones en red. Este video ha sido realizado por nuestro alumno Jesús Momblant Quílez de 2º ASIR en el módulo profesional de Administración de Sistemas Operativos durante el curso 2011/2012


jueves, 21 de junio de 2012

Inventario automático de Equipamientos Informáticos

Estaba buscando software libre para llevar a cabo el inventario del equipamiento informático de nuestro departamento bajo Linux y he encontrado dos joyas GLPI y OCS Inventory, ambos software libre que permiten inventariar equipos Linux, Windows, impresoras, ...



Si sigues esta guía sobre cómo integrar GLPI y OCS Inventory paso a paso podrás montar un sistema bastante completo para ello. Repito, paso a paso, que se puede complicar en su desarrollo.

Ten cuidado cuando instales el OCSinventory Agent bajo Windows XP, ya que en el asistente se te preguntará cuál es la URL de tu servidor. Puedes indicarlo con un nombre de dominio o con IP, yo lo hice con http://xxx.xxx.xxx.xxx/ocsinventory  donde xxx.xxx.xxx.xxx es la IP de tu servidor. Aún así puedes echarle un vistazo a este enlace sobre OCS Inventory en el que encontrarás cómo configurar los agentes y la utilización general de estos programas.

Aquí os dejo algunos enlaces importantes para lograr echar a andar esta pareja:

Por cierto, en la web de OCS Inventory, en la sección de descargas teneis máquinas virtuales ya preconfiguradas para que las bajeis y las echeis a andar directamente sin necesidad de llevar a cabo toda la instalación. Yo soy mas partidario de hacerlo desde cero, pero si te ves apurado siempre es una ayuda tirar de una máquina ya preconfigurada. Vosotros mismos.

lunes, 18 de junio de 2012

Un examen completo: gestion de usuarios, grupos, servicios, aplicaciones, ...

A continuación se muestra el enunciado y posible solución para una convocatoria de examen sobre scripts Linux.


ENUNCIADO DEL PROBLEMA


GESTIÓN DE SERVIDORES DE AULA

Para la realización de este script el alumnado debe tener en cuenta las siguientes cuestiones:
  • Se deben utilizar funciones.
  • Todas las peticiones de introducción de datos por teclado deben ser filtradas correctamente.
  • Los comentarios a lo largo del código fuente serán valorados positivamente.
  • El orden del código fuente, tabulaciones y estructura del programa se tendrán muy en cuenta.
  • Se prestará especial atención al funcionamiento y sintaxis de las estructuras condicionales, condicionales múltiples, bucles, etc.

Una vez descritos los requisitos generales que el script debe cumplir, se detalla a continuación el enunciado a resolver.

Función para crear un archivo “log” (4 puntos):
Realiza una función que cree en la carpeta del programa una carpeta llamada “log”. Se ha de comprobar si la carpeta ya existía. Si es así, no se borrará. Si no existía, se creará y se comprobará su correcta creación. Seguidamente, se comprobará si existía un archivo en dicha carpeta llamado “log.txt”. Si es así, no se modificará nada y si no existía, se creará conteniendo en su interior la siguiente cabecera:

REGISTRO DE OPERACIONES REALIZADAS
Programa: <nombre del script>
Alumno/a: <nombre del alumno/a>
Curso: <curso>
2011/2012
Función para escribir en archivo “log” (4 puntos):
Realiza una función genérica para registrar en el archivo “log” del programa, todas aquellas acciones que el enunciado indique que han de anotarse. Para ello, se ha de tener en cuenta la fecha y hora en la que se realiza la anotación, así como la operación realizada. Esta función debe recibir como parámetro la cadena de texto que se quiere escribir en el archivo “log” del programa.

Nota: Si la función se denomina registrar_en_log y queremos escribir en el archivo el mensaje “El usuario Antonio ha sido creado con éxito”, dentro de la función debemos utilizar $1 que representará el parámetro que recibirá la cadena de caracteres. Cuando vayamos a realizar la llamada a la función en nuestro programa principal o desde otra función, tendremos que escribir:
registrar_en_log “El usuario Antonio ha sido creado con éxito”.

De este modo, podremos utilizar esta función genérica desde cualquier parte de nuestro script para insertar las anotaciones que sean necesarias.

Función para instalación de aplicaciones (3 puntos):
Realiza una función genérica que sirva para realizar la instalación de aplicaciones. Se debe solicitar al usuario que introduzca por teclado el nombre de la aplicación a instalar. Antes de intentar instalarla, el programa debe comprobar si esta aplicación ya está instalada en el sistema. Si lo está, se comunicará al usuario. Si no lo está, se lanzará una orden de instalación y se comprobará el resultado de ésta informando al usuario. Para cada acción realizada se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para desinstalación de aplicaciones (3 puntos):
Realiza una función genérica que sirva para realizar la desinstalación de aplicaciones. Se debe solicitar al usuario que introduzca por teclado el nombre de la aplicación a desinstalar. Antes de intentar desinstalarla, el programa debe comprobar si esta aplicación ya está instalada en el sistema. Si lo está, se comunicará al usuario y se lanzará una orden de desinstalación, se comprobará el resultado de ésta informando al usuario. Si la aplicación no está instalada, se informará al usuario. . Para cada acción realizada se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para el chequeo del estado de todos los servicios (2 puntos):
Realiza una función que muestre por pantalla el estado actual de todos los servicios del sistema.

Función para la activación, desactivación o reinicio de servicios (2 puntos):
Realiza una función que solicite al usuario el nombre de un servicio. El script debe comprobar el estado del servicio y mostrarlo por pantalla. Una vez hecho esto, se ha de preguntar al usuario si quiere iniciarlo, pararlo o reiniciarlo. En función de la respuesta, se llevará a cabo dicha acción. Para cada acción que se realice, se debe llevar a cabo una anotación en el archivo “log” del programa.

Función para la preparación del aula (6 puntos):
Realiza una función genérica que sirva para la preparación de un aula. Esta función deberá funcionar como un “asistente” llevando a cabo su trabajo a través de varias preguntas:
  1. Primer paso: Se solicitará al usuario que introduzca el nombre del aula, una vez introducido se comprobará si el aula existe como grupo dentro del sistema. Si no está creado dicho grupo, se creará.
  2. Segundo paso: Se creará en la carpeta del script, una carpeta con el mismo nombre que la del aula.
  3. Tercer paso: Se solicitará al usuario que introduzca el nombre de usuario del profesor. Se ha de comprobar si este usuario existe en el sistema, si no se creará y se integrará en el grupo del aula. Se establecerá su home en el interior de la carpeta correspondiente al aula.
  4. Cuarto paso: Se solicitará al usuario que introduzca el número de usuarios que forman el aula. Se dará de alta a tantos usuarios como se haya indicado, integrando a cada uno de ellos en el grupo del aula. Se establecerá su home en el interior de la carpeta correspondiente al aula. Para cada usuario a crear, se deben realizar las comprobaciones previas necesarias.

Para cada uno de los pasos, se ha de realizar una anotación en el archivo “log” del programa. Estas anotaciones deben realizarse tanto si el aula, profesor o usuarios son creados satisfactoriamente, como si no es así.

Función para mostrar el estado de particiones del servidor (2 puntos):
Realiza una función que muestre por pantalla el estado actual de todas las particiones del sistema, su tamaño, porcentaje de utilización, etc.

Programa principal (2 puntos):

Construye el programa principal que debe crear en primer lugar el archivo “log” del programa. Una vez realizada esta acción, se mostrará por pantalla el siguiente menú de opciones:

1)       Instalar aplicaciones
2)       Desinstalar aplicaciones
3)       Visualizar estado de servicios
4)       Gestionar un servicio
5)       Preparación del aula
6)       Visualizar estado almacenamiento
7)       Visualizar log de operaciones
8)       Salir

Tanto el menú, como las distintas opciones deben gestionarse a través de las estructuras de control adecuadas.




CÓDIGO FUENTE DE UNA POSIBLE SOLUCIÓN

#!/bin/bash

# Función para crear un archivo log
function crea_log()
{
    if [ -d /home/$USERNAME/finalsor/log ]
    then
        echo "La carpeta que alojará el log del programa ya existe, no se creará"
    else
        echo "Creando carpeta para alojar log"
        mkdir /home/$USERNAME/finalsor/log
        if [ $? -ne 0 ]
        then
            echo "Error al crear la carpeta para alojar log"
        else
            echo "Carpeta para alojar log creada con éxito"
        fi
    fi

    echo "Comprobando la existencia de un archivo log..."

    if [ -f /home/$USERNAME/finalsor/log/log.txt ]
    then
        echo "Ya existe un archivo log, no se creará"
    else
        echo "No existe un archivo log, procediendo a su creación..."      
        touch /home/$USERNAME/finalsor/log/log.txt
        if [ -f /home/$USERNAME/finalsor/log/log.txt ]
        then
            echo "Archivo log creado con éxito"
            echo "Insertando cabecera..."
            echo "###################################" >> /home/$USERNAME/finalsor/log/log.txt
            echo "REGISTRO DE OPERACIONES REALIZADAS" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Programa: finalsor.sh" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Alumno/a: profesor" >> /home/$USERNAME/finalsor/log/log.txt
            echo "Curso: 2ºSMR" >> /home/$USERNAME/finalsor/log/log.txt
            echo "2011/2012" >> /home/$USERNAME/finalsor/log/log.txt
            echo "###################################" >> /home/$USERNAME/finalsor/log/log.txt
        else
            echo "Error al crear el archivo log"
        fi
    fi

}

function escribe_en_log()
{
    #Función genérica que escribirá en el archivo log el mensaje que le pasemos como parámetro
    hora=`date +%T`
    fecha=`date +%d/%m/%Y`
    #echo "El mensaje a registrar en el log es: " $1
    #echo "Insertando mensaje en log..."
    echo $fecha" "$hora".............."$1 >> /home/$USERNAME/finalsor/log/log.txt
    if [ $? -eq 0 ]
    then
        echo "Inserción en log realizada con éxito"
    else
        echo "Error al insertar en el log"
    fi
}

function instala()
{
          # Función para instalación de aplicaciones
    echo "INSTALACIÓN DE APLICACIONES"
    while [ -z $programa ]
    do
        read -p "Introduce el nombre de la aplicación a instalar: " programa
    done
    which $programa > /dev/null
    if [ $? -eq 0 ]
    then
        echo "La aplicación: $programa ya está instalada en su sistema"
    else
        echo "La aplicación: $programa no se encuentra instalada, procediendo..."
        sudo apt-get install $programa
        if [ $? -eq 0 ]
        then
            echo "Instalación satisfactoria"
            escribe_en_log "Aplicación: $programa - Éxito en la instalación"
        else
            echo "Error al instalar"
            escribe_en_log "Aplicación: $programa - Error durante la instalación"
        fi
    fi

}

function desinstala()
{
    echo "DESINSTALACIÓN DE APLICACIONES"
    while [ -z $programades ]
    do
        read -p "Introduce el nombre de la aplicación a desinstalar: " programades
    done  
    which $programades > /dev/null
    if [ $? -eq 0 ]
    then
        echo "La aplicación: $programades se encuentra instalada en su sistema, procediendo a su desinstalación..."
        sudo apt-get remove $programades --purge
        if [ $? -eq 0 ]
        then
            echo "Desinstalación satisfactoria"
            escribe_en_log "Aplicación: $programades - Éxito al desinstalar"
        else
            echo "Error al desinstalar"
            escribe_en_log "Aplicación: $programades - Error durante la desinstalación"
        fi
    else
        echo "La aplicación: $programades no se encuentra instalada, no se puede desinstalar"
      
    fi
}

function estado_servicios()
{
    clear
    echo "VISUALIZACIÓN DE ESTADO DE SERVICIOS DEL SERVIDOR"
    service --status-all | more
    read -p "Pulse una tecla para continuar"
}

function gestiona_servicio()
{
    clear
    echo "GESTIÓN DE SERVICIO"
    servicio=""
    while [ -z $servicio ]
    do
        read -p "Introduzca el nombre del servicio a gestionar: " servicio
    done
    echo "El servicio introducido es: " $servicio
    which $servicio  > /dev/null 2>/dev/null
    if [ $? -eq 0 ]
    then
        echo "Estado del servicio $servicio: "
        service $servicio status
        echo "Pulse 1 para detener, 2 para iniciar, 3 para reiniciar"
        operacion=""       
        while [ -z $operacion ]
        do
            read -p "operación: " operacion
        done
       
       
            case $operacion in
                1) echo "Deteniendo servicio: $servicio";
                   sudo service $servicio stop;
                   escribe_en_log "Servicio: $servicio detenido";
                   read -p "Pulse una tecla para continuar";;
   
                2) echo "Iniciando servicio: $servicio";
                               sudo service $servicio start;
                   escribe_en_log "Servicio: $servicio iniciado";
                   read -p "Pulse una tecla para continuar";;
           
                3) echo "Reiniciando servicio: $servicio";
                               sudo service $servicio restart;
                   escribe_en_log "Servicio: $servicio reiniciado";
                   read -p "Pulse una tecla para continuar";;

                *) echo "Opción no válida";

                   read -p "Pulse una tecla para continuar";;
            esac
           
    else
        echo "El servicio: $servicio, no se encuentra disponible"
        read -p "Pulse una tecla para continuar"
    fi
}

function prepara_aula()
{
    clear
    echo "PREPARACIÓN DE AULA"
    aula=""   
    while [ -z $aula ]
    do
        read -p "Introduzca el nombre del aula: " aula
    done
   
    cat /etc/group | grep -w $aula > /dev/null
    if [ $? -eq 0 ]
    then
        echo "El grupo: $aula existe en el sistema, no se creará"
    else
        echo "El grupo: $aula no existe en el sistema, creando..."
        sudo addgroup $aula
        if [ $? -eq 0 ]
        then
            echo "Grupo: $aula creado con éxito"
            escribe_en_log "Grupo: $aula - Éxito al crear"
        else
            echo "Grupo: $aula no creado"
            escribe_en_log "Grupo: $aula - Error al crear"
        fi
    fi


    if [ -d /home/$USERNAME/finalsor/$aula ]

    then
        echo "La carpeta del aula: $aula existe en el sistema"
    else
        echo "Creando ahora la carpeta del aula: $aula..."
        mkdir /home/$USERNAME/finalsor/$aula       
        if [ $? -eq 0 ]
        then
            echo "Éxito al crear la carpeta del aula: $aula"
            escribe_en_log "Carpeta:$aula - Éxito al crear"
        else
            echo "Error al crear la carpeta del aula:$aula"
            escribe_en_log "Carpeta:$aula - Error al crear"
        fi
    fi

    echo "PROFESOR DEL AULA"   

    echo "Creando el usuario del profesor del aula: $aula"
    profesor=""
    while [ -z $profesor ]
    do
        read -p "Introduzca el nombre de usuario del profesor: " profesor
    done
   
    cat /etc/passwd | grep -w $profesor > /dev/null
    if [ $? -eq 0 ]
    then
        echo "El usuario: $profesor del profesor ya existe en el sistema, no se creará"
    else
        echo "El usuario $profesor no existe, creando..."
        sudo adduser --home /home/$USERNAME/finalsor/$aula/$profesor $profesor
        if [ $? -eq 0 ]
        then
            echo "Usuario: $profesor creado con éxito"
            escribe_en_log "Usuario: $profesor - Éxito al crear"
        else
            echo "Usuario: $profesor creado sin éxito"
            escribe_en_log "Usuario: $profesor - Error al crear"
        fi
    fi
   
    echo "ALUMNOS DEL AULA"
    alumnos=""
    while [ -z $alumnos ]
    do
        read -p "Introduzca el número de alumnos del aula $aula: " alumnos
    done
    echo "Ha introducido: $alumnos"
    echo "Comienza la creación automática de los $alumnos alumnos..."
    for ((contador=1;contador<=$alumnos;contador++))
    do
        nombre_alumno=$aula"_alumno"$contador
        cat /etc/passwd | grep -w $nombre_alumno > /dev/null
         if [ $? -eq 0 ]
        then
            echo "El usuario: $nombre_alumno ya existe en el sistema, no se creará"
        else
            echo "El usuario $nombre_alumno no existe, creando..."
            sudo adduser --home /home/$USERNAME/finalsor/$aula/$nombre_alumno $nombre_alumno
            if [ $? -eq 0 ]
            then
                echo "Usuario: $nombre_alumno creado con éxito"
                escribe_en_log "Usuario: $nombre_alumno - Éxito al crear"
            else
                echo "Usuario: $nombre_alumno creado sin éxito"
                escribe_en_log "Usuario: $nombre_alumno - Error al crear"
            fi
        fi
    done   

}


#........................................................................................
# PROGRAMA PRINCIPAL
#........................................................................................
crea_log
opcion=9
while [ $opcion -ne 8 ]
do
    clear
    echo "******************************************"
    echo "*      GESTIÓN DE SERVIDORES DE AULA     *"
    echo "******************************************"
    echo "* 1)Instalar aplicaciones                *"
    echo "* 2)Desinstalar aplicaciones             *"
    echo "* 3)Visualizar estado de servicios       *"
    echo "* 4)Gestionar servicio                   *"
    echo "* 5)Preparación del aula                 *"
    echo "* 6)Visualizar estado almacenamiento     *"
    echo "* 7)Visualizar log de operaciones        *"
    echo "* 8)Salir                                *"
    echo "******************************************"
    read -p "Introduzca una opción: " opcion
    echo "******************************************"
  

    case $opcion in

        1)instala;;
        2)desinstala;;
        3)estado_servicios;;
        4)gestiona_servicio;;  
        5)prepara_aula;;
        6)clear; echo "ESTADO DE ALMACENAMIENTO DEL SISTEMA"; df -h;read -p "Pulse una tecla para continuar";;
        7)clear; echo "VISUALIZANDO LOG DE OPERACIONES"; cat /home/$USERNAME/finalsor/log/log.txt;read -p "Pulse una tecla para continuar";;
        8)clear; echo "GRACIAS POR UTILIZAR ESTE SOFTWARE";exit 0;;
        *)clear; echo "Error, opción no válida. Inténtelo de nuevo";;
    esac
done