Script de personalización de Linux educativo Max 7.0

Max 7.0: Linux educativo de la Comunidad de Madrid

Para quien no lo sepa, la distribución de Linux, Max 7.0, es la última versión del Linux desarrollado por la Comunidad de Madrid. Por ahora está centrado especialmente en el ámbito educativo. Y desde luego, funciona muy bien.

El modo elegido para instalar un aula es por clonación. Se prepara un equipo, y mediante CloneZilla en red (DRBL), se pasa igual a los demás equipos. De todos modos, los equipos terminan teniendo pequeñas diferencias, que a veces dificultan estas tareas. Debido a ello he tenido que hacer la misma personalización varias veces, así que he terminado haciendo un script que me ayude a ganar tiempo y a tener todo bien organizado.

Este script personalizará un Max7, como equipo de un alumno, que use una serie de servicios que estén instalados en el PC del profesor, también ejecutando Max7. Como tal, los aspectos que se configuran con este script son los siguientes:

  • Proxy de paquetes APT, para ahorrar ancho de banda en las actualizaciones, localizado el proxy en el servidor de aula.
  • Actualización de paquetes, nada más personalizar Max7, y tirando del proxy de paquetes APT.
  • Añade en el cron.daily un script de actualización de paquetes, y otro de sincronización de hora por NTP, tomando la hora de referencia del servidor de aula.
  • Cerrar automáticamente el equipo si no se usa durante un tiempo.
  • Permitir entradas por SSH del usuario “madrid”.
  • Cambia el nombre del equipo.
  • Configura el cliente DNS.
  • Se impone un proxy http, no transparente, para los navegadores del equipo: Firefox y Chromium, de forma que el alumno no pueda cambiarlos. Tiene el mismo efecto que un proxy transparente.
  • Se impone privacidad de datos en los navegadores, para evitar problemas de sesiones abiertas, y por tanto, posibles problemas a resolver por el TIC.
  • Se cambia el color de los prompts de los usuarios (rojo para root, y verde para los demás).
  • Cambia el directorio principal de VirtualBox, para evitar espacios, y así poder usar el configurador homealumno, y poder especificar que no se borren las máquinas virtuales ahí creadas.
  • Instala CloneZilla para que pueda iniciar desde el Grub del sistema.

En fin, todo es mejorable, pero al menos a mi me sirve el script. Cualquier sugerencia de mejora es bienvenida. Aquí está el script:

Enlace en Google Drive

O, más cómodamente para leer:

#!/bin/bash

# Script para configurar un Max7 como PC alumno
# IES Arquitecto Ventura Rodríguez
# Víctor Nuño (Coordinador TIC): victornuno@victornuno.com
# 6 de febrero de 2013
# Utilización:
# pc-alumno-sh [Nombre del equipo]
# Ejemplo: pc-alumno.sh b11-pc07
# REVISA EL SCRIPT ENTERO, QUE LO MISMO HAY PARTES QUE NI QUIERES NI NECESITAS
# AVISADO ESTÁS

# QUÉ EJECUTAR
confProxyApt="0" # Configurar para proxy de paquetes APT.
confUpdateUpgrade="1" # Actualizar e instalar paquetes.
confCronDaily="1" # Añadir entradas en el cron.daily.
confCronRoot="0" # Añadir entradas en el cron de root.
confAutoShutdown="0" # Cerrar automáticamente si no se usa el equipo.
confSshMadrid="0" # Permitir logins de usuario madrid por SSH.
confHostname="0" # Cambiar el nombre del equipo.
confResolvConf="0" # Configurar cliente DNS, por /etc/resolv.conf (no desactiva Network manager, ... aún).
confNetworkManager="1" # Configurar cliente DNS, por Network Manager
confNavegadoresProxy="1" # Imponer un proxy en navegadores, de forma que no lo cambien los alumnos.
confNavegadoresPrivacidad="1" # Imponer privacidad, al borrar datos cuando se cierra el navegador (sólo Firefox por ahora).
confVirtualboxHome="1" # Cambiar el directorio home de VirtualBox, por evitar el espacio y poder añadirlo como excepción a configurador homealumno.
confPrompts="0" # Cambiar color de prompts: verde para usuarios normales, y rojo para root. Añade claridad.
confClonezilla="0" # Instalar CloneZilla en el Grub del sistema, como una opción más al iniciar el Max.

