lunes, 3 de diciembre de 2012

Nuevo Canal Youtube IES Oretania

Ya está disponible el Canal Youtube del IES Oretania. En éste podreis encontrar todos los videotutoriales y material audivisual que el Dpto. de Informática y Comunicaciones, así como el alumnado de nuestros ciclos formativos de Informática, van creando y aportando a la red.

Ya hemos publicado los primeros videotutoriales creados por el alumnado de 2º Curso de SMR del curso 2012/2013. ¡Enhorabuena a los elegidos!



viernes, 30 de noviembre de 2012

Ejemplo Script Inicio de Sesión: Asegurando ntldr y ntdetect.com

Este es un script sencillo que podríamos colocar como script de inicio de sesión para un administrador de un sistema Windows Server 2003. Se trata de un archivo Batch que realiza una copia de respaldo de un par de archivos vitales para que Windows Server 2003 pueda arrancar después de un fallo del tipo "Error, falta archivo ntldr". En concreto se respaldan los archivos ntldr y ntdetect.com (aunque existen algunos más, que son vitales y que podríamos incluir en esta copia).

De este modo, si perdiéramos alguno de estos ficheros por un borrado accidental, algún software malintencionado o un deterioro de los mismos, no sería necesario (a priori) recuperar la máquina Windows Server 2003 a través de la utilización de un LiveCD de Linux. Sólo con entrar con la consola del DOS al sistema, bastaría con volver a copiar a la raíz del disco que contenía el sistema operativo, los archivos que se encontraran en la carpeta de seguridad creada por este script.

Es un script muy básico y totalmente mejorable, pero como ejercicio de clase para repaso de comandos y estructuras de control de archivos Batch, ha sido muy útil. 

@ECHO OFF
REM Este archivo por lotes inserta anotaciones en un log. Primero creamos la carpeta SEGURIDAD directamente REM en la unidad C, aunque si existe no la creará y si no existe si lo hará.

REM Además se respaldan dos archivos del sistema
REM ntldr y ntdetect.com, guardándolos en la misma carpeta SEGURIDAD.



:INICIO
IF NOT EXIST c:\SEGURIDAD GOTO NOEXISTE
IF EXIST c:\SEGURIDAD GOTO SIEXISTE

:NOEXISTE
ECHO La carpetaSEGURIDAD no existe, creándola...
MKDIR C:\SEGURIDAD
IF ERRORLEVEL 1 GOTO ERROR1
GOTO SIEXISTE

:SIEXISTE
IF EXIST C:\SEGURIDAD\LOG.txt GOTO SIARCH
IF NOT EXIST C:\SEGURIDAD\LOG.txt GOTO NOARCH

:COPIAR

REM Antes de hacer la copia hay que desproteger ambos archivos
ATTRIB -H -S -R C:\NTLDR
ATTRIB -H -S -R C:\NTDETECT.COM
 

COPY C:\NTLDR C:\SEGURIDAD /Y
COPY C:\NTDETECT.COM C:\SEGURIDAD /Y
 

REM  Una vez copiados hay que volver a protegerlos!!
ATTRIB +H +S +R C:\NTLDR
ATTRIB +H +S +R C:\NTDETECT.COM
GOTO MOSTRAR

:SIARCH
ECHO %date% - %time% - Archivos vitales respaldados >> c:\SEGURIDAD\LOG.txt
GOTO COPIAR

:NOARCH
ECHO ARCHIVO LOG DE ANOTACIONES > c:\SEGURIDAD\LOG.txt
IF ERRORLEVEL 0 ECHO Ok, Archivo LOG.txt creado.
IF ERRORLEVEL 1 GOTO ERROR2
ECHO ************************** >> c:\SEGURIDAD\LOG.txt
ECHO %date% - %time% - Archivos vitales respaldados >> c:\SEGURIDAD\LOG.txt
GOTO COPIAR


:MOSTRAR
ECHO Mostrando el archivo LOG.txt
TYPE c:\SEGURIDAD\LOG.txt
ECHO ****************************
DIR C:\SEGURIDAD
PAUSE
GOTO FIN

:ERROR1
ECHO Error al crear la carpeta SEGURIDAD.
GOTO FIN

:ERROR2
ECHO Error al crear el archivo LOG.txt

