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:
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"
¡Vaya curro, Víctor!
¡Hola Carlos! Sobre todo, ¡vaya curro que me ha quitado este script! jajaja. Aunque sí, … le he echado unas cuantas horas.
¡Saludos!