# CONFIGURACIONES
nombrePC=$1
servidorAula="192.168.0.24"
redAula="192.168.0.0/24"
gateway="192.168.0.1"
dns1=$servidorAula
dns2=$gateway
dns3="8.8.8.8"
dns4="8.8.4.4"
proxyConfig="/etc/apt/apt.conf.d/02proxy"
actualizaSistema="/etc/cron.daily/actualizaSistema"
actualizaHora="/etc/cron.daily/ntpdate"
grubConf="/etc/grub.d/40_custom"
entorno="/etc/environment"
firefoxConf="/etc/firefox/syspref.js"
apagadoAuto="/etc/cron.hourly/shutdown-when-idle"
descargaCloneZilla="http://garr.dl.sourceforge.net/project/clonezilla/clonezilla_live_stable/2.0.1-15/clonezilla-live-2.0.1-15-i486.zip"
configNetworkManager="/etc/NetworkManager/system-connections/Conexión cableada 1"

# Configuración proxy APT usando apt-cacher-ng en $servidorAula
if [ $confProxyApt == "1" ]; then
echo "Proxy APT: Comenzando"
echo "Acquire::http { Proxy \"http://$servidorAula:3142\"; };" | sudo tee $proxyConfig > /dev/null
# Configuración proxy APT usando Squid en servidorAula
# Ver http://askubuntu.com/questions/3503/best-way-to-cache-apt-downloads-on-a-lan
#echo "Acquire { Retries \"0\"; HTTP { Proxy \"http:\/\/$servidorAula:3128\"; }; };" sudo tee $proxyConfig > /dev/null
more $proxyConfig
echo "Proxy APT: Finalizado"
echo ""
fi

# Creación de entradas de NTP y script para actualización, en cron.daily
if [ $confCronDaily == "1" ]; then
echo "NTP: Comenzando"
# Borra restos de pruebas previas
sudo rm -f /etc/cron.daily/actualiza-paquetes /etc/cron.daily/ntpdate
# Comenzamos de verdad
echo "ntpdate $servidorAula" | sudo tee $actualizaHora > /dev/null
sudo chmod +x $actualizaHora
sudo $actualizaHora
echo "NTP: Finalizado"
echo "Script actualización: Comenzando"
echo "/usr/bin/apt-get --yes update && /usr/bin/apt-get --yes upgrade" | sudo tee $actualizaSistema > /dev/null
echo "/usr/bin/apt-get --yes install linux-headers-generic linux-headers-generic-pae linux-image-generic" | sudo tee -a $actualizaSistema > /dev/null
echo "/usr/bin/apt-get --yes clean; /usr/bin/apt-get --yes autoclean; /usr/bin/apt-get --yes autoremove" | sudo tee -a $actualizaSistema > /dev/null
sudo chmod +x $actualizaSistema
# more $actualizaSistema
echo "Script actualización: Finalizado"
echo ""
fi

# Actualización e instalación de paquetes
if [ $confUpdateUpgrade == "1" ]; then
echo "Actualización e instalación: Comenzando"
sudo /usr/bin/apt-get --yes remove skype gwibber-service-facebook
sudo $actualizaSistema
sudo /usr/bin/apt-get --yes install vim virtualbox-ose openssh-server synapse italc-client ocsinventory-agent nagios-nrpe-server chromium-browser sysstat
echo "Actualización e instalación: Finalizado"
echo ""
fi

# Entradas en el cron de root
if [ $confCronRoot == "1" ]; then
echo "Cron en root: Comenzando"
echo "0 12 * * 1-5 $actualizaSistema" | sudo tee /root/cron > /dev/null
echo "30 15 * * * /sbin/init 0" | sudo tee -a /root/cron > /dev/null
sudo crontab /root/cron
sudo crontab -l
echo "Cron en root: Finalizado"
echo ""
fi