:FIN
ECHO Fin del programa.
PAUSE > NUL
EXIT 0

martes, 13 de noviembre de 2012

DEATH STAR Y Windows Server


Una escena épica que tiene una gran relación con la última actividad práctica sobre Windows Server que hemos preparado para el 2º curso del Ciclo Medio de Sistemas Microinformáticos y Redes. Espero que os guste...
Última batalla para destruir la Estrella de la Muerte

miércoles, 7 de noviembre de 2012

Recomendaciones para creación de videotutoriales

Dado el gran potencial que la creación de videotutoriales tiene, en esta ocasión os ofrecemos una serie de recomendaciones que pueden ser muy útiles a la hora de planificar y elaborar productos audiovisuales de calidad. 

Estas recomendaciones son las que se les han facilitado a nuestro alumnado de Ciclos Formativos de Informática a la hora de completar las actividades en las que se les ha solicitado la creación de videotutoriales. Espero que os sean de utilidad.

  1.  Esta web de Cristalab da una muy buena visión inicial de cuestiones a tener en cuenta
  2.  Por otra parte, os indicamos otras recomendaciones de manera directa:
  • Familiarízate previamente con el software de edición/producción
  • Prepara un guión con las acciones que vas a realizar y con la información que vas a ofrecer (ya sea en audio o con subtítulos)
  • Antes de comenzar a grabar una acción, realízala una vez antes de proceder a grabarla. 
  • Entre acción y acción, puedes grabar tomas en las que expliques qué vas a hacer (con voz o subtítulos)
  • Si vas a grabar audio, hazlo por separado, ya que después podrás editar el vídeo o el audio más cómodamente. 
  • Utiliza un fondo de pantalla neutro en tu equipo físico y/o virtual, de esta manera tus acciones se verán más claras.
  • Se breve y sencillo, el videotutorial no debería exceder de 15 minutos aproximadamente, salvo que los procesos realizados así lo requieran.
  • Asegúrate de que todas las acciones y datos que vas a incluir en el tutorial son adecuados, correctos y legales.
  • Evita sobrecargar con efectos tus producciones y pon especial cuidado a la hora de incorporar audio (niveles de volumen diferentes en diferentes tomas o escenas hacen perder calidad a tu video).
  • Es muy importante controlar de manera adecuada tanto la ortografía como la gramática empleadas a la hora de incorporar textos en el producto final. (Faltas de ortografía o una construcción pobre en tus frases denotaría falta de rigor y profesionalidad).

Un candidato para nuestro nuevo Canal Youtube

El videotutorial que os ofrecemos a continuación es el primero de los productos audiovisuales elaborados por alumnado de 2º Curso del CFGM de Sistemas Microinformáticos y Redes del I.E.S. Oretania de Linares (Jaén) que ha sido seleccionado de entre aproximadamente 25 vídeos (muchos de muy buena calidad), para entrar a formar parte del nuevo Canal Youtube de los Ciclos de Informática de nuestro Centro.

Versa sobre la utilización de Terminal Server en Windows Server 2003 y esperamos que os pueda ser de utilidad. Enhorabuena a su autor.

 


lunes, 2 de julio de 2012

SpiceWorks inventarios en red


Siguiendo con los inventarios de equipamiento informático de organizaciones, me he topado en la red con SpiceWorks y parece que tiene una pinta muy buena. Os dejo aquí unos enlaces que pueden ser interesantes si quieres llevar a cabo inventarios de hardware y software de tu red, pero esta vez bajo Windows. Los programas GLPI y OCS Inventory que os comentaba en entradas anteriores los he montado bajo Linux (Ubuntu) y funcionan bastante bien, vamos a ver qué tal resulta SpiceWorks.

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

lunes, 11 de junio de 2012

Cambiando el hostname a través de un script

En esta ocasión vamos plantear una solución para un proyecto de arranque por red que tenemos entre manos. Se trata de hacer que un equipo cliente que solicita a un servidor una imagen arrancable de un sistema Linux, reciba esta imagen y que se asigne a sí mismo un nuevo nombre de host. El problema se planteaba cuando varias máquinas recibían la imágen y ésta traía preconfigurado un nombre estándar de host, ya que todas aquellas máquinas cliente que se iniciasen de este modo se llamarían exactamente igual en la red.