# Apagar si no se usa en media hora:
# Referencias:
# - http://judsonsnotes.com/notes/index.php?option=com_content&view=article&id=681:automatic-system-shutdown-when-idle&catid=37:tech-notes&Itemid=59
# - http://www.vicente-navarro.com/blog/2008/11/08/sysstat-la-coleccion-de-herramientas-de-monitorizacion-de-rendimiento/
# Creación de script de apagado automático:
if [ $confAutoShutdown == "1" ]; then
echo "Script auto apagado: Comenzando"
echo "#!\/bin\/bash" | sudo tee $apagadoAuto > /dev/null
echo "#" | sudo tee -a $apagadoAuto > /dev/null
echo "# This script will use the sar command to average the CPU" | sudo tee -a $apagadoAuto > /dev/null
echo "# usage over the past 5 minutes. If lower than the threshold," | sudo tee -a $apagadoAuto > /dev/null
echo "# it will issue the shutdown command." | sudo tee -a $apagadoAuto > /dev/null
echo "#" | sudo tee -a $apagadoAuto > /dev/null
echo "echo `date`" | sudo tee -a $apagadoAuto > /dev/null
echo "threshold=7" | sudo tee -a $apagadoAuto > /dev/null
echo "$logfile=\/home\/user\/shutdown_if_idle.log" | sudo tee -a $apagadoAuto > /dev/null
echo "sar 10 6 > $logfile" | sudo tee -a $apagadoAuto > /dev/null
echo "usage=`tail -1 $logfile | cut -c 25-26 | sed 's\/ \/\/g'`" | sudo tee -a $apagadoAuto > /dev/null
echo "usage1=`tail -1 $logfile | cut -c 25-28 | sed 's\/ \/\/g'`" | sudo tee -a $apagadoAuto > /dev/null
echo "echo "Average CPU usage over the last 5 minutes is: " $usage1" | sudo tee -a $apagadoAuto > /dev/null
echo "if [ "$usage" -lt "$threshold" ]; then" | sudo tee -a $apagadoAuto > /dev/null
echo "echo "CPU usage is less than threshold. Issuing shutdown command"" | sudo tee -a $apagadoAuto > /dev/null
echo "\/sbin\/shutdown -h now" | sudo tee -a $apagadoAuto > /dev/null
echo "else" | sudo tee -a $apagadoAuto > /dev/null
echo "echo "CPU usage is greater than threshold."" | sudo tee -a $apagadoAuto > /dev/null
echo "fi" | sudo tee -a $apagadoAuto > /dev/null
echo "0,30 * * * *" $apagadoAuto | sudo tee -a /root/cron > /dev/null
sudo crontab /root/cron
sudo crontab -l
echo "Script auto apagado: Finalizado"
echo ""
fi

# Permitimos que el usuario madrid pueda hacer ssh en este Max:
# http://askubuntu.com/questions/84007/find-and-replace-text-within-multiple-files
if [ $confSshMadrid == "1" ]; then
echo "SSH con madrid: Comenzando"
sudo sed -i "s/madrid//g" /etc/ssh/sshd_config;
sudo service ssh restart
echo "SSH con madrid: Finalizado"
echo ""
fi

# Resolución DNS, en principio por DHCP y por eso está comentado. Descomentar si es necesario
if [ $confResolvConf == "1" ]; then
echo "Cliente DNS: Comenzando"
echo "nameserver $servidorAula" | sudo /usr/bin/tee /etc/resolv.conf > /dev/null
echo "nameserver $gateway" | sudo /usr/bin/tee -a /etc/resolv.conf > /dev/null
echo "nameserver $dns3" | sudo /usr/bin/tee -a /etc/resolv.conf > /dev/null
echo "nameserver $dns4" | sudo /usr/bin/tee -a /etc/resolv.conf > /dev/null
more /etc/resolv.conf
echo "Cliente DNS: Finalizado"
echo ""
fi