Para solucionarlo, se nos ocurre incrustar en la imagen que el servidor ofrece un script de arranque que lleve a cabo una modificación automática en el nombre del host, de tal forma que el nuevo nombre asignado sea totalmente diferente entre las diferentes máquinas que soliciten utilizar este servicio de arranque en red. Vamos a ver una posible solución:

#!/bin/bash

#Se analiza el valor de la variable HOSTNAME
#si no empieza por pc@ es que el nombre aún no ha sido
#actualizad al nuevo formato de nombres de hosts


echo $HOSTNAME | grep -w ^"pc@" > /dev/null
if [ $? -ne 0 ]
then
    #Generamos un código semialeatorio tomando los nanosegundos del sistema
    codigo=`date +%N`
         #Vamos a utilizar la cadena "pc@" para comenzar los nombres de nuestros equipos, esta cadena puede modificarse por la que se estime oportuna
    nombre_host="pc@"$codigo
    #Actualizamos la variable de entorno HOSTNAME       
    export HOSTNAME=$nombre_host
    #Actualizamos el contenido del archivo hostname
    echo $nombre_host > /etc/hostname
    if [ $? -ne 0 ]
    then
        echo "Error al reasignar nombre de host"
    fi
fi
  
El último if que comprueba $? podría eliminarse, ya que si buscamos que este script sea totalmente automático, no sería conveniente mostrar nada por pantalla. Hemos probado este script y cuando finaliza su ejecución el cambio de hostname se hace efectivo correctamente.

Podría ampliarse haciendo que se anote en un LOG alojado en el servidor cada nuevo nombre y su ip asociada. De este modo podríamos tener un registro de qué equipos de la red se han creado nuevos y su dirección.

Para hacer que este script se ejecute al inicio (lógicamente debe tener los permisos de ejecución adecuados y ser propiedad del root), debería colocarse en la carpeta /etc/init.d y crear un enlace a él desde las carpetas /etc/rc3.d o /etc/rc5.d, o cualquier otra asociada al nivel de ejecución de Linux donde queremos que el script se inicie.

Nota: existen algunos comandos que nos pueden generar los enlaces automáticamente. Un ejemplo puede ser el comando update-rc.d /etc/init.d/miscript defaults que podría funcionar para Ubuntu. (Asocia el script al boot de Ubuntu). Echale un vistazo a este enlace en el que puedes encontrar más información: asociar scripts a diferentes runlevels.

lunes, 21 de mayo de 2012

Un ejercicio de examen resuelto

En el siguiente script se ofrece la solución al siguiente enunciado de examen (Nivel: 2º de ciclo de grado medio en Sistemas Microinformáticos y Redes).

Enunciado:
Perteneces al cuerpo de Técnicos de Asistencia Tecnológica del Ministerio de Defensa, hace unas horas se ha producido un terremoto en el que se contabilizan numerosas pérdidas humanas y materiales. Junto a un hospital de campaña, se han instalado unas carpas provisionales donde un equipo de 25 técnicos informáticos van a llevar a cabo las labores de recogida de datos de los damnificados, con objeto de realizar una valoración adecuada de los daños físicos y materiales que hayan sufrido. Eres el Coordinador de operaciones tecnológicas y debes crear un servidor Linux contra el que van a trabajar los 25 técnicos a través de sus portátiles, cada uno con su cuenta de usuario Linux en él.

Apartado 2 (1p):
Realiza un script que cumpla los siguientes requisitos:
Antes de nada, el script debe crear automáticamente en el home de tu usuario un archivo de texto llamado
técnicos_preparados.txt y establecer los permisos 744 para este.
Debe mostrar por pantalla un menú con las siguientes opciones:
1) Crear grupos de técnicos
2) Crear usuarios técnicos
3) Añadir técnico a un grupo
4) Crear árbol de datos
5) Visualizar técnicos preparados
6) Realizar salvaguarda de datos
7) Salir
El menú debe estar construido y controlado con las estructuras adecuadas.

Cada una de las opciones debe llevar a cabo:

Apartado 3 (2p): Opción 1:Se solicitará al usuario que introduzca el nombre del grupo a crear. Hay que comprobar que el usuario ha introducido algo, si no indicamos error y volvemos al menú. Con el nombre del grupo, comprobamos si éste existe en el sistema, si no existe lo creamos. Si existe, lo indicamos y volvemos al menú.
Apartado 4 (2p): Opción 2:
Se solicitará al usuario que introduzca el nombre del usuario a crear. Hay que comprobar que el usuario ha introducido algo, si no indicamos error y volvemos al menú. Con el nombre del usuario, comprobamos si éste existe en el sistema, si no existe lo creamos. Si existe, lo indicamos y volvemos al menú. El nuevo usuario debe ser integrado en el grupo que se creó en la Opción 1.
Apartado 5 (3p): Opción 3:Se solicitará el nombre del usuario y el nombre del grupo en el que queremos insertar dicho usuario. Se han de comprobar ambos valores para ver si el usuario ha metido algo por teclado o no. Si el usuario y el grupo existen en el sistema, se lanzará la orden para integrar al usuario en dicho grupo. Si alguno de los dos no existe, indicaremos error y volveremos al menú.
Apartado 6 (2p): Opción 4:Se solicitará el nombre del usuario al que hay que crearle el árbol de directorios. Si existe en el sistema, crearemos en su /home las siguientes carpetas:
· Empresas_afectadas
· Familias_afectadas
· Patrimonio_afectado
· Decesos
Una vez comprobada la creación de dichas carpetas para ese usuario, se irá añadiendo al archivo de texto llamado técnicos_preparados.txt los nombres de cada uno de los usuarios a los que les estemos haciendo este tratamiento.
Apartado 7 (1p): Opción 5:Se accederá al archivo técnicos_preparados.txt y se visualizará en pantalla su contenido, de este modo podremos saber a qué usuarios se les ha creado el árbol de datos. El programa debe detenerse hasta que el usuario pulse una tecla para continuar.
Entonces, volverá al menú.
Apartado 8 (2p): Opción 6:
Para esta opción, hay que crear una carpeta dentro de la carpeta /root cuyo nombre será el mismo nombre de tu usuario y dentro de ella, otra con nombre salvaguarda_datos, en la que se volcará todo el contenido del /home de tu usuario.
Opción 7:
Salida del Script.

Una posible solución a este enunciado podría ser la siguiente:

#!/bin/bash

sudo touch /home/$USERNAME/Escritorio/tecnicos_preparados.txt
sudo chmod 744 /home/$USERNAME/Escritorio/tecnicos_preparados.txt

function Crear_grupos()
{
while [ -z $grupo ]
do
    read -p "Introduce el nombre del grupo:" grupo
done

echo "El grupo que has introducido es : " $grupo
cat /etc/group |grep -w $grupo

if [ $? -eq 0 ]
then
    echo "El grupo existe en el sistema"
else
    sudo addgroup $grupo
    if [ $? -eq 0 ]
    then
        echo "El grupo se ha creado correctamente"
            echo "Grupo: " $grupo " OK" >> home/$USERNAME/Escritorio/tecnicos_preparados.txt
    else
        echo "Error el grupo no se ha creado correctamente"
    fi
fi
}

function Crear_usuarios()
{


while [ -z $usuario ]
do
    read -p "Introduce el nombre del usuario:" usuario
done

cat /etc/passwd | grep -w $usuario

if [ $? -eq 0 ]
then
    echo "El usuario existe en el sistema"
else
    sudo adduser $usuario
    if [ $? -eq 0 ]
    then
        echo "El usuario se ha creado correctamente"
        echo "Usuario: "$usuario"...........................OK" >> home/$USERNAME/Escritorio/tecnicos_preparados.txt
    else   
        echo "Error el usuario no se ha creado correctamente"
    fi
fi
}