# Resolución DNS, en Network Manager, con "Conexión Cableada 1"
# No tengo claro por qué, pero necesito recurrir a "cat" para que no sobreescriba $configNetworkManager
if [ $confNetworkManager == "1" ]; then
echo "Network Manager: Comenzando"
echo "dns=$servidorAula;$gateway;$dns3;$dns4;" | sudo /usr/bin/tee /tmp/NetworkManager > /dev/null
echo "ignore-auto-dns=true" | sudo /usr/bin/tee -a /tmp/NetworkManager > /dev/null
sudo cat /tmp/NetworkManager | sudo /usr/bin/tee -a "$configNetworkManager" > /dev/null
sudo rm -f /tmp/NetworkManager
echo "Network Manager: Finalizado"
echo ""
fi

# Configuramos el proxy del sistema, para Gnome, y supuestamente en general, aunque Firefox no sigue /etc/environment por ahora
if [ $confNavegadoresProxy == "1" ]; then
echo "Proxy en navegadores: Comenzando"
# echo "- En Gnome: comenzando"
# sudo gsettings set org.gnome.system.proxy mode 'manual'
# sudo gsettings set org.gnome.system.proxy.http host "$servidorAula"
# sudo gsettings set org.gnome.system.proxy.http port 3128
# echo "- En Gnome: finalizado"
echo "- En /etc/environment: comenzando"
echo "no_proxy=localhost,127.0.0.0/8,*.local,$redAula" | sudo tee -a $entorno > /dev/null
echo "NO_PROXY=localhost,127.0.0.0/8,*.local,$redAula" | sudo tee -a $entorno > /dev/null
echo "all_proxy=socks://$servidorAula:3128/" | sudo tee -a $entorno > /dev/null
echo "ALL_PROXY=socks://$servidorAula:3128/" | sudo tee -a $entorno > /dev/null
echo "http_proxy=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "HTTP_PROXY=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "ftp_proxy=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "FTP_PROXY=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "https_proxy=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "HTTPS_PROXY=http://$servidorAula:3128" | sudo tee -a $entorno > /dev/null
echo "- En /etc/environment: finalizado"
# Configuración del proxy del sistema para Firefox
# Con lockPref configuramos opciones de forma obligatoria.
# El fichero de configuración global en Firefox es /etc/firefox/syspref.js
# AQUÍ HAGO LA SUPOSICIÓN DE QUE NO HAY NADA PREVIAMENTE EN /etc/firefox/syspref.js, CON LO QUE LO MACHACO
# Y EMPIEZO ESTE FICHERO DE CERO.
# Referencias (ojo, que no apuntan a /etc/firefox/syspref.js, sino a otro. Deben ser referencias antiguas, por el fichero):
# http://stackoverflow.com/questions/404729/how-can-i-change-firefoxs-proxy-settings-from-an-external-program
# Mandatory settings: https://help.ubuntu.com/community/FirefoxMandatoryPreferences
# Locking Firefox Proxy Settings: http://www.edgewave.com/support/web_security/help/iPrism/Networking/Mobile/IP0460.htm

# Configura de forma obligatoria un proxy manual
echo "- En Firefox: comenzando"
echo "lockPref(\"browser.startup.homepage\", \"about:blank\");" | sudo tee $firefoxConf > /dev/null
echo "lockPref(\"app.update.enabled\", false);" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"network.proxy.http\", \"$servidorAula\");" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"network.proxy.http_port\", 3128);" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"network.proxy.type\", 1);" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"network.proxy.no_proxies_on\", \"localhost, 127.0.0.1, $redAula\");" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"network.proxy.share_proxy_settings\", true);" | sudo tee -a $firefoxConf > /dev/null
echo "- En Firefox: finalizado"
echo "Proxy en navegadores: Finalizado"
echo ""
fi