function nuevo_tecnico()
{

while [ -z $tecnico ]
do
    read -p "Introduce el nombre del nuevo técnico: " tecnico
done

while [ -z $grupo_tecnico ]
do
    read -p "Introduce el grupo para el nuevo ténico: " grupo_tenico
done

echo "El tecnico introducido es: " $tecnico " y el grupo: " $grupo_tecnico
echo "Intentando unir el técnico al grupo..."

#Comprobamos si el usuario y el grupo existen

cat /etc/passwd | grep -w $tecnico
if [ $? -eq 0 ]
then
    existe_tecnico=1    #esta variable valdrá 1 si el tecnico existe
else
    existe_tecnico=0   #esta variable valdrá 0 si no existe
fi

cat /etc/group | grep -w $grupo_tecnico
if [ $? -eq 0 ]
then
    existe_grupo_tecnico=1    #esta variable valdrá 1 si el grupo existe
else
    existe_grupo_tecnico=0   #esta variable valdrá 0 si no existe
fi

if [ $existe_tecnico -eq 1 ] && [ $existe_grupo_tecnico -eq 1 ]
then
    #sudo adduser $tecnico $grupo_tecnico
      sudo usermod -G $grupo_tecnico $tecnico
    if [ $? -eq 0 ]
    then
        echo "El técnico ha sido integrado en el grupo correctamente"
    else
        echo "Error al integrar técnico en grupo"
    fi
else
    echo "Error, o el técnico no existe o el grupo tampoco"
fi

}


function Crear_arbol()
{

while [ -z $usuario ]
do
    read -p "Introduce el nombre del usuario:" usuario
done

cat /etc/passwd | grep -w $usuario
if [ $? -eq 0 ]
then
    echo "Ok, el usuario sí existe en el sistema"
    if [ -d /home/$usuario ]
      then
        echo "Creando árbol de carpetas..."
            sudo mkdir /home/$usuario/Empresas_afectadas
            if [ $? -eq 0 ]
        then
             echo "Empresas_afectadas creada"
        else
            echo "Error Empresas_afectadas no creada"
        fi

        sudo mkdir /home/$usuario/Familias_afectadas

            if [ $? -eq 0 ]
        then
             echo "Familias_afectadas creada"
        else
            echo "Error Familias_afectadas no creada"
        fi

        sudo mkdir /home/$usuario/Patrimonio_afectado

            if [ $? -eq 0 ]
        then
             echo "Patrimonio_afectado creada"
        else
            echo "Error Patrimonio_afectado no creada"
        fi

        sudo mkdir /home/$usuario/Decesos   

            if [ $? -eq 0 ]
        then
             echo "Decesos creada"
        else
            echo "Error Decesos no creada"
        fi
    else
        echo "La carpeta personal no existe, no se creará el árbol"
    fi
else
    echo "Error, el usuario no existe en el sistema"
fi
}

function Visualizar_tecnicos()
{
    clear
    echo "Mostrando los técnicos creados..."
    cat /home/$USERNAME/tecnicos_preparados.txt   
    read
}

function Realizar_salvaguarda()
{
sudo mkdir /root/$USERNAME

if [ $? -eq 0 ]
then
    echo "La carpeta $USERNAME se ha creado con éxito"
    sudo mkdir /root/$USERNAME/salvaguarda_datos
      # Esta creación habría que comprobarla
      cp -r /home /root/$USERNAME/salvaguarda_datos
      if [ $? -eq 0 ]
      then
           echo "Ok, salvaguarda realizada con éxito"
            echo "Mostrando los datos recopilados..."
        ls /root/$USERNAME/salvaguarda_datos
    else
        echo "Error al realizar salvaguarda de datos"     
    fi
else
    echo "La carpeta $USERNAME no se ha creado con éxito"
fi
}

#...........................
#     PROGRAMA PRINCIAL
#..........................

while [ "$opcion1" != "7" ]
do
clear
echo "******* MENÚ ********"
echo "1) Crear grupos de técnicos"
echo "2) Crear usuarios técnicos"
echo "3) Añadir técnico a un grupo"
echo "4) Crear árbol de datos"
echo "5) Visualizar técnicos preparados"
echo "6) Realizar salvaguarda de datos"
echo "7) Salir"

read -p "Introduce una opción:" -n1 opcion1

case $opcion1 in

    1) Crear_grupos;;

    2) Crear_usuarios;;
    3) nuevo_tecnico;;
    4) Crear_arbol;;
    5) Visualizar_tecnicos;;
    6) Realizar_salvaguarda;;
    7) echo "" ;;
    *) echo "Opción no válida";;
esac
done
echo "Gracias por utilizar este software"
exit 0