# Borra de forma obligatoria los datos de privacidad, al cerrar Firefox, como forma de protección ante despistes y ante posibles marrones
if [ $confNavegadoresPrivacidad == "1" ]; then
echo "Privacidad en navegadores: Comenzando"
echo "lockPref(\"browser.privatebrowsing.autostart\", true);" | sudo tee -a $firefoxConf > /dev/null
echo "lockPref(\"privacy.donottrackheader.enabled\", true);" | sudo tee -a $firefoxConf > /dev/null
echo "Privacidad en navegadores: Finalizado"
fi

# Cambiamos directorio por defecto de MVs de VirtualBox (para guardar VMs mediante configurador homealumno)
if [ $confVirtualboxHome == "1" ]; then
echo "VirtualBox home: Comenzando"
sudo find /home -name \VirtualBox.xml -exec sed -i "s/VirtualBox\ VMs/VirtualBoxVMs/g" {} \;
sudo mkdir /home/alumno/.VirtualBox
sudo chmod 755 /home/alumno/.VirtualBox
sudo cp /home/madrid/.VirtualBox/VirtualBox.xml /home/alumno/.VirtualBox
sudo chmod 600 /home/alumno/.VirtualBox/VirtualBox.xml
sudo sed -i "s/madrid/alumno/g" /home/alumno/.VirtualBox/VirtualBox.xml;
sudo chown alumno.alumno -fR /home/alumno/.VirtualBox
sudo chmod 755 /home/alumno/.VirtualBox
echo "VirtualBox home: Finalizado"
echo ""
fi

# CAMBIO DE PROMPTS: ROOT EN ROJO, Y LOS DEMÁS EN VERDE
if [ $confPrompts == "1" ]; then
echo "Cambio de prompts: Comenzando"
# Cambiamos el prompt de root, para forzar a tener color (más claridad) y para que sea rojo (aún más claridad):
sudo sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/g" /root/.bashrc;
sudo sed -i "s/32m/31m/g" /root/.bashrc;
# Cambiamos los prompts de todos los usuarios, para forzar a tener color (más claridad):
sudo find /home -name \.bashrc -exec sed -i "s/#PS1/PS1/g" {} \;
echo "Cambio de prompts: Finalizado"
echo ""
fi

# Configuración de CloneZilla en local
# OJO: descarga antes la versión estable en formato ZIP, y descomprime en /mnt (no un subdirectorio, sino directamente)
if [ $confClonezilla == "1" ]; then
echo "CloneZilla en Grub: Comenzando"
wget -O /tmp/clonezilla.zip $descargaCloneZilla
sudo mv /tmp/clonezilla.zip /mnt; cd /mnt/; sudo unzip clonezilla.zip
sudo mv /mnt/live /mnt/live-hd
echo "menuentry \"Clonezilla\" {" | sudo tee -a $grubConf
echo "set root=(hd0,1)" | sudo tee -a $grubConf
echo "linux /mnt/live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\\\"ocs-live-general\\\" ocs_live_extra_param=\\\"\\\" ocs_live_keymap=\\\"\\\" ocs_live_batch=\\\"no\\\" ocs_lang=\\\"\\\" vga=788 ip=frommedia nosplash live-media-path=/mnt/live-hd bootfrom=/dev/sda1 toram=filesystem.squashfs" | sudo tee -a $grubConf
echo "initrd /mnt/live-hd/initrd.img" | sudo tee -a $grubConf
echo "}" | sudo tee -a $grubConf
sudo update-grub2
echo "CloneZilla en Grub: Finalizado"
echo ""
fi

# Cambio de nombre de PC
if [ $confHostname == "1" ]; then
echo "Cambio de hostname: Comenzando"
sudo hostname $nombrePC
hostname
echo "Cambio de hostname: Finalizado"
echo ""
fi

echo "SCRIPT FINALIZADO"

2 Comentarios Agrega el tuyo

  1. carlosollero@gmail.com dice:

    ¡Vaya curro, Víctor!

    1. victornuno dice:

      ¡Hola Carlos! Sobre todo, ¡vaya curro que me ha quitado este script! jajaja. Aunque sí, … le he echado unas cuantas horas.
      ¡Saludos!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s