Index: wifi-ltsp/trunk/parsehostapd/parsehostapd.py
===================================================================
--- wifi-ltsp/trunk/parsehostapd/parsehostapd.py	(revision 528)
+++ wifi-ltsp/trunk/parsehostapd/parsehostapd.py	(nonexistent)
@@ -1,229 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Project:     wifi-ltsp
-# Module:     parsehostapd.py
-# Purpose:     Parsea el fichero /etc/hostapd/hostapd.conf 
-# Language:    Python 2.5
-# Date:        26-Enero-2011.
-# Ver:        07-Feb-2011.
-# Author:    Francisco Mora Sánchez
-# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
-#
-# wifi-ltsp is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# Script2 is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
-
-""" Módulo que contiene la función selectbestchannel()
-Función  que escanea el espectro de canales de redes
-wifi y nos devuelve el canal más idóneo para ser utilizado en 
-el lugar en que estamos.
-
-La función admite dos parámetros
-
-Utiliza la libreria pythonwifi y está basado en uno de los ejemplos
-incluidos en la libreria
-Debe ser ejecutado como root
-
-El algoritmo utilizado se basa en sumar las redes que existen en cada
-canal y a continuación calcular las sumas de los solapes de las redes
-centradas en canales, patrón 1-6-11, escogeremos el canal cuyo valor
-de las sumas sea menor.
-
-Los canales que se solapan en el patrón 1-6-11 son los siguientes:
-
-Canal		Canales que se solapan
-1			1-5
-2			1-6
-3			1-7
-4			1-8
-5			1-9
-6			2-10
-7			3-11
-8			4-12
-9			5-13
-10			6-13
-11			7-13
-12			8-13
-13			9-13
-
-
-Francisco Mora Sánchez
-IES Maestro Juan Calero
-adminies.maestrojuancalero@edu.juntaextremadura.net
-
-
-"""
-
-import sys
-import os
-import socket
-
-#from pythonwifi.iwlibs import Wireless, getWNICnames
-
-import escanea
-
-def actualizadatosescaneo(datosescaneo, canal, bssid, essid, calidad, intensidad):
-	""" Actualizamos diccionario con los datos recogidos del
-		escaneado, comprobamos que no hemos insertado
-		previamente la red, comprobando el bssid del AP
-	"""
-	if not datosescaneo.has_key(canal):
-		#insertamos el canal inicializando los campos
-		datosescaneo[canal] = [1, [[bssid,calidad,intensidad]], 0]
-	else:
-		#comprobemos que no existe ese bssid en el diccionario 
-		#listabssid = datosescaneo[canal][1]
-		listabssid = [bssids[0] for bssids in datosescaneo[canal][1]]
-		if not bssid in listabssid:
-			#no está en la lista, añadimos y aumentamos el contador de redes
-			datosescaneo[canal][0] = datosescaneo[canal][0] + 1
-			datosescaneo[canal][1].append([bssid,calidad,intensidad])
-
-def procesadatosescaneo(datosescaneo):
-	""" Sumamos las redes solapadas centradas en los canales, basándonos
-		en el patrón 1-6-11
-	"""
-	adyacentes = {1:[1,2,3,4,5],2:[1,2,3,4,5,6],3:[1,2,3,4,5,6,7],4:[1,2,3,4,5,6,7,8],5:[1,2,3,4,5,6,7,8,9], \
-		6:[2,3,4,5,6,7,8,9,10],7:[3,4,5,6,7,8,9,10,11],8:[4,5,6,7,8,9,10,11,12],9:[5,6,7,8,9,10,11,12,13], \
-		10:[6,7,8,9,10,11,12,13],11:[7,8,9,10,11,12,13],12:[8,9,10,11,12,13],13:[9,10,11,12,13]}
-
-	#Rellenamos canales faltantes
-	for canal in range(1, 14):
-		if not datosescaneo.has_key(canal):
-			datosescaneo[canal] = [0, [], 0]
-
-	#Sumemor las redes solapadas
-	for canal in range(1, 14):
-		for adyacente in adyacentes[canal]:
-			datosescaneo[canal][2] = datosescaneo[canal][2] + datosescaneo[adyacente][0]
-				
-def seleccionacanaloptimo(datosescaneo):
-	""" Procesamos diccionario y retornamos el canal óptimo,
-		aquel cuyo valor de numero de redes totales solapadas
-		centradas es el mínimo
-    """
-    #El mejor canal, es el menor valor de los solapes de las redes centradas en canales
-	canaloptimo = 1
-	valor = datosescaneo[1][2]
-	for canal in range(1, 14):
-		if datosescaneo[canal][2] < valor:
-			canaloptimo = canal
-			valor = datosescaneo[canal][2]
-	return canaloptimo
-	
-def selectbestchannel(verbose = False):
-	""" Creamos diccionario para almacenar datos, la key principal es 
-		es el canal, y para cada canal hay una lista en
-		la que se almacena el número de redes detectadas, sus BSSID junto
-		a su potencia e intensidad, además se almacenará
-		y el número de redes que se solapan con las redes centradas en canales
-		según patrón 1-6-11.
-		Controlaremos que no se dupliquen los canales cuando hay más de un interfaz wifi
-		comparando los BSSID para este menester
-	"""
-	
-	#Esta seria la estructura que obtendriamos de nuestro escaneado
-	#{1:[3, [["MACAP1",70,-56], ["MACAP2",65,-61], ["MACAP3",60,-66]], 0],
-	# 2:[2, [["MACAP4",75,-51], ["MACAP5",65,-61]], 0]
-	# 3:[1, [["MACAP6",80,-45]], 0],
-	# 4:[1, [["MACAP7",60,-66]], 0]}
-	datosescaneo = {}
-	if verbose:
-		print "Escaneando redes WIFI..."
-	index = 1
-	for ifname in escanea.getWirelessInterfaces():
-		if verbose:
-			print "	Escaneado de la interfaz %-8.16s" % (ifname, )
-		otros_datos_escaneo = escanea.ObtieneRedes(ifname)
-		if len(otros_datos_escaneo.keys()) == 0:
-			if verbose:
-				print "%-8.16s  Escaneado sin resultados" % (ifname, )
-		for bssid in otros_datos_escaneo.keys():
-			if verbose:
-				print "          Red: %02d - Canal: %s BSSID: %s ESSID: %s Quality: %s Signal Strength: %s" % \
-			(index, otros_datos_escaneo[bssid]['canal'], bssid, otros_datos_escaneo[bssid]['essid'], otros_datos_escaneo[bssid]['calidad'], otros_datos_escaneo[bssid]['intensidad'])
-			#vamos a actualizar nuestro diccionario
-			actualizadatosescaneo(datosescaneo, int(otros_datos_escaneo[bssid]['canal']), bssid, otros_datos_escaneo[bssid]['essid'], otros_datos_escaneo[bssid]['calidad'], otros_datos_escaneo[bssid]['intensidad'])
-			index = index +1
-	#para pruebas
-	#datosescaneo = {1:[2, [["01",99,-99],["02",98,-98]], 0], 6:[3, [["03",97,-97],["04",96,-96],["05",95,-95]], 0], 11:[1, ["06",94,-94], 0]}
-	procesadatosescaneo(datosescaneo)
-	canaloptimo = seleccionacanaloptimo(datosescaneo)
-	if verbose:
-		print "\nTabla de datos obtenida:"
-		print datosescaneo
-		print "\n"
-		print "El canal óptimo es el: ", canaloptimo
-	
-	return canaloptimo
-
-if __name__ == "__main__":
-	""" Comprobaremos que se ha pasado la ruta al archivo hostapd.conf
-		El archivo hostapd.conf debe contener la cadena 'canalseleccionado'
-		que será reemplazada por la salida de la función selectchannelwifi().
-		
-		Además el SSID es el nombre de equipo menos la cadena '-pro', y
-		la cadena a buscar en el archivo hostapd.conf es 'ssidseleccionado'.
-	"""
-	if len(sys.argv) == 1:
-		print 'uso: ./parsehostapd.py /ruta/al/archivo/hostapd.conf'
-		sys.exit(1)
-	#Comprobemos la existencia del archivo
-	hostapdconf = sys.argv[1]
-	if not os.path.exists(hostapdconf):
-		print "El archivo",hostapdconf,"no existe"
-		exit(2)
-	print "Procesando archivo",hostapdconf
-	""" Aquí llamamos a la función  desarrollada en este módulo
-		para asignar el canal de transmisión óptimo,
-		si ponemos True en el parámetro podremos ver las redes 
-		que se detectan...
-	"""	
-	canaloptimo = selectbestchannel(True)
-	
-	ssid = socket.gethostname()
-	pos = ssid.find(".")
-	if pos > -1:
-		ssid = ssid[:pos]
-	pos = ssid.find("-pro")
-	if pos > -1:
-		ssid = ssid[:pos]
-	try:
-		#Abre el archivo para lectura de datos
-		archivoLectura = open(hostapdconf,"r")
-		lineas = archivoLectura.readlines()
-		archivoLectura.close()
-	except (RuntimeError, TypeError, NameError, IOError):
-		print "Error en la ubicacion o nombre del archivo"
-		exit()
-	#Modifica la cadena del channel y ssid
-	encontradoChannel = False
-	encontradoSsid = False
-	for numlinea in range(0, len(lineas)):
-		linea = lineas[numlinea]
-		#comprobamos si estamos en channel o en ssid
-		if linea[:7] == "channel":
-			encontradoChannel = True
-			lineas[numlinea] = "channel="+str(canaloptimo)+"\n"
-		if linea[:4] == "ssid":
-			encontradoSsid = True
-			lineas[numlinea] = "ssid="+ssid+"\n"
-	if not encontradoChannel:
-		lineas.append("channel="+str(canaloptimo)+"\n")
-	if not encontradoSsid:
-		lineas.append("ssid="+ssid+"\n")
-				
-	#Abre el archivo para escritura de datos
-	archivoEscritura = open(hostapdconf,"w")
-	archivoEscritura.writelines(lineas)
-	archivoEscritura.close()
-	print "El canal establecido es",canaloptimo
-	print "El SSID establecido es",ssid 
-	print "Se ha procesado el archivo",hostapdconf 

Property changes on: wifi-ltsp/trunk/parsehostapd/parsehostapd.py
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: wifi-ltsp/trunk/parsehostapd/escanea.py
===================================================================
--- wifi-ltsp/trunk/parsehostapd/escanea.py	(revision 528)
+++ wifi-ltsp/trunk/parsehostapd/escanea.py	(nonexistent)
@@ -1,288 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Project:     wifi-ltsp
-# Module:     escanea.py
-# Purpose:     Busca el canal libre más adecuado para la wifi
-# Language:    Python 2.5
-# Date:        03-Feb-2011.
-# Ver:        07-Feb-2011.
-# Author:    Francisco Mora Sánchez
-# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
-#
-# wifi-ltsp is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# Script2 is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
-
-
-"""Módulo auxiliar para obtener información a través
-del comando iwlist, perteneciente a las herramientas
-wireless-tools
-
-Francisco Mora Sánchez
-IES Maestro Juan Calero
-adminies.maestrojuancalero@edu.juntaextremadura.net
-
-
-"""
-
-import os
-import re
-import locale
-import time
-from subprocess import Popen, STDOUT, PIPE, call
-
-# Expresiones Regulares.
-_re_mode = (re.I | re.M | re.S)
-essid_pattern = re.compile('.*ESSID:"?(.*?)"?\s*\n', _re_mode)
-ap_mac_pattern = re.compile('.*Address: (.*?)\n', _re_mode)
-channel_pattern = re.compile('.*Channel:?=? ?(\d\d?)', _re_mode)
-strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)', _re_mode)
-altstrength_pattern = re.compile('.*Signal level:?=? ?(\d+)\s*/?\s*(\d*)', _re_mode)
-signaldbm_pattern = re.compile('.*Signal level:?=? ?(-\d\d*)', _re_mode)
-freq_pattern = re.compile('.*Frequency:(.*?)\n', _re_mode)
-
-def to_unicode(x):
-    """ Convierte una cadena a codificación utf-8. """
-    # Si ésta es una cadena unicode, la codifica y la devuelve
-    if not isinstance(x, basestring):
-        return x
-    if isinstance(x, unicode):
-        return x.encode('utf-8')
-    encoding = locale.getpreferredencoding()
-    try:
-        ret = x.decode(encoding).encode('utf-8')
-    except UnicodeError:
-        try:
-            ret = x.decode('utf-8').encode('utf-8')
-        except UnicodeError:
-            try:
-                ret = x.decode('latin-1').encode('utf-8')
-            except UnicodeError:
-                ret = x.decode('utf-8', 'replace').encode('utf-8')
-            
-    return ret
-
-def EjecutaRegex(regex, cadena):
-    """ ejecuta búsqueda de expresión regular en una cadena """
-    m = regex.search(cadena)
-    if m:
-        return m.groups()[0]
-    else:
-        return None
-
-def Ejecuta(comando, include_stderr=False, return_pipe=False,
-        return_obj=False, return_retcode=True):
-    """ Ejecuta un comando.
-
-    Ejecuta el comando dado, retornando la salida del programa
-    o un pipe para leer la salida.
-
-    argumentos --
-    comando - Comando a ejecutar
-    include_std_err - Boleano, especifica si la salida de error debe
-					ser incluida en el pipe.
-    return_pipe - Boleano, especifica si el pipe del comando se
-					devuelve. Si es False, todo lo que devolverá
-					es la cadena de salida del comando.
-    return_obj - Si True, Ejecuta devolverá el objeto Popen
-					para el comando que se ha ejecutado.
-
-    """
-    if not isinstance(comando, list):
-        comando = to_unicode(str(comando))
-        comando = comando.split()
-    if include_stderr:
-        err = STDOUT
-        fds = True
-    else:
-        err = None
-        fds = False
-    if return_obj:
-        std_in = PIPE
-    else:
-        std_in = None
-    
-    # Debemos asegurarnos que los resultados del comando ejecutado
-    # están en inglés, así ajustaremos un entorno temporal.
-    tmpenv = os.environ.copy()
-    tmpenv["LC_ALL"] = "C"
-    tmpenv["LANG"] = "C"
-    
-    try:
-        f = Popen(comando, shell=False, stdout=PIPE, stdin=std_in, stderr=err,
-                  close_fds=fds, cwd='/', env=tmpenv)
-    except OSError, e:
-        print "Fallo ejecuando comando %s : %s" % (str(comando), str(e))
-        return ""
-        
-    if return_obj:
-        return f
-    if return_pipe:
-        return f.stdout
-    else:
-        return f.communicate()[0]
-
-def FrecuenciaACanal(frecuencia):
-	""" Transforma una frecuencia a canal.
-	
-		Nota: Esta función es una búsqueda en diccionario, por lo que
-		la frecuencia debe estar en el diccionario para que pueda
-		devolverse un canal válido.
-		
-        Parámetros:
-        frecuencia -- cadena conteniendo la frecuencia
-        
-        Devuelve:
-        El número de canal, o None si no se encuentra.
-	"""
-	ret = None
-	freq_dict = {'2.412 GHz': 1, '2.417 GHz': 2, '2.422 GHz': 3,
-		'2.427 GHz': 4, '2.432 GHz': 5, '2.437 GHz': 6,
-		'2.442 GHz': 7, '2.447 GHz': 8, '2.452 GHz': 9,
-		'2.457 GHz': 10, '2.462 GHz': 11, '2.467 GHz': 12,
-		'2.472 GHz': 13, '2.484 GHz': 14 }
-	try:
-		ret = freq_dict[frecuencia]
-	except KeyError:
-		print "No se puede determinar el canal para la frecuencia: " + str(frecuencia)
-	return ret
-
-def get_link_quality(red):
-	""" Obtiene la calidad del enlace desde la salida iwlist.
-	"""
-	try:
-		[(strength, max_strength)] = strength_pattern.findall(red)
-	except ValueError:
-		(strength, max_strength) = (None, None)
-	if strength in ['', None]:
-		try:
-			[(strength, max_strength)] = altstrength_pattern.findall(red)
-		except ValueError:
-			# Si el patrón no encuentra coincidencias
-			# retornamos 101
-			return 101
-	if strength not in ['', None] and max_strength:
-		#print "strength,max",strength,max_strength
-		return (100 * int(strength) // int(max_strength))
-	elif strength not in ["", None]:
-		#print "strength,max",strength,max_strength
-		return int(strength)
-	else:
-		#print "strength,max",strength,max_strength
-		return None
-    
-def ParseAccessPoint(red):
-	""" Examina una red wifi desde la salida de iwlist.
-		Parámetros:
-		red -- cadena que contiene la identificación de la red.
-		Devuelve:
-		Un diccionario que contiene las propiedades de la red wifi
-		examinada.
-	"""
-	ap = {}
-	ap['essid'] = EjecutaRegex(essid_pattern, red)
-	try:
-		ap['essid'] = to_unicode(ap['essid'])
-	except (UnicodeDecodeError, UnicodeEncodeError):
-		print 'Problema Unicode con el essid de la red actual, ignorando!!'
-		return None
-	if ap['essid'] in ['Hidden', '<hidden>', "", None]:
-		print 'hidden'
-		ap['oculta'] = True
-		ap['essid'] = "<hidden>"
-	else:
-		ap['oculta'] = False
-	# Canal - Para interfaces que no tienen un número de canal,
-	# convertir la frecuencia.
-	ap['canal'] = EjecutaRegex(channel_pattern, red)
-	if ap['canal'] == None:
-		freq = EjecutaRegex(freq_pattern, red)
-		ap['canal'] = FrecuenciaACanal(freq)
-	# BSSID
-	ap['bssid'] = EjecutaRegex(ap_mac_pattern, red)
-	# Calidad del enlace
-	# Ajusta strength a -1 si no se encuentra calidad
-	ap['calidad'] = get_link_quality(red)
-	if ap['calidad'] is None:
-		ap['calidad'] = -1
-	# Signal Strength (only used if user doesn't want link
-	# quality displayed or it isn't found)
-	if EjecutaRegex(signaldbm_pattern, red):
-		ap['intensidad'] = EjecutaRegex(signaldbm_pattern, red)
-	return ap
-
-def getWirelessInterfaces():
-    """ Extract wireless device names from /proc/net/wireless.
-
-        Returns empty list if no devices are present.
-
-        >>> getWirelessInterfaces()
-        ['eth1', 'wifi0']
-
-    """
-    device = re.compile('[a-z]{2,}[0-9]*:')
-    ifnames = []
-
-    fp = open('/proc/net/wireless', 'r')
-    for line in fp:
-        try:
-            # append matching pattern, without the trailing colon
-            ifnames.append(device.search(line).group()[:-1])
-        except AttributeError:
-            pass
-
-    return ifnames
-
-def ObtieneRedes(interface):
-	""" Obtiene una lista de redes wifi disponibles. La usamos para 
-		obtener via iwlist datos de las redes disponibles. De momento
-		lo usamos para obtener los valores del calidad e intensidad,
-		ya que la librería pythonwifi no parece dar los valores correctos
-		de estos parámetros.
-	
-		Parámetros:
-		interface -- Interfaz sobre la que escanear
-		Devuelve:
-		Diccionario cuyas claves son ls bssids y cada elemento
-		es otro diccionario cuyas claves con las características
-		recogidas por iwlist
-	"""
-    
-    #Si hostapd está corriendo iwlist scan no funciona:
-	Popen(["invoke-rc.d","hostapd","stop"]).wait()
-	time.sleep(2.0)
-	Popen(["ifconfig",interface,"up"]).wait()
-    
-	cmd = 'iwlist ' + interface + ' scan'
-	resultado = Ejecuta(cmd)
-	# Divide las redes, utilizando Cell como punto de división
-	# de esta forma podemos mirar una red cada vez.
-	# Los espacios alrededor de '   Cell ' son para evitar el caso
-	# de que alguien tenga un essid llamado Cell...
-	redes = resultado.split( '   Cell ' )
-	# An array for the access points
-	access_points = []
-	access_points = {}
-	for red in redes:
-		# Solo usa secciones donde haya un ESSID.
-		if 'ESSID:' in red:
-			# Añadir la red a la lista de redes
-			entry = ParseAccessPoint(red)
-			if entry is not None:
-				# Normalmente solo tenemos bssids duplicados con redes
-				# ocultas.  Solo nos fijamos en el essid real, para
-				# que esté en la lista.
-				if (entry['bssid'] not in access_points or not entry['oculta']):
-					access_points[entry['bssid']] = entry
-	return access_points
-
-if __name__ == "__main__":
-	datos_redes = ObtieneRedes('eth1')
-	print datos_redes

Property changes on: wifi-ltsp/trunk/parsehostapd/escanea.py
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: wifi-ltsp/trunk/transformaArchivos.py
===================================================================
--- wifi-ltsp/trunk/transformaArchivos.py	(revision 528)
+++ wifi-ltsp/trunk/transformaArchivos.py	(nonexistent)
@@ -1,383 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Project:     wifi-ltsp
-# Module:     transformaArchivos.py
-# Purpose:     Genera archivo de macs con horarios desde Rayuela y Ldap
-# Language:    Python 2.5
-# Date:        03-Feb-2011.
-# Ver:        07-Feb-2011.
-# Author:    Francisco Mora Sánchez
-# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
-#
-# wifi-ltsp is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# Script2 is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
-
-""" Programa para generar los archivos necesarios para permitir
-que los portátiles de los alumnos puedan unirse al punto de acceso
-hostapd del profesor, según el horario del propio profesor, y los
-alumnos que tienen clase con él a esa hora.
-
-Partiremos de los archivos de datos generados por Rayuela, el formato
-de estos archivos es: por cada centro hay un directorio con cinco archivos
-uno por cada día de la semana, llamados Lunes.txt, Martes.txt, Miercoles.txt,
-Jueves.txt y Viernes.txt. Cada uno de estos archivos de texto contienen 
-la siguiente información:
-
-D.N.I. del docente|N.I.A. del alumno|Hora de inicio|Hora de fin
-08848648L|3251023|815|870|
-08848648L|3383767|815|870|
-08848648L|3383770|815|870| 
-
-la primera línea indica la estructura y a partir de ésta están los datos
-que son: dni del profesor, nie del alumno y horas de inicio y fin expresadas
-como minutos transcurridos desde las 00:00 horas.
-
-Los ficheros que se generan, deben copiarse al directorio de destino
-especificado como parámetro, y que en caso de no darse será por defecto
-"/var/www/wifi/(lunes.txt|martex.txt|miercoles.txt|jueves.txt|viernes.txt)"
-si la ruta no existe, ésta se creará. Para escribir en el destino debemos
-tener los privilegios adecuados.
-
-Los archivos que generaremos, tendrán el mismo nombre, sin mayúsculas, pero
-el formato será el siguiente:
-
-login_profesor|mac_alumno|inicio|fin|
-
-no tenemos línea descriptora de estructura, y los datos se obtienen de
-realizar consulta al directorio ldap del centro, para lo cual es necesario
-que tengamos instalado el paquete python-ldap, además de python, claro está.
-El dato de login_profesor es directo en la consulta a ldap, así como la 
-generación de las horas y minutos, pero el dato de mac_alumno, se realiza
-consultando ldap para obtener el login del alumno, que concuerda con el
-nombre del portátil asignado al alumno. A partir de este dato accederemos
-a la información recogida por puppet de cada ordenador, que se encuentra
-en /var/lib/puppet/yaml/node/(login_del_alumno.dominiodelcentro).yaml, 
-para obtener la mac de la interfaz wifi asociada a ese portátil. Las
-líneas importantes son: macaddress_wlan0 o macaddress_eth1 que se
-establece en algunos modelos de portátiles.
-
-Uso: crearemos una carpeta donde copiaremos este programa y además 
-pondremos los txts obtenidos por Rayuela, ejecutaremos el script pasando
-como parámetros el lugar donde están los archivos con el parámetro
---datosrayuela rutarayuela, y tambien el lugar donde queremos depositar los
-archivos generados, con el parámetros --datosservidor rutaservidor.
-Si --datosrayuela no se establece, asumiremos el directorio actual, si
---datosservidor no está establecido, se establecerá internamente en
-/var/www/wifi, creando la estructura de directorios mencionada si es que 
-no existe, además comprobaremos que disponemos de privilegios para escribir
-en el directorio de destino.
-
-Francisco Mora Sánchez
-IES Maestro Juan Calero
-adminies.maestrojuancalero@edu.juntaextremadura.net
-
-
-"""
-
-import sys,os,re
-import ldap
-
-# Expresiones Regulares.
-_re_mode = (re.I | re.M | re.S)
-macwlan0_pattern = re.compile('.*macaddress_wlan0: (.*?)\n', _re_mode)
-maceth1_pattern = re.compile('.*macaddress_eth1: (.*?)\n', _re_mode)
-
-			
-def EjecutaRegex(regex, cadena):
-    """ ejecuta búsqueda de expresión regular en una cadena """
-    m = regex.search(cadena)
-    if m:
-        return m.groups()[0]
-    else:
-        return None
-
-			
-def lee_parametros(lista,params):
-	"""Funcion que crea un diccionario para leer el valor de los 
-	parametros que se pasan en la linea de comandos."""
-	for i in range(1,len(lista)):
-		if lista[i][:2] == "--":
-			#veamos si tiene valor
-			if i+1 < len(lista) and lista[i+1] <> "--":
-				#estamos en un parametro y valor
-				params[lista[i][2:]] = lista[i+1]
-
-def dameDatosLineaRayuela(linea):
-	"""Funcion que trocea la linea de datos de rayuela y
-	devuelve un diccionario cuyas claves son login_profesor
-	login_alumno, inicio y final
-	"""
-	datos = linea.split("|")
-	return { "dni_profesor" : datos[0], "nie_alumno" : datos[1], "inicio" : datos[2], "final" : datos[3]}
-
-def consultaLdap(identificador, contra):
-	"""Función que consulta el servidor ldap, con el atributo
-	employeeNumber. Devuelve el login asociado al profesor o al alumno
-	"""
-	try:
-			l = ldap.open("ldap")
-			l.protocol_version = ldap.VERSION3
-			usuario = 'cn=Admin,ou=People,dc=instituto,dc=extremadura,dc=es'
-			l.simple_bind(usuario, contra)
-			
-	except ldap.LDAPError, e:
-			print e
-			return "ERRORLDAP"
-	
-	base_dn='ou=People,dc=instituto,dc=extremadura,dc=es'
-	searchFilter = '(employeeNumber='+identificador+')'
-	searchScope = ldap.SCOPE_SUBTREE
-	
-	retrieveAttributes = ['uid']
-	
-	try:
-		ldap_result_id = l.search(base_dn, searchScope, searchFilter, retrieveAttributes)
-		result_type, result_data = l.result(ldap_result_id, 0)
-		if len(result_data)==0:
-			#print "la búsqueda no da ningún resultado"
-			return "NO ENCONTRADO"
-		elif len(result_data)>1:
-			#print "La búsqueda da más de un resultado"
-			resultado= result_data[0]
-		else:
-			resultado=result_data[0]
-			
-		#print resultado[1]['uid'][0]
-	except ldap.LDAPError, e:
-			print e
-			print "ERRORLDAP"
-
-	return resultado[1]['uid'][0]
-
-def obtenerMac(login_alumno, archivosYaml, datosyaml):
-	"""Función que dado un login de alumno, buscará en el archivo yaml
-	de puppet asociado a ese login de alumno, la cadena macaddress_wlan0,
-	o bien macaddress_eth1 en caso que no exista la primera. Esta función
-	quizá se deba testear bien.
-	Tenemos disponible la lista archivosYaml con todos los archivos yaml
-	de puppet, incluyendo sus rutas...
-	"""
-	#Primero buscamos el archivo en cuestion, tendrá el login_alumno mas
-	#un punto, dominio, punto y terminación yaml, busquemos el patrón con dos puntos
-	#ya que suele haber archivos fantasmas con el nombre solamente.
-	for a in archivosYaml:
-		if a.count(".") == 2:
-			#Estamos en un patrón de archivo correcto.
-			pos = a.find(".")
-			sufijo = a[pos:]
-			break
-			
-	archivoDatosYaml = login_alumno + sufijo
-	try:
-		filearchivoDatosYaml = open(os.path.join(datosyaml,archivoDatosYaml), "r")
-	except:
-		pass
-		return "99:99:99:99:99:99"
-	contenidoyaml = filearchivoDatosYaml.read()
-	filearchivoDatosYaml.close() 
-	#print contenidoyaml
-	mac = EjecutaRegex(macwlan0_pattern, contenidoyaml)
-	if mac == None:
-		mac = EjecutaRegex(maceth1_pattern, contenidoyaml)
-	#print mac
-	if mac == None:
-		mac = "99:99:99:99:99:99"
-	return mac
-	
-def transformaHora(datohora):
-	"""Función que pasado un parámetro numérico que almacena los minutos
-	desde las 00:00. 
-	Devuelve una cadena en la forma "08:35", con la hora y los minutos.
-	"""
-	hora = datohora // 60
-	minutos = datohora % 60
-	return "%02d%02d" % (hora,minutos)
-	
-def transformaArchivos(datosrayuela, datosservidor, datosyaml, contra, debug = False):
-	#Comprobemos la existencia del directorio de datos de Rayuela
-	if not os.path.exists(datosrayuela):
-		if debug:
-			print "Directorio para datos de rayuela",datosrayuela,"no existe, abortando ejecución..."
-		return 1
-
-	#Comprobemos que sea un directorio
-	if not os.path.isdir(datosrayuela):
-		if debug:
-			print "Directorio para datos de rayuela",datosrayuela,"no es un directorio, abortando ejecución..."
-		return 2
-		
-	#Comprobemos que tengamos permisos de apertura y lectura de archivos
-	if os.path.isdir(datosrayuela):
-		try:
-			archivosRayuela = os.listdir(datosrayuela)
-		except:
-			if debug:
-				print "Directorio para datos de rayuela",datosrayuela,"problemas de permisos en carpeta, abortando ejecución..."
-			return 3
-
-	#Comprobemos que existe el directorio de destino
-	if not os.path.exists(datosservidor):
-		#No existe directorio de destino, debemos crearlo
-		if debug:
-			print "No existe directorio de destino en servidor",datosservidor,"se intentará crear directorio..."
-		try:
-			os.makedirs(datosservidor)
-		except OSError:
-			if debug:
-				print "Hay algún problema con la creación del directorio de destino, abortando ejecución..."
-			return 4
-	
-	#Comprobemos que tenemos permisos de escritura 
-	if os.path.exists(datosservidor):
-		if not os.access(datosservidor, os.W_OK):
-			if debug:
-				print "Hay algún problema de permisos para la creación de archivos en el directorio de destino del servidor, abortando ejecución..."
-			return 5
-
-	#Comprobemos la existencia del directorio de datos yaml de puppet
-	if not os.path.exists(datosyaml):
-		if debug:
-			print "Directorio para datos yaml de puppet",datosyaml,"no existe, abortando ejecución..."
-		return 6
-
-	#Comprobemos que sea un directorio
-	if not os.path.isdir(datosyaml):
-		if debug:
-			print "Directorio para datos yaml de puppet",datosyaml,"no es un directorio, abortando ejecución..."
-		return 7
-		
-	#Comprobemos que tengamos permisos de apertura y lectura de archivos
-	if os.path.isdir(datosyaml):
-		try:
-			#archivosYaml = glob.glob(os.path.join(params["datosyaml"],"*.*.yaml"))
-			archivosYaml = os.listdir(datosyaml)
-		except:
-			if debug:
-				print "Directorio para datos yaml de puppet",datosyaml,"problemas de permisos en directorio, abortando ejecución..."
-			return 8
-			
-	#Limpiemos las listas de archivos 
-	#Tengamos en cuenta que los archivos entregados por rayuela pueden contener distinto patron en mayusculas y minusculas
-	dicArchivosRayuela = {"lunes.txt":"","martes.txt":"","miercoles.txt":"","jueves.txt":"","viernes.txt":""}
-	for archivoRayuela in archivosRayuela:
-		if archivoRayuela.lower() in dicArchivosRayuela.keys():
-			dicArchivosRayuela[archivoRayuela.lower()] = archivoRayuela
-
-	archivosYaml = [ archivo for archivo in archivosYaml if archivo[-5:] == ".yaml"]
-	#print archivosRayuela
-	#print archivosYaml
-	#Para evitar consultar al servidor ldap varias veces para un mismo dni o nie crearemos 
-	#dos diccionarios, uno para profesores y otro para alumnos con los datos que
-	#recuperaremos del servidor ldap, además otro con los logins de alumnos y
-	#las macs
-	#profesores = { "dni" : "login_profesor", ... }
-	#alumnos = { "nie" : "login_alumno", ... }
-	#macs = { "login_alumno" : "mac", ... }
-	profesores = {}
-	alumnos = {}
-	macs = {}
-	#Procesemos cada archivo de Rayuela
-	for archivoRayuela in dicArchivosRayuela.keys():
-		if debug:
-			print "Procesando archivo",os.path.join(datosrayuela,dicArchivosRayuela[archivoRayuela])
-		filearchivoRayuela = open(os.path.join(datosrayuela,dicArchivosRayuela[archivoRayuela]), 'r')
-		archivoServidor = os.path.join(datosservidor,archivoRayuela)
-		if debug:
-			print "Generando archivo",archivoServidor
-		filearchivoServidor = open(archivoServidor, 'w')
-		while True:
-			linea = filearchivoRayuela.readline()
-			if not linea:
-				break
-			if not linea[:1].isdigit():
-				continue
-			#Procesemos cada linea de Rayuela
-			#datosLineaRayuela es un diccionario cuyas claves son dni_profesor, nie_alumno, inicio, final
-			datosLineaRayuela = dameDatosLineaRayuela(linea)
-			datosLineaServidor = ""			
-			#Consultemos el login del profesor en ldap por su dni y el nie del alumno
-			#comprobando que no lo hemos encontrado previamente
-			dni_profesor=datosLineaRayuela["dni_profesor"]
-			if profesores.has_key(dni_profesor):
-				login_profesor = profesores[dni_profesor]
-				#if debug:
-				#	print "Nooooo se consulta a ldap, profesor dni",datosLineaRayuela["dni_profesor"],"pertenece a",login_profesor
-			else:
-				login_profesor = consultaLdap(dni_profesor, contra)
-				if login_profesor=="NO ENCONTRADO":
-					login_profesor = consultaLdap(dni_profesor[1:], contra)
-				profesores[dni_profesor] = login_profesor
-				if debug:
-					print "Se consulta a ldap, profesor dni",datosLineaRayuela["dni_profesor"],"pertenece a",login_profesor								
-			if alumnos.has_key(datosLineaRayuela["nie_alumno"]):
-				login_alumno = alumnos[datosLineaRayuela["nie_alumno"]]
-				#if debug:
-				#	print "Nooooo se consulta a ldap, alumno nie",datosLineaRayuela["nie_alumno"],"pertenece a",login_alumno
-			else:
-				login_alumno = consultaLdap(datosLineaRayuela["nie_alumno"], contra)
-				alumnos[datosLineaRayuela["nie_alumno"]] = login_alumno
-				if debug:
-					print "Se consulta a ldap, alumno nie",datosLineaRayuela["nie_alumno"],"pertenece a",login_alumno
-
-			if macs.has_key(login_alumno):
-				mac_alumno = macs[login_alumno]
-				#if debug:
-				#	print "Nooooo se consultan datos yaml, alumno login",login_alumno,"tiene mac",mac_alumno
-			else:
-				mac_alumno = obtenerMac(login_alumno, archivosYaml, datosyaml)
-				#mac_alumno = obtenerMac("dmoral01", archivosYaml, datosyaml)
-				macs[login_alumno] = mac_alumno
-				if debug:
-					print "Se consultan datos yaml, alumno login",login_alumno,"tiene mac",mac_alumno
-			inicio = transformaHora(int(datosLineaRayuela["inicio"]))
-			final = transformaHora(int(datosLineaRayuela["final"]))
-			datosLineaServidor = login_profesor+"|"+mac_alumno+"|"+str(inicio)+"|"+str(final)+"|"+"\n"			
-			#datosLineaServidor = login_profesor+"|"+mac_alumno+"|"+datosLineaRayuela["inicio"]+"|"+datosLineaRayuela["final"]+"|"+"\n"			
-			if debug:
-				print datosLineaServidor
-			filearchivoServidor.write(datosLineaServidor)
-		filearchivoRayuela.close()
-		filearchivoServidor.close()
-	return 0
-
-if __name__ == '__main__':
-	params = {}
-	lista = sys.argv
-	lee_parametros(lista,params)
-	#comprobaremos las combinaciones de parametros en linea de comandos
-	if len(lista) == 2 and lista[1] == "--help":
-		print 'uso: ./transformaArchivos.py [--datosrayuela rutadatosrayuela] [--datosservidor rutadatosservidor] [--datosyaml rutadatosyaml] [--contra contraadminldap]'
-		sys.exit(1)
-	if not params.has_key("contra"):
-		print "No se ha establecido la contraseña del administrador ldap..."
-		sys.exit(2)			
-	if not params.has_key("datosrayuela"):
-		print "No se ha establecido la ruta a la carpeta con los datos de rayuela, usando por defecto '"+os.getcwd()+"'"
-		params["datosrayuela"] = os.getcwd()
-	if not params.has_key("datosservidor"):
-		print "No se ha establecido la ruta dónde depositar los archivos generados, usando por defecto '/var/www/wifi'"
-		params["datosservidor"] = "/var/www/wifi"
-	if not params.has_key("datosyaml"):
-		print "No se ha establecido la ruta dónde se encuentran los datos yaml de puppet, usando por defecto '/var/lib/puppet/yaml/node'"
-		params["datosyaml"] = "/var/lib/puppet/yaml/node"
-
-	print
-	print "Los valores pasado son los siguientes:"
-	print "Directorio de datos de Rayuela:",params["datosrayuela"]
-	print "Directorio de datos de para el servidor:",params["datosservidor"]
-	print "Directorio de datos yaml de puppet:",params["datosyaml"]
-
-	resultado = transformaArchivos(params["datosrayuela"], params["datosservidor"], params["datosyaml"], params["contra"], True)
-	if resultado > 0:
-		print "Se ha producido errores en el procesamiento, código de error",resultado
-	else:
-		print "Se ha ejecutado correctamente"
-	exit(resultado)

Property changes on: wifi-ltsp/trunk/transformaArchivos.py
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: wifi-ltsp/trunk/autoriza-wifi.desktop
===================================================================
--- wifi-ltsp/trunk/autoriza-wifi.desktop	(revision 528)
+++ wifi-ltsp/trunk/autoriza-wifi.desktop	(nonexistent)
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Name=Autoriza WiFi Guardias
-Comment=El profesor de guardia puede simular otro profesor del centro
-Exec=autorizaWifiGuardias.py
-Icon=network-wireless
-Terminal=false
-Type=Application
-StartupNotify=true
-Categories=GNOME;GTK;Settings;X-GNOME-NetworkSettings;
-OnlyShowIn=GNOME;
Index: wifi-ltsp/trunk/debian/postinst
===================================================================
--- wifi-ltsp/trunk/debian/postinst	(revision 528)
+++ wifi-ltsp/trunk/debian/postinst	(nonexistent)
@@ -1,9 +0,0 @@
-#! /bin/sh
-
-set -e
-
-if ! grep configura_hostapd.py  /etc/sudoers > /dev/null ; then
-	echo "%teachers  ALL = NOPASSWD: /usr/bin/configura_hostapd.py" >> /etc/sudoers
-	chmod 0440 /etc/sudoers
-fi
-
Index: wifi-ltsp/trunk/debian/compat
===================================================================
--- wifi-ltsp/trunk/debian/compat	(revision 528)
+++ wifi-ltsp/trunk/debian/compat	(nonexistent)
@@ -1 +0,0 @@
-5
Index: wifi-ltsp/trunk/debian/postrm
===================================================================
--- wifi-ltsp/trunk/debian/postrm	(revision 528)
+++ wifi-ltsp/trunk/debian/postrm	(nonexistent)
@@ -1,8 +0,0 @@
-#!/bin/sh -e
-if  grep configura_hostapd  /etc/sudoers > /dev/null ; then
-	sed -i -r -e '/configura_hostapd/d' /etc/sudoers
-	chmod 0440 /etc/sudoers
-fi
-
-exit 0
-
Index: wifi-ltsp/trunk/debian/install
===================================================================
--- wifi-ltsp/trunk/debian/install	(revision 528)
+++ wifi-ltsp/trunk/debian/install	(nonexistent)
@@ -1 +0,0 @@
-autoriza-wifi.desktop usr/share/applications
Index: wifi-ltsp/trunk/debian/changelog
===================================================================
--- wifi-ltsp/trunk/debian/changelog	(revision 528)
+++ wifi-ltsp/trunk/debian/changelog	(nonexistent)
@@ -1,31 +0,0 @@
-wifi-ltsp (0.5-1) unstable; urgency=low
-
-  * Nueva versión para ordenadores con Debian Squeeze
-  * Si no se le pasa parámetro a configura_hostapd.py no crea las macs
-
- -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Thu, 24 Nov 2011 12:47:54 +0100
-
-wifi-ltsp (0.4-1) unstable; urgency=low
-
-  * Autoriza wifi para guardias
-
- -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Mon, 21 Mar 2011 18:05:33 +0100
-
-wifi-ltsp (0.3-1) unstable; urgency=low
-
-  * Contempla alguna posibilidad más
-
- -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Wed, 16 Feb 2011 12:42:31 +0100
-
-wifi-ltsp (0.2-1) unstable; urgency=low
-
-  * Corregidos bugs detectados en pruebas
-
- -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Fri, 11 Feb 2011 11:03:17 +0100
-
-wifi-ltsp (0.1-1) unstable; urgency=low
-
-  * First version
-
- -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Wed, 09 Feb 2011 12:42:48 +0100
-
Index: wifi-ltsp/trunk/debian/copyright
===================================================================
--- wifi-ltsp/trunk/debian/copyright	(revision 528)
+++ wifi-ltsp/trunk/debian/copyright	(nonexistent)
@@ -1,30 +0,0 @@
-This package was debianized by José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net> on
-Wed, 09 Feb 2011 12:42:48 +0100.
-
-
-Upstream Authors:   José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net>
-                    Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
-                    Isabel Aparicio Pérez <prog5pe@edu.juntaextremadura.net>
-
-Copyright:
-
-    Copyright (C) 2011 José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net>,
-                            Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
-                            Isabel Aparicio Pérez <prog5pe@edu.juntaextremadura.net>
-    
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-On Debian GNU/Linux systems, the complete text of the GNU General
-Public License can be found in `/usr/share/common-licenses/GPL'.
Index: wifi-ltsp/trunk/debian/rules
===================================================================
--- wifi-ltsp/trunk/debian/rules	(revision 528)
+++ wifi-ltsp/trunk/debian/rules	(nonexistent)
@@ -1,50 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-
-build: build-stamp
-
-build-stamp:
-	dh_testdir
-	touch build-stamp
-
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-stamp configure-stamp 
-	rm -Rf build
-
-	dh_clean 
-
-install: build
-	dh_testdir
-	dh_testroot
-	dh_clean -k 
-	dh_installdirs
-	python setup.py install --prefix=/usr --install-layout=deb  --root=$(CURDIR)/debian/wifi-ltsp
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-	dh_testdir
-	dh_testroot
-	dh_installchangelogs 
-	dh_installdocs
-	dh_installman 
-	dh_install
-	dh_python2
-	dh_compress
-	dh_fixperms
-	dh_installdeb
-	dh_shlibdeps
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-# Build architecture-dependent files here.
-binary-arch: build install
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install

Property changes on: wifi-ltsp/trunk/debian/rules
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: wifi-ltsp/trunk/debian/control
===================================================================
--- wifi-ltsp/trunk/debian/control	(revision 528)
+++ wifi-ltsp/trunk/debian/control	(nonexistent)
@@ -1,19 +0,0 @@
-Source: wifi-ltsp
-Section: admin
-Priority: optional
-Maintainer: José L. Redrejo Rodríguez <jredrejo@debian.org>
-Standards-Version: 3.8.2
-Build-Depends: debhelper (>= 5.0.37.2), python-support (>= 0.3)
-Build-Depends-Indep: python
-Homepage:http://desarrollo.educarex.es/linex/projects/servidoressecundaria/repository/show/wifi-ltsp
-
-Package: wifi-ltsp
-Architecture: all
-Depends: ${python:Depends}, hostapd
-Description: Hostapd auto configuration
- Configura automáticamente hostapd en función de la información 
- recibida desde el servidor del centro con los horarios de los 
- profesores.
- .
- Escoje el mejor canal wifi disponible, autoriza a los alumnos 
- correspondientes, coloca el essid del aula y reinicia hostapd
Index: wifi-ltsp/trunk/debian/dirs
===================================================================
--- wifi-ltsp/trunk/debian/dirs	(revision 528)
+++ wifi-ltsp/trunk/debian/dirs	(nonexistent)
@@ -1,2 +0,0 @@
-usr/bin
-usr/share/applications
Index: wifi-ltsp/trunk/autorizaWifiGuardias.py
===================================================================
--- wifi-ltsp/trunk/autorizaWifiGuardias.py	(revision 528)
+++ wifi-ltsp/trunk/autorizaWifiGuardias.py	(nonexistent)
@@ -1,251 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Project:     wifi-ltsp
-# Module:     autorizaWifiGuardias.py
-# Purpose:     se usará por el profesor de guardia, y se seleccionará
-#				el profesor con clase en ese grupo y ese momento para
-#				activar el wifi de los portátiles de los alumnos.
-# Language:    Python 2.5
-# Date:        07-Mar-2011.
-# Ver:        07-Mar-2011.
-# Author:    Francisco Mora Sánchez
-# Copyright:   2011 - Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
-#
-# wifi-ltsp is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# autorizaWifiGuardias is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
-
-""" Este programa muestra una lista con los profesores que tienen clase
-a la hora actual, cuando seleccionamos uno de ellos se ejecuta el módulo
-demonio configura_hostapd.py utilizando como parámetro el login del profesor
-seleccionado, que  tendrá clase con ese grupo a esa hora, aunque el profesor
-de guardia haya iniciado con su propio login. El módulo sólo se ejecuta
-si el usuario pertenece al grupo teachers. Para llevar a cabo la acción
-se necesita que el módulo configura_hostapd.py, que se ejecuta como root
-en el postlogin de gdm para cada usuario, tenga permisos de ejecución root
-llevándose a cabo esto utilizando el archivo /etc/sudoers, añadiendo una
-línea como:
-
-%teachers ALL=NOPASSWD: /usr/bin/configura_hostapd.py
-
-Procesa el archivo /wifi/horario.txt y genera un diccionario con los
-logins de profesores que tienen clase a la hora actual, adicionalmente
-consultamos ldap para confeccionar el nombre del profesor, con sus 
-nombres y apellidos, de forma que en la caja de selección aparecerán 
-los nombres completos en forma Apellidos, Nombre o bien el login
-del profesor. Tenemos que tener en cuenta que el archivo 
-/wifi/horario.txt ya existe en la ruta, ya que el script 
-configura_hostapd.py se ejecuta en el inicio y lo deja en el lugar 
-adecuado.
-
-Será responsabilidad de cada administrador o herramienta de gestión ldap
-que el atributo cn de cada objeto de la rama People, perteneciente a cada
-profesor, de ldap que sea un profesor, tenga el nombre en forma "humana".
-Tambien sería deseable que este atributo para los alumnos estuviese en
-esa forma.
-
-Francisco Mora Sánchez
-I.E.S. Maestro Juan Calero
-adminies.maestrojuancalero@edu.juntaextremadura.net
-
-"""
-
-import pygtk
-pygtk.require("2.0")
-import gtk
-import logging
-import subprocess
-import os
-import time
-import ldap
-
-LOG_FILENAME = "autorizaWifiGuardias.log"
-
-profesores = {}
-
-def hora_actual(fecha):
-	"""Con esta funcion se obtiene la hora actual del sistema sin los : de forma
-	que la 08:45 se representarancomo la 0845"""
-	hora= fecha[11:13]+fecha[14:16]
-	h=int(hora)
-	if (h<int(0000) or h>int(2500)):
-		logging.getLogger().error("El formato de la hora del sistema no es el esperado")
-		return "9999"
-	else:
-		return hora
-
-def procesahorario(profesores):
-	"""con esta funcion generamos el diccionario de profesores con clase a la hora actual,
-	además buscamos en el directorio ldap los valores cn en la rama people que deben
-	contener los nombres completos de los profesores
-	"""
-	if not os.path.exists("/wifi/horario.txt"):
-		logging.getLogger().error("No hay fichero /wifi/horario.txt en el servidor de aula")
-		return ""
-	
-	try:
-		horario = open("/wifi/horario.txt","r")
-	except:
-		logging.getLogger().error("Problemas para leer el archivo /wifi/horario.txt")
-		return ""
-	
-	hora = hora_actual(time.asctime())
-	#hora = "1241"
-	while True:
-		linea = horario.readline()
-		if not linea:
-			break
-		else:
-			lineasplit = linea.split("|")
-			profesor = lineasplit[0]
-			if hora>lineasplit[2] and hora<lineasplit[3]:
-				if  not profesores.has_key(profesor):
-					#print "Profesor en horario",profesor," hora",hora
-					profesores[profesor] = profesor
-	horario.close()
-	#ahora procesaremos el diccionario buscando en ldap los cn
-	l = ldap.initialize("ldap://ldap")
-	
-	base_dn='ou=People,dc=instituto,dc=extremadura,dc=es'
-	#searchFilter = '(uid='+identificador+')'
-	searchScope = ldap.SCOPE_SUBTREE
-	retrieveAttributes = ['cn']
-	
-	for profesor in profesores.keys():
-		nombre = profesor
-		try:
-			searchFilter = '(uid='+profesor+')'
-			ldap_result_id = l.search(base_dn, searchScope, searchFilter, retrieveAttributes)
-			result_type, result_data = l.result(ldap_result_id, 0)
-			if len(result_data)==0:
-				logging.getLogger().error("No encontrado en ldap..."+profesor)
-			else:
-				resultado=result_data[0]
-		except:
-			logging.getLogger().error("Error buscando en ldap..."+profesor)
-			continue
-		
-		profesores[profesor] = resultado[1]['cn'][0]
-	
-def userIsTeacher(teachersGroup='teachers'):   
-    p1 = subprocess.Popen(["id", "-Gn"], stdout=subprocess.PIPE)
-    p2 = subprocess.Popen(["grep", teachersGroup], stdin=p1.stdout, stdout=subprocess.PIPE)
-    output = p2.communicate()[0]
-    return (output != '')	
-
-class AutorizaWifiGuardias(): 
-
-	def delete_event(self, widget, event, data=None):
-		print "delete event occurred"
-		#con false se cierra la ventana principal, con true no
-		return False
-		
-	def destroy(self, widget, data=None):
-		gtk.main_quit()
-
-	def create_model(self):
-		store = gtk.ListStore(str, str)
-		procesahorario(profesores)
-		for profesor in profesores.keys():
-			store.append([profesores[profesor], profesor])
-		return store
-		
-	def create_columns(self, treeView):
-		rendererText = gtk.CellRendererText()
-		column = gtk.TreeViewColumn("Nombre y Apellidos", rendererText, text=0)
-		column.set_sort_column_id(0)
-		treeView.append_column(column)
-		
-		rendererText = gtk.CellRendererText()
-		column = gtk.TreeViewColumn("Login del profesor", rendererText, text=1)
-		column.set_sort_column_id(1)
-		treeView.append_column(column)
-		
-	def on_activated(self, widget, row, col):
-		model = widget.get_model()
-		try:
-			p = subprocess.Popen(["/usr/bin/sudo", "/usr/bin/configura_hostapd.py", model[row][1]])
-		except OSError, e:
-			logging.getLogger().error("Hay problemas al ejecutar comando activación WIFI")
-			self.statusbar.push(0, 'Hay algún problema al activar WIFI')
-			return
-		self.statusbar.push(0, 'Activado WIFI profesor '+model[row][0])
-			
-	def win_close(self, widget, event, data):
-		dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO, "¿Quieres salir realmente?")
-		dialog.set_title("Atención")
-		response = dialog.run()
-		dialog.destroy()
-		if response == gtk.RESPONSE_YES:
-			return False
-		else:
-			return True
-
-	def no_profesor(self, widget):
-		logging.getLogger().error("Ejecutando programa usuario no profesor")
-		md = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, 
-				gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, "Sólo los profesores pueden ejecutar esta aplicación")
-		md.run()
-		md.destroy()
-
-	def __init__(self):
-		#super(AutorizaWifiGuardias, self).__init__()
-		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-		
-		if not userIsTeacher():
-			logging.getLogger().error("Ejecutando programa usuario no profesor")	
-			self.no_profesor(self)
-			self.window.connect('event-after', gtk.main_quit) 
-			
-		self.window.set_size_request(500, 600)
-		self.window.set_position(gtk.WIN_POS_CENTER)
-		
-		self.window.connect("destroy", self.destroy)
-		self.window.connect("delete-event", self.win_close, None)
-		self.window.set_title("Autorización WIFI profesores de guardia")
-		
-		self.vbox = gtk.VBox(False, 8)
-		
-		self.label = gtk.Label()
-		self.label.set_markup("<b>Haz doble click en profesor sustituido</b>")
-		self.vbox.pack_start(self.label, False, False, 0)
-		
-		self.sw = gtk.ScrolledWindow()
-		self.sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
-		self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		
-		self.vbox.pack_start(self.sw, True, True, 0)
-		
-		self.store = self.create_model()
-		
-		self.treeView = gtk.TreeView(self.store)
-		self.treeView.connect("row-activated", self.on_activated)
-		self.treeView.set_rules_hint(True)
-		self.sw.add(self.treeView)
-		
-		self.create_columns(self.treeView)
-		
-		self.statusbar = gtk.Statusbar()
-		self.vbox.pack_start(self.statusbar, False, False, 0)
-		
-		self.window.add(self.vbox)
-		self.window.show_all()
-
-def main():
-	logging.basicConfig(level=logging.DEBUG,
-		format='%(asctime)s %(levelname)-8s %(message)s',
-		datefmt='%a, %d %b %Y %H:%M:%S',
-		filename=LOG_FILENAME,
-		filemode='w')
-		
-	AutorizaWifiGuardias()
-	gtk.main()
-
-main()

Property changes on: wifi-ltsp/trunk/autorizaWifiGuardias.py
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: wifi-ltsp/trunk/configura_hostapd.py
===================================================================
--- wifi-ltsp/trunk/configura_hostapd.py	(revision 528)
+++ wifi-ltsp/trunk/configura_hostapd.py	(nonexistent)
@@ -1,245 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Project:     wifi-ltsp
-# Module:     configura_hostapd.py
-# Purpose:     genera un archivo hostapc.accept para dar acceso a internet a los alumnos.
-# Language:    Python 2.5
-# Date:        07-Feb-2011.
-# Ver:        07-Feb-2011.
-# Author:    Isabel Aparicio Pérez
-# Copyright:   2011 - Isabel Aparicio Pérez    <prog5pe@edu.juntaextremadura.net>
-#
-# wifi-ltsp is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# Script2 is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
-
-""" Este programa genera el archivo hostapd.access necesario para que en el momento del logueo del
-profesor se de acceso a internet a los alumnos que tienen clase en esa hora con ese profesor. Para ello
-tenemos que recoger el dia de la semana y la hora actual que tiene el servidor de aula y con el dia actual
-buscar en el servidor nfs el fichero del dia de la semana que corresponde con el dia concreto. El fichero
-descargado del servidor nfs se almacena en el servidor de aula en la ruta /wifi con el nombre horario.txt.
-Tambien controlamos el usuario que esta logueado en ese preciso momento en el servidor. A partir del usuario
-logueado, de la hora del sistema y del fichero descargado del servidor nfs se genera el fichero hostapd.access 
-con las mac de los alumnos correspondientes.
-
-Isabel Aparicio Pérez
-Consejería de Educacion.
-prog5pe@edu.juntaextremadura.net
-
-"""
-
-import time
-import urllib
-import os
-import sys
-from parsehostapd import parsehostapd
-import socket
-import logging
-import subprocess
-from shutil import copy
-
-LOG_FILENAME= "/var/log/configura-hostapd.log"
-fecha=[]
-ip=[]
-dia_semana={"Mon":"lunes.txt","Tue":"martes.txt","Wed":"miercoles.txt","Thu":"jueves.txt","Fri":"viernes.txt"}
-
-
-def dia_actual():
-    """con esta funcion se obtiene la fecha actual que tiene el servidor de aula"""
-    hoy = time.asctime() 
-    return hoy
-
-def fichero_semana(fecha1):	
-    """Con esta funcion se obtiene la parte de la fecha actual que corresponde con el dia de la semana"""
-    dia= fecha1[0:3]
-    if dia not in ["Mon","Tue","Wed","Thu","Fri"]:
-        logging.getLogger().error("El formato de la fecha del sistema no es el esperado")
-        return ""
-    else:
-        fichero=dia_semana[dia]
-    return fichero
-
-def hora_actual(fecha1):
-    """Con esta funcion se obtiene la hora actual del sistema sin los : de forma que la 08:45 se representaran
-    como la 0845"""
-    hora= fecha1[11:13]+fecha1[14:16]
-    h=int(hora)
-    if (h<int(0000) or h>int(2500)):
-        logging.getLogger().error("El formato de la hora del sistema no es el esperado")
-        return "9999"
-    else:
-        return hora
-	
-
-def descargar_fichero(fichero):
-    """funcion que se encarga de descargar el fichero del dia de la semana correspondiente al dia actual del
-    servidor nfs y colocarlo en la ubicacion correcta en el servidor de terminales con el nombre de horario.txt"""
-    archivo="http://servidor/wifi/"+fichero
-    print archivo
-    destino="/wifi/horario.txt"
-    destino2="/wifi"
-    if not os.path.exists(destino2):
-        logging.getLogger().debug("La ruta destino no existe y hay que crearla")
-        try:
-            os.makedirs(destino2)
-        except OSError:
-            logging.getLogger().error("Hay algun error a la hora de crear el directorio /wifi en el servidor de aula")
-    try:
-        urllib.urlretrieve(archivo, destino)
-    except:
-        logging.getLogger().error("No hay acceso al servidor para encontrar el fichero de horario")
-        return ""
-    return destino
-
-
-def devuelve_usuario():
-    """con esta funcion recogemos el usuario que esta logueado en ese momento en el ordenador, seguira intentandolo 
-    hasta que se loguee antes"""
-    resultado = sys.argv[1]
-    return resultado
-	
-def crea_hostapd(destino,resultado,hora):
-    """con esta funcion generamos el fichero hostapd con las mac correspondientes a los alumnos a los que se 
-    les va a dar acceso a internet y lo colocamos en la ruta correcta."""
-    if not os.path.exists(destino):
-        logging.getLogger().error("Hay un error el el fichero horario.txt en el servidor de aula")
-        return ""
-    else:
-        try:
-            copy("/etc/hostapd/hostapd.accept","/etc/hostapd/hostapd.accept.bak")
-        except:
-            pass
-        f=open(destino,"r")
-    if not os.path.exists("/etc/hostapd"):
-        try:
-            os.makedirs("/etc/hostapd")
-        except IOError:
-            logging.getLogger().error("Ha habido algun error a la hora de crear el directorio /etc/hostapd")
-            return ""
-    if not os.access("/etc/hostapd", os.W_OK):
-        logging.getLogger().error("No tiene permisos de escritura sobre el directorio /etc/hostapd")
-        return ""
-    else:
-        g=open("/etc/hostapd/hostapd.accept","w")
-        
-    esta_en_horario=False
-    while True:
-        dato=f.readline()
-        if not dato:
-            break 
-        else:
-            lin=dato.split("|")
-            if lin[0]==resultado:   
-                if hora>lin[2] and hora<lin[3]:
-                    g.write(lin[1])
-                    g.write("\n")
-                    esta_en_horario=True
-    f.close()
-    g.close()
-
-    #si un profesor de guardia hace login, se autorizan automáticamente los 
-    #alumnos que hubiera autorizado el profesor anterior:
-    if not esta_en_horario:
-        try:
-            copy("/etc/hostapd/hostapd.accept.bak","/etc/hostapd/hostapd.accept")
-        except:
-            pass
-
-    return g
-
-def inicia_hostapd():
-    subprocess.Popen(["ifconfig","wlan0","up"])
-    subprocess.Popen(["invoke-rc.d","hostapd","restart"])
-
-def userIsTeacher(user_name):   
-    p1 = subprocess.Popen(["id", "-Gn",user_name], stdout=subprocess.PIPE)
-    p2 = subprocess.Popen(["grep", 'teachers'], stdin=p1.stdout, stdout=subprocess.PIPE)
-    output = p2.communicate()[0]
-    return (output != '')	
-
-if  __name__ == '__main__':
-    logging.basicConfig(level=logging.DEBUG,
-                format='%(asctime)s %(levelname)-8s %(message)s',
-                datefmt='%a, %d %b %Y %H:%M:%S',
-                filename=LOG_FILENAME)
-                
-    if len(sys.argv)>1:                    
-        dia_hoy=""
-        hora=""
-        user=""
-        fich=""
-        hos=""
-        res=""
-        f=""
-
-        dia_hoy=dia_actual()
-        hora=hora_actual(dia_hoy)
-        fich=fichero_semana(dia_hoy)
-        f=descargar_fichero(fich)
-        if f!="":
-            user=devuelve_usuario()
-            if userIsTeacher(user):
-                hos=crea_hostapd(f,user,hora) 
-            else: #login de un alumno
-                subprocess.Popen(["invoke-rc.d","hostapd","stop"]).wait()
-                sys.exit(0)
-        
-        if hos=="":
-            logging.getLogger().error("Error al generar las mac autorizadas")
-
-
-    #Aquí metemos ahora la reconfiguración de hostapd.conf con la parte
-    #hecha por Francisco Mora
-    hostapdconf="/etc/hostapd/hostapd.conf"
-
-    canaloptimo = parsehostapd.selectbestchannel(True)
-
-    ssid = socket.gethostname()
-    pos = ssid.find(".")
-    if pos > -1:
-        ssid = ssid[:pos]
-    pos = ssid.find("-pro")
-    if pos > -1:
-        ssid = ssid[:pos]
-    try:
-        #Abre el archivo para lectura de datos
-        archivoLectura = open(hostapdconf,"r")
-        lineas = archivoLectura.readlines()
-        archivoLectura.close()
-    except (RuntimeError, TypeError, NameError, IOError):
-        logging.getLogger().error("Error en la ubicacion o nombre del archivo")
-        sys.exit(0) #salimos con 0 para no fastidiar gdm
-    #Modifica la cadena del channel y ssid
-    encontradoChannel = False
-    encontradoSsid = False
-    for numlinea in range(0, len(lineas)):
-        linea = lineas[numlinea]
-        #comprobamos si estamos en channel o en ssid
-        if linea[:7] == "channel":
-            encontradoChannel = True
-            lineas[numlinea] = "channel="+str(canaloptimo)+"\n"
-        if linea[:4] == "ssid":
-            encontradoSsid = True
-            lineas[numlinea] = "ssid="+ssid+"\n"
-    if not encontradoChannel:
-        lineas.append("channel="+str(canaloptimo)+"\n")
-    if not encontradoSsid:
-        lineas.append("ssid="+ssid+"\n")
-            
-    #Abre el archivo para escritura de datos
-    archivoEscritura = open(hostapdconf,"w")
-    archivoEscritura.writelines(lineas)
-    archivoEscritura.close()
-    logging.getLogger().debug('Establecido el canal %s con ESSID %s' %   (canaloptimo,ssid))
-
-
-
-    res=inicia_hostapd()
-

Property changes on: wifi-ltsp/trunk/configura_hostapd.py
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Deleted: svn:mergeinfo
## -0,0 +0,0 ##
Index: wifi-ltsp/trunk/setup.py
===================================================================
--- wifi-ltsp/trunk/setup.py	(revision 528)
+++ wifi-ltsp/trunk/setup.py	(nonexistent)
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from distutils.core import setup
-import os
-
-datafiles = []
-
-
-setup(name='wifi-ltsp',
-	version='0.1',
-	description='Archivos de configuración de hostapd con wifi',
-	long_description = """Really long text here.""",
-	author = 'José L. Redrejo Rodríguez, Francisco Mora Sánchez y Elisa Aparicio Pérez',
-	author_email = 'jredrejo@debian.org',
-	license = "GNU GPLv3",
-    packages=['parsehostapd'],
-	package_dir={'parsehostapd': 'parsehostapd/'},
-	url = 'http://desarrollo.educarex.es/linex/projects/servidoressecundaria/repository/show/wifi-ltsp',
-	# Those are going to be installed on /usr/bin/
-	scripts=['configura_hostapd.py','autorizaWifiGuardias.py'],
-
-	data_files=datafiles 
-    )
-
Index: limitar-https/trunk/iptables
===================================================================
--- limitar-https/trunk/iptables	(revision 528)
+++ limitar-https/trunk/iptables	(nonexistent)
@@ -1,34 +0,0 @@
-# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
-*filter
-:INPUT ACCEPT [8704860:9777713158]
-:FORWARD ACCEPT [55619:8261637]
-:OUTPUT ACCEPT [6140664:1872966901]
--A FORWARD -p tcp -m tcp --dport 445 -j LOG --log-prefix "win-gusano" 
--A FORWARD -p tcp -m tcp --dport 445 -j DROP 
--A FORWARD -p tcp -m tcp --dport 137 -j LOG --log-prefix "win-gusano" 
--A FORWARD -p tcp -m tcp --dport 137 -j DROP 
--A FORWARD -p tcp -m tcp --dport 139 -j LOG --log-prefix "win-gusano" 
--A FORWARD -p tcp -m tcp --dport 139 -j DROP 
-COMMIT
-# Completed on Wed Feb 13 10:54:53 2008
-# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
-*nat
-:PREROUTING ACCEPT [39355:4796594]
-:POSTROUTING ACCEPT [59346:4231171]
-:OUTPUT ACCEPT [54652:39474654]
--A PREROUTING -d 127.0.0.1 -i eth0 -p tcp -j ACCEPT 
--A PREROUTING -d IP-LDAP -i eth0 -p tcp -j ACCEPT 
--A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 
--A PREROUTING -i eth0 -p tcp -m tcp --dport 110 -j DNAT --to-destination 217.124.183.2
--A PREROUTING -i eth0 -p tcp -m tcp --dport 465 -j DNAT --to-destination 217.124.183.2
-COMMIT
-# Completed on Wed Feb 13 10:54:53 2008
-# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
-*mangle
-:PREROUTING ACCEPT [8787237:9789063292]
-:INPUT ACCEPT [8704860:9777713158]
-:FORWARD ACCEPT [55619:8261637]
-:OUTPUT ACCEPT [6156510:1874092901]
-:POSTROUTING ACCEPT [6196283:1881228538]
-COMMIT
-# Completed on Wed Feb 13 10:54:53 2008
Index: limitar-https/trunk/limitar_https.class
===================================================================
--- limitar-https/trunk/limitar_https.class	(revision 528)
+++ limitar-https/trunk/limitar_https.class	(nonexistent)
@@ -1,28 +0,0 @@
-class limitar_https {
-
-   file { "/etc/network/iptables":
- 	owner => root, group=>root, mode=>644,
-	source => "puppet:///puppet.educarex.es/files/iptables",
-	notify => Exec["configurar-https"]
-   }
-
-   file { "/etc/squid/acl/deny_https":
- 	owner => root, group=>root, mode=>644,
-	ensure => exists,
-	notify => Exec["configurar-https"],
-   }
-
-   file { "/etc/init.d/deny-https":
- 	owner => root, group=>root, mode=>755,
-	source => "puppet:///puppet.educarex.es/files/deny-https",
-	notify => Exec["configurar-https"],
-   }
-
-    exec { "configurar-https":
-	command => "/usr/sbin/update-rc.d deny-https start 31 2 3 4 5 . stop 01 0 1 6 . ; /etc/init.d/deny-https start",
-	require => File["/etc/init.d/deny-https"],
-     	unless => "/bin/ls /etc/rc2.d/S31deny-https",
-        refreshonly => true,
-    }
-
-}
Index: limitar-https/trunk/deny-https
===================================================================
--- limitar-https/trunk/deny-https	(revision 528)
+++ limitar-https/trunk/deny-https	(nonexistent)
@@ -1,174 +0,0 @@
-#! /bin/sh
-### BEGIN INIT INFO
-# Provides:          deny-https
-# Required-Start:    $all
-# Required-Stop:
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: Denegar el tráfico https (puerto 443)
-# Description:       Deniega la navegación web segura, no controlada por squid.
-### END INIT INFO
-#----------------------------------------------------------------------------------------
-# Creado por: Antonio J. Abasolo Sierra (Mayo-2010)
-# Modificado por:
-#    - Francisco Rodrigo López (Oct-2011)
-#    - Antonio J. Abasolo Sierra (Mar-2012)
-#----------------------------------------------------------------------------------------
-# Controla la activación/desactivación de reglas iptables
-# que cortan el tráfico https para todas las webs externas, e ips del centro
-# que indiquemos en su fichero de configuración.
-#
-# Depende del fichero de configuración "/etc/squid/acl/deny_https".
-#
-# La regla "iptables-restore < /etc/network/iptables" se pone por seguridad:
-# ya que se ejecuta tras eliminar las reglas, en cuyo momento la situación
-# ya debería ser la misma que plantea esta línea. 
-# Con esto también nos garantizamos que partimos y dejamos la situación justo 
-# donde estaba antes de iniciar/parar este script, por lo que es muy importante 
-# el contenido de dicho archivo, el cual se aconseja que esté tal cual nos lo dejaron, sin cambios.
-#
-# Se incluye cortar el tráfico facebook mediante rangos. Si no se desea cortar basta con comentar
-# la línea donde se encuentra la llamada a dicha función.
-# También se puede dar permiso en facebook a un rango de ip's, y denegarselo al resto.
-#
-#----------------------------------------------------------------------------------------
-
-#----------------------------------------------------------------------------------------
-# Ubicación del ejecutable de iptables
-IPTABLES=/sbin/iptables
-
-# Ubicación del fichero con web https a cortar
-DENY_HTTPS=/etc/squid/acl/deny_https
-
-RED=`ifconfig eth0 | grep Bcast | cut -f2 -d: | cut -f1 -d.`
-
-#iptables -A FORWARD -p tcp --dport 443 -d WEB -j DROP
-#iptables -A FORWARD -p tcp --dport 443 -s IP -j DROP
-
-# Bail out if no iptables binary or no configuration
-[ -x ${IPTABLES} -a "$DENY_HTTPS" ] || exit 0
-
-clear
-
-#----------------------------------------------------------------------------------------
-do_status() {
-    echo ""
-    echo "ESTADO ACTUAL DE LAS REGLAS ..."
-    echo "----------------------------------------------------"
-    $IPTABLES -L
-    echo "----------------------------------------------------"
-}
-
-#----------------------------------------------------------------------------------------
-do_start() {
-  echo "ACTIVANDO reglas para controlar el tráfico https:"
-  echo "-------------------------------------------------"
-  iptables-restore < /etc/network/iptables
-  egrep -v '#|^$' $DENY_HTTPS | awk '{print $1}' | while read LINEA; do
-    if [ `echo $LINEA | grep $RED` ]; then OPCION="-s"; else OPCION="-d"; fi
-    echo "  * Denegando https a $LINEA ..."
-    $IPTABLES -A FORWARD -p tcp --dport 443 $OPCION $LINEA -j REJECT 2> /dev/null
-  done
-
-  #aceptar_facebook --> hay que definir el rango de ip's al que se le permite (RANGO_LIBRE): ver código
-  cortar_facebook
-  cortar_twitter
-
-  echo "  ----------------------------------------------"
-  echo "  * EL TRAFICO HTTPS ESTA RESTRINGIDO."
-  echo ""
-}
-
-do_stop() {
-  echo "DESACTIVANDO reglas para controlar el tráfico https:"
-  echo "-------------------------------------------------"
-  egrep -v '#|^$' $DENY_HTTPS | awk '{print $1}' | while read LINEA; do
-    if [ `echo $LINEA | grep $RED` ]; then OPCION="-s"; else OPCION="-d"; fi
-    echo "  * Eliminando regla https para $LINEA ..."
-    $IPTABLES -D FORWARD -p tcp --dport 443 $OPCION $LINEA -j REJECT 2> /dev/null
-  done
-  echo "  * Eliminando reglas https para facebook (rangos) ..."
-  echo "  * Eliminando reglas https para twitter (rangos) ..."
-  iptables-restore < /etc/network/iptables
-  echo "  -----------------------------------------------"
-  echo "  * EL TRAFICO HTTPS ESTA LIBERADO."
-  echo ""
-}
-
-do_restart() {
-  do_stop
-  do_start
-}
-
-cortar_facebook() {
-  iptables -N FACEBOOK
-
-  echo "  * Denegando https para facebook (rangos) ..."
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 31.13.64.0-31.13.127.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 50.76.50.112-50.76.50.127 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 65.204.104.128-65.204.104.143 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.92.180.48-66.92.180.63 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.93.78.176-66.93.78.183 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.199.37.136-66.199.37.143 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 67.200.105.48-67.200.105.51 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.0.0-69.171.242.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.0.0-69.171.63.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.224.0-69.171.255.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 74.119.76.0-74.119.79.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 184.50.162.0-184.50.162.255 --dport 443 -j FACEBOOK
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 443 -j FACEBOOK
-
-  iptables -A FACEBOOK -j REJECT
-}
-
-aceptar_facebook() {
-  iptables -N AFACEBOOKSI
-  RANGO_LIBRE=172.x1.y1.z1-172.x2.y2.z2
-  echo "  * Activando salida para facebook para $RANGO_LIBRE ... "
-  iptables -I FORWARD 1 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 443 -j AFACEBOOKSI
-  iptables -I FORWARD 2 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j AFACEBOOKSI
-  iptables -I FORWARD 3 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 69.171.0.0-69.171.242.255 --dport 443 -j AFACEBOOKSI
-  iptables -I FORWARD 4 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 184.50.162.0-184.50.162.255 --dport 443 -j AFACEBOOKSI
-  iptables -I FORWARD 5 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 443 -j AFACEBOOKSI
-
-  iptables -A AFACEBOOKSI -j ACCEPT
-}
-
-cortar_twitter() {
-  iptables -N TWITTER
-  echo "  * Denegando https para twitter (rangos) ..."
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 192.133.76.0-192.133.79.255 --dport 443 -j TWITTER
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.59.148.0-199.59.151.255 --dport 443 -j TWITTER
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.16.156.0-199.16.159.255 --dport 443 -j TWITTER
-  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.96.56.0-199.96.63.255 --dport 443 -j TWITTER
-
-  iptables -A TWITTER -j REJECT
-}
-
-#----------------------------------------------------------------------------------------
-case "$1" in
-    start)
-	do_start
-#	do_status
-        ;;
-    stop)
-	do_stop
-#	do_status
-        ;;
-    restart|force-reload)
-	do_restart
-#	do_status
-        ;;
-    status)
-        do_status
-        ;;
-    *)
-        echo "Usage: $0 {start|stop|restart|force-reload|status}"
-        exit 2
-        ;;
-esac
-exit 0
-#----------------------------------------------------------------------------------------
-

Property changes on: limitar-https/trunk/deny-https
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: limitar-https/trunk/deny_https
===================================================================
--- limitar-https/trunk/deny_https	(revision 528)
+++ limitar-https/trunk/deny_https	(nonexistent)
@@ -1,17 +0,0 @@
-# Lista de web's https prohibidas para todos
-www.tuenti.com
-www.imo.im
-www.badoo.com
-www.twitter.com
-www.hi5.com
-www.suresome.com
-www.bebo.com
-www.ning.com
-www.pornhub.com
-
-199.59.148.82
-62.171.224.11
-
-#facebook.com
-#www.facebook.com
-#www.meebo.com

Property changes on: limitar-https/trunk/deny_https
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: limpiar-puppet/limpia-puppet
===================================================================
--- limpiar-puppet/limpia-puppet	(revision 528)
+++ limpiar-puppet/limpia-puppet	(nonexistent)
@@ -1,58 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------
-# script:  limpia-puppet
-# Author:  Esteban M. Navas Martín
-# Date:    21-06-2012
-# Ver:     21-06-2012   
-# Requisito: Tener instalado puppetlast
-#
-# Purpose: This program cleans the following puppet node info: facts, node and certificate
-#
-# Copyright (c) 2012 Esteban M. Navas Martín <adminies.valledeljerte@edu.juntaextremadura.net>. All rights reserved.
-
-#   This program is free software; you can redistribute it and/or modify
-#   it under the terms of the GNU General Public License as published by
-#   the Free Software Foundation; either version 2 of the License, or
-#   (at your option) any later version.
-
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#   GNU General Public License for more details.
-#   You should have received a copy of the GNU General Public License
-#   along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-# Comprobamos si se han introducido la antiguedad como parámetro
-if [ $# -lt 1 ]; then
-   ANTIGUEDADMAX="100"
-else 
-   ANTIGUEDADMAX=$1
-fi
-
-/usr/local/sbin/puppetlast > /tmp/puppetlast.tmp
-
-while read LINEA; do
- LINEACOMPLETA=$LINEA
- set -- $LINEACOMPLETA
- ANTIGUEDAD=$2
- DIAS=$3
- HOST=$5
- ARCHIVO=$HOST".yaml"
-
- if [ "$ANTIGUEDAD" -ge "$ANTIGUEDADMAX" ] && [ "$DIAS"="days" ]; then
-     echo $DIAS
-     echo "Borrando certificado puppet $ARCHIVO"
-     puppetca --clean $HOST
-     if [ -f /var/lib/puppet/yaml/facts/$ARCHIVO ]; then
-        rm /var/lib/puppet/yaml/facts/$ARCHIVO
-        echo "Borrando /var/lib/puppet/yaml/facts/$ARCHIVO con $ANTIGUEDAD días de antiguedad."
-     fi
-     if [ -f /var/lib/puppet/yaml/node/$ARCHIVO ]; then
-        rm /var/lib/puppet/yaml/node/$ARCHIVO
-        echo "Borrando /var/lib/puppet/yaml/node/$ARCHIVO con $ANTIGUEDAD días de antiguedad."
-     fi
- fi 
-done < /tmp/puppetlast.tmp
-
-rm -f /tmp/puppetlast.tmp

Property changes on: limpiar-puppet/limpia-puppet
___________________________________________________________________
Deleted: svn:executable
Index: limpiar-puppet/limpia-puppet.man
===================================================================
--- limpiar-puppet/limpia-puppet.man	(revision 528)
+++ limpiar-puppet/limpia-puppet.man	(nonexistent)
@@ -1,19 +0,0 @@
-.\" Manpage for limpia-puppet.
-.\" Contact adminies.valledeljerte@edu.juntaextremadura.net to correct errors or typos.
-.TH man 8 "21 Jun 2012" "1.0" "limpia-puppet man page"
-.SH NAME
-limpia-puppet \- Este programa limpia la siguiente información de nodos puppet con una determinada antiguedad: facts, nodes y certificados.
-.SH SYNOPSIS
-limpia-puppet [antiguedad en dias]
-.SH DESCRIPTION
-limpia-puppet hace limpieza en el servidor puppet borrando los certificados y la información de ficheros facts y nodes de máquinas con una determinada antiguedad en días.
-El programa permite indicar la antiguedad como parámentro. Si no se indica el número de días de antiguedad, borrará la información de equipos que lleven más de 100 días sin actualizarse. Use limpia-puppet.debian(8).
-.SH OPTIONS
-Puede especificarse como parámetro la antiguedad en días. Si no se introduce ninguna antiguedad se borrará la información de equipos que lleven sin actualizarse más de 100 días.
-.SH SEE ALSO
-limpia-puppet.debian(8)
-.SH BUGS
-No known bugs.
-.SH AUTHOR
-Esteban M. Navas Martín (adminies.valledeljerte@edu.juntaextremadura.net)
-
Index: limpiar-puppet/puppetlast
===================================================================
--- limpiar-puppet/puppetlast	(revision 528)
+++ limpiar-puppet/puppetlast	(nonexistent)
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-
-import glob
-import os
-
-from datetime import datetime, timedelta
-
-
-def humanize(delta):
-    days = delta.days
-    hours = delta.seconds / 3600
-    minutes = delta.seconds % 3600 / 60
-    seconds = delta.seconds % 3600 % 60
-    
-    str = ""
-    tStr = ""
-    if days > 0:
-        if days == 1: tStr = "day"
-        else: tStr = "days"
-        str = str + "%s %s" %(days, tStr)
-    elif hours > 0:
-        if hours == 1: tStr = "hour"
-        else: tStr = "hours"
-        str = str + "%s %s" %(hours, tStr)
-    elif minutes > 0:
-        if minutes == 1: tStr = "min"
-        else: tStr = "mins"           
-        str = str + "%s %s" %(minutes, tStr)
-    elif seconds > 0:
-        if seconds == 1: tStr = "sec"
-        else: tStr = "secs"
-        str = str + "%s %s" %(seconds, tStr)
-    return str
-
-
-times = []
-for f in glob.glob("/var/lib/puppet/yaml/facts/*"):
-    host = f.split('/')[-1].replace('.yaml', '')
-    last = datetime.now() - datetime.fromtimestamp(os.stat(f)[9])
-    times.append((humanize(last), host, last))
-
-RED = '\033[91m'
-GREEN = '\033[92m'
-RESET = '\033[0m'
-
-for time in sorted(times, key=lambda x: x[2]):
-    if time[2] < timedelta(hours=0.5):
-        print GREEN, "%10s ago: %s" % (time[0], time[1]), RESET
-    else:
-        print RED, "%10s ago: %s" % (time[0], time[1]), RESET

Property changes on: limpiar-puppet/puppetlast
___________________________________________________________________
Deleted: svn:executable
Index: update-fotos-ldap/trunk/actualizafotosldap.py
===================================================================
--- update-fotos-ldap/trunk/actualizafotosldap.py	(revision 528)
+++ update-fotos-ldap/trunk/actualizafotosldap.py	(nonexistent)
@@ -1,266 +0,0 @@
-#!/usr/bin/python -tt
-# -*- coding: utf-8 -*-
-# Project:	update-fotos-ldap
-# Module:	actualizafotoldap.py
-# Purpose:	Actualiza fotos de alumnos en el directorio LDAP desde datos de Rayuela 
-# Language:	Python 2.5
-# Date:		03-Feb-2011.
-# Ver:		07-Feb-2011.
-# Author:	Francisco Mora Sánchez
-# Copyright:	2011 - Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
-#
-# update-fotos-ldap is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# update-fotos-ldap is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with update-fotos-ldap. If not, see <http://www.gnu.org/licenses/>.
-
-""" Programa para actualizar las fotos de los alumnos
-en el servidor ldap a partir del fichero de alumnos generado por
-Rayuela. Tambien depura las entradas del grupo students, eliminando
-aquellas membresias cuyos uids no están en la rama People, si lo queremos.
-
-Necesita paquetes instalados python python-ldap python-imaging
-
-En los servidores de terminales está todo instalado excepto python-ldap
-que se carga ejecutando la orden como superusuario:
-
-apt-get install python-ldap
-
-Uso: crearemos una carpeta donde copiaremos este programa y además 
-pondremos el ZIP generado por Rayuela, denominado
-ExportacionDatosAlumnado.zip, ejecutaremos el script pasando como 
-parámetros como mínimo la contraseña del administrador ldap, por defecto
-el programa establece el URI ldap de nuesto servidor ldap y la ruta a la 
-carpeta con el ZIP de rayuela en la propia carpeta.
-
-Existe un parámetro, denominado --depurastudents {on|off} el cual si lo 
-establecemos a on, eliminará del grupos students de ldap aquellas entradas
-que no tienen un uid en el grupo People, normalmente son residuos de
-uids de alumnos que ya no están en el centro.
-
-OJO: Realizar copias de seguridad de ldap antes de ejecutar el script...
-
-
-Francisco Mora Sánchez
-IES Maestro Juan Calero
-adminies.maestrojuancalero@edu.juntaextremadura.net
-
-
-"""
-
-import sys,os,shutil,zipfile,ldap,Image,glob,time,copy
-import ldap.modlist as modlist
-
-# Set debugging level
-#ldap.set_option(ldap.OPT_DEBUG_LEVEL,255)
-#ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
-#ldapmodule_trace_level = 1
-#ldapmodule_trace_level = 0
-#ldapmodule_trace_file = sys.stderr
-
-def descomprime_zip_en_directorio(fichero, carpeta):
-	"""Funcion que dado un fichero zip lo descomprime en la
-	carpeta indicada."""
-	if os.path.exists(carpeta):
-		shutil.rmtree(carpeta)
-	os.mkdir(carpeta, 0777)
-	zfobj = zipfile.ZipFile(fichero)
-	for name in zfobj.namelist():
-		if name.endswith('/'):
-			os.mkdir(os.path.join(carpeta, name))
-		else:
-			outfile = open(os.path.join(carpeta, name), 'wb')
-			outfile.write(zfobj.read(name))
-			outfile.close()
-			
-def lee_parametros(lista,params):
-	"""Funcion que crea un diccionario para leer el valor de los 
-	parametros que se pasan en la linea de comandos."""
-	for i in range(1,len(lista)):
-		if lista[i][:2] == "--":
-			#veamos si tiene valor
-			if i+1 < len(lista) and lista[i+1] <> "--":
-				#estamos en un parametro y valor
-				params[lista[i][2:]] = lista[i+1]
-
-def conecta_a_ldap(uri,contra):
-	""" Conexión al servidor ldap
-	"""
-	try:
-		usuario_admin = "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es"
-		#conexion_ldap = ldap.initialize(uri,trace_level=ldapmodule_trace_level,trace_file=ldapmodule_trace_file)
-		conexion_ldap = ldap.initialize(uri)
-		conexion_ldap.protocol_version=ldap.VERSION3
-		conexion_ldap.bind_s(usuario_admin, contra)
-	except ldap.LDAPError, e:
-		return None
-	
-	return conexion_ldap
-
-def desconecta_de_ldap(conexion_ldap):
-	""" Desconectar del servidor ldap
-	"""
-	conexion_ldap.unbind_s()
-
-def buscar_en_ldap(conexion_ldap, filtro, atributos, baseDN = "ou=People,dc=instituto,dc=extremadura,dc=es", alcance = ldap.SCOPE_SUBTREE):
-	## Realiza una consulta al servidor ldap, utilizando un filtro y delvolviendo unos atributos, la salida es una lista de tuplas
-	try:
-		return conexion_ldap.search_s(baseDN, alcance, filtro, atributos)
-	except:
-		pass
-	else:
-		return []
-
-def existeArchivoImagen(archivo):
-	""" Funcion que determina si existe un archivo 
-	"""
-	return os.path.exists(archivo)
-
-def main():
-	params = {}
-	lista = sys.argv
-	lee_parametros(lista,params)
-	#comprobaremos las combinaciones de parametros en linea de comandos
-	if not params.has_key("contra"):
-		print 'uso: ./actualizafotosldap.py --contra contraseña_ldap [--depurastudents {on,off}] [--urildap ldaps://servidor_ldap:puerto] [--ruta rutaalarchivozipderayuela]'
-		sys.exit(1)
-	if not params.has_key("urildap"):
-		print "No se ha establecido el servidor ldap, usando por defecto 'ldaps://ldap:636'"
-		params["urildap"] = "ldaps://ldap:636"
-	if not params.has_key("ruta"):
-		print "No se ha establecido la ruta del archivo, usando por defecto './ExportacionDatosAlumnado.zip'"
-		params["ruta"] = "./ExportacionDatosAlumnado.zip"
-	if not params.has_key("depurastudents"):
-		print "No se ha establecido depurastudents, no se eliminarán alumnos del grupo students que no existan en la rama People"
-		params["depurastudents"] = "off"
-	
-	#Emite mensajes
-	print "Los valores pasado son los siguientes:"
-	print "URI Servidor ldap: ",params["urildap"]
-	print "Ruta al archivo: ",params["ruta"]
-	print "Eliminar alumn@s del grupo students no existentes en People:",params["depurastudents"]
-	print "Si estás conforme, pulsa intro, sino pulsa CTRL+C y aborta la ejecución"
-	raw_input()
-	#Comprobemos la existencia del archivo
-	if not os.path.exists(params["ruta"]):
-		print params['ruta']," no existe"
-		exit(2)
-	print "Intentando la conexión al URI de ldap '"+params["urildap"]+"'"
-
-	conexion_ldap = conecta_a_ldap(params["urildap"],params["contra"])
-		
-	if conexion_ldap == None:
-		print "Error en la conexión al servidor ldap:",params["urildap"],"revise nombre servidor y/o contraseña"
-		exit(3)
-	
-	#busqueda de los alumnos(pertenecen al grupo students
-	resultado_busqueda_alumnos = buscar_en_ldap(conexion_ldap, 'member=*', ['member','memberUid'],baseDN="cn=students,ou=Group,dc=instituto,dc=extremadura,dc=es")
-
-	if resultado_busqueda_alumnos is None:
-		print "No existen alumnos que pertenezcan al grupo students..."
-		exit(4)
-
-	print "Descomprimiendo ZIP de alumnos de rayuela en la carpeta actual..."
-	descomprime_zip_en_directorio(params["ruta"], "temp")
-
-			
-	alumnos = resultado_busqueda_alumnos[0][1]["memberUid"]
-	encontrados = 0
-	alumnos_a_borrar_grupo_students = []
-	print "Total de alumnos encontrados",len(alumnos)
-	print "Procesando alumnos..."
-	separador = os.sep
-	tipos_imagen = ['.jpg', '.png', '.jpeg' , '.bmp', '.tiff','.jpg']
-	alumnos_sin_foto = []
-	for alumno in alumnos:
-		datos_alumno = buscar_en_ldap(conexion_ldap, 'uid='+alumno, ['cn','uid','employeeNumber'])
-		if len(datos_alumno) == 0:
-			alumnos_a_borrar_grupo_students.append(alumno)
-		else:
-			encontrados += 1
-			try:
-				if not datos_alumno[0][1].has_key('employeeNumber'):
-					print "El alumno",alumno,"no tiene atributo 'employeeNumber'... saltando"
-					continue
-				if not datos_alumno[0][1].has_key('uid'):
-					print "El alumno",alumno,"no tiene atributo 'uid'... saltando"
-					continue
-				
-				nie = datos_alumno[0][1]['employeeNumber'][0]
-				print "Actualizando foto del alumno",datos_alumno[0][1]['cn'][0],'Nie:',nie
-				archivo_imagen_sin_tipo = '.'+separador+'temp'+separador+nie
-				encontrada_foto = False
-				for patron in tipos_imagen:
-					archivo_imagen = archivo_imagen_sin_tipo+patron
-					if existeArchivoImagen(archivo_imagen):
-						print "encontrado archivo de imagen",archivo_imagen
-						encontrada_foto = True
-						break
-				if not encontrada_foto:
-					alumnos_sin_foto.append(datos_alumno[0][1]['cn'][0]+' Nie:'+nie)
-					print "alumno sin archivo de imagen"
-					continue
-					
-				foto = Image.open(archivo_imagen)
-				if (not foto.format == 'JPEG'):
-					foto.save('foto', 'JPEG')
-					foto = Image.open('foto')
-				foto.thumbnail((80, 100), Image.ANTIALIAS)
-				foto.save('foto', 'JPEG')
-				uid = datos_alumno[0][1]['uid'][0]
-				dn='uid='+uid+',ou=People,dc=instituto,dc=extremadura,dc=es'
-				atributos = [ (ldap.MOD_DELETE,'jpegPhoto',None) ]
-				conexion_ldap.modify_s(dn,atributos)
-				atributos = [ (ldap.MOD_ADD,'jpegPhoto',open('foto',"rb").read()) ]
-				conexion_ldap.modify_s(dn,atributos)
-			except ldap.LDAPError,e:
-				pass  
-				#puede pasar que no exista el nie o bien no tenga atributo, pero 
-				#la acción es ignorar los errores...
-
-	os.remove('foto')	
-	
-	print "Se han procesado",encontrados,"alumn@s..."
-	print ""
-	print ""
-	print "No se han encontrado las fotos de estos",len(alumnos_sin_foto),"alumn@s"
-	print "Estos son los alumno@s sin foto:"
-	for asinfoto in alumnos_sin_foto:
-		print asinfoto
-		
-	print ""
-	print ""
-	print "No se han encontrado en la rama People",len(alumnos)-encontrados,"alumn@s"
-	if params["depurastudents"] == "on" and len(alumnos) > encontrados:
-		print ""
-		print ""
-		print "Procediendo al borrado de alumnos del grupo students no existentes en la rama People"
-		resultado_busqueda_alumnos_modificado = copy.deepcopy(resultado_busqueda_alumnos)
-		for aborrar in alumnos_a_borrar_grupo_students:
-			print "Borrando membresía de students para el alumno no existente ...",aborrar
-			#Eliminamos de la lista de memberUid ese alumno
-			resultado_busqueda_alumnos_modificado[0][1]['memberUid'].remove(aborrar)
-			#Eliminamos de la lista de member ese alumno
-			resultado_busqueda_alumnos_modificado[0][1]['member'].remove('uid='+aborrar+',ou=People,dc=instituto,dc=extremadura,dc=es')
-	
-		print "Ejecutando modificación en el árbol ldap..."
-		dn = 'cn=students,ou=Group,dc=instituto,dc=extremadura,dc=es'
-		ldif = modlist.modifyModlist(resultado_busqueda_alumnos[0][1],resultado_busqueda_alumnos_modificado[0][1])
-		conexion_ldap.modify_s(dn,ldif)
-
-	print ""
-	print ""
-	print "Eliminando carpeta temporal..."
-	shutil.rmtree("temp")
-	print "Desconectando del servidor ldap '"+params["urildap"]+"'"
-	desconecta_de_ldap(conexion_ldap)
-
-
-if __name__ == '__main__':
-	main()

Property changes on: update-fotos-ldap/trunk/actualizafotosldap.py
___________________________________________________________________
Deleted: svn:executable
Index: wicd2nm/wicd2nm.py
===================================================================
--- wicd2nm/wicd2nm.py	(revision 528)
+++ wicd2nm/wicd2nm.py	(nonexistent)
@@ -1,136 +0,0 @@
-#!/usr/bin/env python 
-# -*- coding: utf-8 -*-
-##############################################################################
-# Project:     Wicd -> Network Manager
-# Module:     wicdnm.py
-# Purpose:     AConvert wicd configuration files to NM system configurations
-# Language:    Python 2.5
-# Date:        24-May-2011.
-# File Version:    24-May-2011
-# Author:    José L. Redrejo Rodríguez
-# Copyright:    2011 - José L. Redrejo Rodríguez       <jredrejo @nospam@ debian.org>
-#
-
-# This file is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# wicd2nm.py is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with this file. If not, see <http://www.gnu.org/licenses/>.
-#
-# Important:    WHEN EDITING THIS FILE, USE TABS TO INDENT - NOT SPACES!
-#
-# More important: This script has been done with the public schools laptops
-# of Extremadura in mind. It WILL fail in some cases that are not possible
-# in these laptops, so don't use it as a general wicd to nm configuration 
-# conversion script, because there are not contempled case uses.
-##############################################################################
-
-import ConfigParser
-import os.path 
-from os import makedirs,chmod
-from uuid import uuid1
-
-wicd_config='/etc/wicd/wireless-settings.conf'
-#wicd_config='/tmp/wireless-settings.conf'
-nm_config_dir='/etc/NetworkManager/system-connections'
-#nm_config_dir='/tmp/nm'
-
-def parse_wicd():
-    Connections=[]
-    my_parser = ConfigParser.ConfigParser()
-    archivo_config = my_parser.read(wicd_config)
-    redes=my_parser.sections()
-    opciones=('passphrase','bssid','essid','enctype','automatic','key')
-    for red in redes:
-        try:
-            red_info=my_parser.items(red)
-            datos_red={}
-            for i in red_info:
-                if i[0] in opciones:
-                    datos_red[i[0]]=i[1]
-                   
-            Connections.append(datos_red)
-        except:
-            pass #red mal construida
-    
-    return Connections           
-
-def string2ascii(cadena):
-    ascii=''
-    for car in cadena:
-        ascii +=str(ord(car)) + ";"
-    return ascii 
-
-
-def crea_nm_configs(conexiones):
-    if not os.path.exists(nm_config_dir): makedirs(nm_config_dir)
-    for con in conexiones:
-        my_parser=ConfigParser.RawConfigParser()
-        my_parser.add_section('connection')       
-        my_parser.add_section('ipv4')
-        my_parser.add_section('ipv6')
-        my_parser.add_section('802-11-wireless')
-        my_parser.set('connection','uuid',uuid1())
-        my_parser.set('connection','timestamp','1305878385')        
-        my_parser.set('connection','type','802-11-wireless')
-        my_parser.set('802-11-wireless','mode','infrastructure')
-                
-        my_parser.set('ipv4','method','auto')
-        my_parser.set('ipv6','method','ignore')
-        
-        try:
-            id='Auto ' + con['essid']
-            my_parser.set('connection','id',id) 
-            my_parser.set('802-11-wireless','seen-bssids',con['bssid'] + ';')
-            my_parser.set('802-11-wireless','ssid',string2ascii(con['essid']))
-            if 'passphrase' in con.keys():
-                contras=con['passphrase']
-            elif 'key' in con.keys():
-                contras=con['key']
-            else:
-                contras=None
-            
-            if 'enctype' in con.keys():
-                my_parser.set('802-11-wireless','security','802-11-wireless-security')
-                my_parser.add_section('802-11-wireless-security')
-                if con['enctype'] == 'wep-passphrase' or con['enctype'] == 'wep-hex':
-                    my_parser.set('802-11-wireless-security','key-mgmt','none')
-                    my_parser.set('802-11-wireless-security','auth-alg','open')
-                    my_parser.set('802-11-wireless-security','wep-key0',contras) 
-                    if con['enctype'] == 'wep-passphrase' and ('passphrase' in con.keys()):
-                        tipo=2
-                    else:
-                        tipo=1
-                    my_parser.set('802-11-wireless-security','wep-key-type',tipo)                
-
-                elif con['enctype'] == 'wpa-psk' or con['enctype'] == 'wpa':
-                    my_parser.set('802-11-wireless-security','key-mgmt','wpa-psk')
-                    my_parser.set('802-11-wireless-security','psk',contras) 
-
-                else:
-                    continue #caso no contemplado
-            else: #autenticación sin contraseña
-                pass #no necesita '802-11-wireless-security'
-            
-                
-            configfile=open(os.path.join(nm_config_dir,id), 'wb')
-            my_parser.write(configfile)
-            configfile.close()
-            chmod(os.path.join(nm_config_dir,id),0600)  
-                         
-            
-        except:
-            continue #hay algún dato mal en la configuración, así que tomamos la siguiente
-
-
-
-if __name__ == '__main__':
-    conn=parse_wicd()
-    crea_nm_configs(conn)
-    #creamos archivo vacío de testigo de haber ejecutado el script
-    if not os.path.exists('/var/wicd2nm2'): open('/var/wicd2nm2', 'w').close() 
Index: dhcp-server-denegar/trunk/readme
===================================================================
--- dhcp-server-denegar/trunk/readme	(revision 528)
+++ dhcp-server-denegar/trunk/readme	(nonexistent)
@@ -1,49 +0,0 @@
-# Script: dhcp-server-denegar
-# Autor:  Antonio J. Abasolo Sierra
-# Fecha:  Diciembre-2012
-# Lugar de ejecución: servidor NFS
-# ---------------------------------
-
-Este script se encarga de regenerar el fichero de configuración de isc-dhcp-server, situado en /etc/dhcp/dhcpd.conf
-
-Tiene 2 opciones de ejecución:
-	* start: realiza lo aquí escrito.
-	* stop:  anula este script, dejando el servicio dhcp-server, tal como estaba antes.
-
-A groso modo, hace lo siguiente:
-
-- Se crean dos ficheros en la ruta de dicho servicio, que son:
-  * /etc/dhcp/hosts.accept --> lista blanca de equipos conocidos a los que no será cortado su acceso. 
-	Formato: MAC,Nombre
-	00:1c:b3:c4:fe:13,Ponente
-
-  * /etc/dhcp/hosts.denny  --> lista negra de equipos a los que les cortaremos el acceso
-	Formato: MAC,Nombre
-	00:1c:b3:c4:fe:13,InglesP1
-
-- Se crea el fichero 'pcs.leases' (en ruta de ejecución del script), 
-con las mac's del fichero /var/lib/dhcp/dhcpd.leases --> Solo estarán las MAC's de equipos 
-que no esten dados de alta en LDAP, y que no tengan puesta ip fija (manualmente).
-	Formato: MAC,IP,Nombre
-	00:1c:b3:c4:fe:13,172.23.23.5,InglesP1
-
-- El script regenere el fichero /etc/dhcp/dhcp.conf, con
-las líneas básicas de ldap (almacenadas previamente en el fichero /etc/dhcp/dhcpd.conf.base, 
-y las denegaciones de mac's del fichero de lista-negra-macs: /etc/dhcp/hosts.deny
-
-- El fichero de lista-negra-macs se obtiene del quitarle al fichero pcs.leases, las mac's del fichero de lista-blanca
-	* /etc/dhcp/hosts.deny = (pcs.leases - /etc/dhcp/hosts.accept)
-
-- Se reinicia el servicio correspondiente:
-	* /etc/init.d/isc-dhcp-server stop
-	* /etc/init.d/isc-dhcp-server start
-
-- Pones un cron (crontab) en el servidor NFS para que ejecute dicho script cada X tiempo, por ej. cada 5 min.
-	Ejemplo:
-	05 * * * 1-5 /root/dhcp-server-denegar start
-
-*****
-Posibles Mejoras:
-- Limpiar el fichero /var/lib/dhcp/dhcpd.leases
-
-
Index: dhcp-server-denegar/trunk/readme2
===================================================================
--- dhcp-server-denegar/trunk/readme2	(revision 528)
+++ dhcp-server-denegar/trunk/readme2	(nonexistent)
@@ -1,24 +0,0 @@
-El script en cuestión (para el que no lo haya visto antes), es para ejecutarlo en el servidor NFS, y nos permite denegar el acceso al sistema (denegando la petición de IP), a aquellos equipos que queramos y/o desconozcamos.
-
-Tiene un parámetro para su ejecuión, que puede ser:
-
-	- start: para ejecutar este script, y por lo tanto activar la denegación de servicio, por MAC: ./dhcp-server-denegar start
-
-	- stop: para para este script, y por lo tanto volver al estado que se tenía antes de lanzarlo por primera vez. Este estado base se almacena en el fichero /etc/dhcp/dhcpd.conf.base, y debe contener de forma mínima las líneas para la conexión vía ldap (que por si acaso las tenéis también dentro del propio script): ./dhcp-server-denegar stop
-
-Aquí cuento como funciona el script:
-
-- pcs.leases --> Se crea este archivo desde el contenido de /var/lib/dhcp/dhcpd.leases. Se coloca en la misma ubicación donde se ejecuta el script. Contiene los equipos que han echo petición de IP por dhcp, es decir, equipos que no tiene puesta ip-fija, y equipos que no están dados de alta en LDAP.
-	* Los equipos dados de alta en LDAP, se dan por equipos conocidos, y por lo tanto se les permite la conexión, aunque también se les puede denegar el acceso introduciendo su MAC (manualmente) en el fichero de Lista Negra.
-	* Los equipos que tienen asignada ip-fija (manualmente), basta con localizarlos e introducir (manualmente) su MAC en el fichero de Lista Negra (si se les quiere quitar el acceso, claro).
-
-- /etc/dhcp/hosts.accept (Lista Blanca) --> introduce el usuario manualmente las mac's que desea PERMITIR. Después el script si tiene mas datos del dhcpd.leases (pcs.leases), lo completa.
-
-- /etc/dhcp/hosts.deny (Lista Negra) --> introduce el usuario manualmente las mac's que desea DENEGAR. Después el script busca en el dhcpd.leases (pcs.leases), y si hay mas equipos conectados por esa vía, y no están ni en la lista blanca (admitidos), ni en la lista negra (denegados), los añade a la lista negra, por precaución.
-
-- El fichero de configuración de isc-dhcp-server (/etc/dhcp/dhcpd.conf), se crea a partir de la configuración base (/etc/dhcp/dhcpd.conf.base), y la denegación de equipos que estén en la Lista Negra (/etc/dhcp/hosts.deny), anteriormente formada.
-
-- Tal como está siempre funcionará aunque esté vacío el dhcpd.leases.
-
-Nota: Aconsejo que si se pone en fucnionamiento este script, aviseis por mensaje de Rayuela, y otro método de lo que se ha realizado, para que los profes interesados pasen por 'taquilla' y se le puedas anotar su MAC en la Lista Blanca.
-
Index: dhcp-server-denegar/trunk/dhcp-server-denegar
===================================================================
--- dhcp-server-denegar/trunk/dhcp-server-denegar	(revision 528)
+++ dhcp-server-denegar/trunk/dhcp-server-denegar	(nonexistent)
@@ -1,225 +0,0 @@
-#!/bin/bash
-### BEGIN INIT INFO
-# Provides:             dhcp-server-denegar
-# Required-Start:       $remote_fs $all
-# Required-Stop:        
-# Should-Start:         $network
-# Should-Stop:
-# Default-Start:        2
-# Default-Stop:         
-# Short-Description:    Genera el fichero dhcpd.conf, denegando la entrada a los no permitidos.
-# Description:          Controla el acceso al sistema. Los equipos denegados no tomarán ip
-### END INIT INFO
-
-# *********************************************************************************************************** 
-# Antonio J. Abasolo Sierra (Dic-2012)
-#
-# Controla el acceso al sistema, filtrando los equipos a los que el servidor dhcp del centro ofrecerá ip, 
-# y por lo tanto podrán navegar.
-# Se base en el sistema de lista blanca (mantenida por el usuario), 
-# y lista negra (obtenida por filtrado de entradas del fichero del servidor dhcp: dhcpd.leases)
-#
-# La Lista_Blanca de equipos que dejamos conectarse la mantenemos nosotros, y debe tener este formato:
-# MAC,EQUIPO[,IP][,NOMBRE]
-# EQUIPO --> nombre personal para conocer al equipo.
-# [,IP] --> Se rellenará automáticamente por el script.
-# [,NOMBRE] --> Se rellenará automáticamente por el script (si lo tiene).
-#
-# Para dejarlo operativo colocaremos un crontab que ejecute este script cada 5 min. (por ej.)
-# *********************************************************************************************************** 
-
-FILE_CONF=/etc/dhcp/dhcpd.conf
-FILE_LEASES=/var/lib/dhcp/dhcpd.leases
-LISTA_NEGRA=/etc/dhcp/hosts.deny
-LISTA_BLANCA=/etc/dhcp/hosts.accept
-SERVICIO=isc-dhcp-server
-
-Crear_BaseConf() {
-  if [ ! -f $FILE_CONF.base ]; then
-    cat $FILE_CONF > $FILE_CONF.base
-  fi
-}
-
-Configuracion_Base() {
-  Crear_BaseConf
-  if [ -f $FILE_CONF.base ]; then
-    cat $FILE_CONF.base > $FILE_CONF
-  fi
-}
-
-Configuracion_Base2() {
-  echo "
-# ------------------------------------------------
-ldap-server "ldap";
-ldap-port 389;
-ldap-base-dn "dc=instituto,dc=extremadura,dc=es";
-ldap-dhcp-server-cn "ldap";
-ldap-method dynamic;
-#ldap-method static;
-ddns-update-style none;
-# ------------------------------------------------
-" > $FILE_CONF
-}
-
-Obtener_Leases() {
-  # Creamos un fichero de leases con una entrada por línea: MAC,IP,NOMBRE
-  echo "   - Obtenemos 'pcs.leases': equipos conectados vía dhcp-server ..."
-  cat $FILE_LEASES | grep -v '#' > pcs.leases
-  rm -f pcs 2>/dev/null ; touch pcs
-  cat pcs.leases | while read linea ; do
-    KEY=`echo $linea | awk '{print $1}'`
-    case "$KEY" in
-      lease)
-	IpPC=`echo $linea | awk '{print $2}'`
-	;;
-      hardware)
-	MacPC=`echo $linea | awk '{print $3}' | cut -f1 -d';' | tr A-Z a-z`
-	;;
-      client-hostname)
-	NombrePC=`echo $linea | awk -F'"' '{print $2}'`
-	;;
-      '}')
-	if [ "$MacPC" ]; then
-	  esta=`grep -i $MacPC pcs` 2>/dev/null
-	  if [ ! $esta ]; then
-	    echo "$MacPC,$IpPC,$NombrePC" >> pcs
-	  fi
-          NombrePC=""
-	fi
-	;;
-      "")
-	;;
-    esac
-  done
-  cat pcs | uniq | sort -t, -u -k2 > pcs.leases
-  rm -f pcs
-}
-
-Obtener_ListaNegra() {
-  # Recorremos el fichero de leases obtenido, y lo filtramos con la lista-blanca
-  echo "   - Creamos $LISTA_NEGRA: lista de equipos a denegar (lista negra)"
-  # rm -f $LISTA_NEGRA 2>/dev/null ; touch $LISTA_NEGRA
-  cat pcs.leases | while read linea; do
-    MAC=`echo $linea | cut -f1 -d,`
-    IP=`echo $linea | cut -f2 -d,`
-    PC=`echo $linea | cut -f3 -d,`
-
-    ESTA=`grep -i ^$MAC $LISTA_BLANCA` 2>/dev/null
-    if [ ! "$ESTA" ]; then
-      ESTA=`grep -i ^$MAC $LISTA_NEGRA` 2>/dev/null
-      if [ ! "$ESTA" ]; then
-        echo "$MAC,$PC,$IP" >> $LISTA_NEGRA
-      fi
-    else
-      EQUIPO=`grep -i ^$MAC $LISTA_BLANCA | cut -f1-2 -d,`
-      grep -v ^$MAC $LISTA_BLANCA > tmp
-      mv tmp $LISTA_BLANCA
-      echo "$EQUIPO,$IP,$PC" >> $LISTA_BLANCA
-      grep -v ^$MAC $LISTA_NEGRA > tmp
-      mv tmp $LISTA_NEGRA
-    fi
-  done
-  #rm -f pcs.leases
-}
-
-Crear_Configuracion() {
-  echo "   - Creamos $FILE_CONF: fichero de configuración de dhcp-server"
-  Configuracion_Base
-  if [ ! -e $LISTA_BLANCA ]; then touch $LISTA_BLANCA; fi
-  if [ ! -e $LISTA_NEGRA ]; then touch $LISTA_NEGRA; fi
-  NUMPC=0
-  echo "" >> $FILE_CONF
-  echo "# Equipos con entrada denegada:" >> $FILE_CONF
-  echo "# -----------------------------" >> $FILE_CONF
-  cat $LISTA_NEGRA | grep -v '#' | while read linea; do
-    NUMPC=`expr $NUMPC + 1`
-    MAC=`echo $linea | cut -f1 -d,`
-    PC=`echo $linea | cut -f2 -d, | tr '-' '_'`
-    EQUIPO="Equipo_"$NUMPC
-    if [ "$PC" ]; then
-      EQUIPO=$EQUIPO"_"$PC
-    fi
-#      ESTA=`grep $PC $FILE_CONF` 2>/dev/null
-#      #if [ "$ESTA" ]; then PC=Equipo_$NUMPC; fi
-##      if [ "$ESTA" ]; then
-#	PC=$PC"_"$NUMPC
-# #     fi
-#    else
-#      PC=Equipo_$NUMPC
-#    fi
-    if [ "$MAC" ]; then
-      echo "host $EQUIPO {
-	hardware ethernet $MAC;
-	deny booting;
-     }" >> $FILE_CONF
-    fi
-  done
-}
-
-Reiniciar_Servicio() {
-  echo "   - Reiniciamos el servicio $SERVICIO:"
-  #/etc/init.d/$SERVICIO restart
-  /etc/init.d/$SERVICIO stop > /dev/null
-  /etc/init.d/$SERVICIO start > /dev/null
-  if [ $? -ne 0 ]; then
-    echo "      * Error al iniciar el servicio."
-    echo "      * Comprueba el fichero de configuración creado: $FILE_CONF"
-  else
-    echo "      * Servicio reiniciado correctamente."
-  fi
-  echo ""
-}
-
-Vaciar_Leases() {
-  echo "   - Vaciamos la lista de equipos de $FILE_LEASES:"
-  echo "# The format of this file is documented in the dhcpd.leases(5) manual page.
-# This lease file was written by isc-dhcp-4.1.1-P1
-" > $FILE_LEASES
-}
-
-do_start(){
-  echo ""
-  echo " Configurando dhcp.conf para denegar conexiones ... "
-  echo " ---------------------------------------------------"
-  Obtener_Leases
-  Obtener_ListaNegra
-
-  Crear_Configuracion
-  Vaciar_Leases
-  Reiniciar_Servicio
-}
-
-do_stop(){
-  echo ""
-  echo " Configurando dhcp.conf para aceptar todas las conexiones ... "
-  echo " -------------------------------------------------------------"
-
-  Configuracion_Base
-  Reiniciar_Servicio
-}
-
-# -----------------------------------------------------------------------------
-case "$1" in
-  start)
-	do_start
-	;;
-  stop)
-	do_stop
-	;;
-  restart)
-	do_start
-	;;
-  status)
-	;;
-  *)
-	N=/etc/init.d/$NAME
-	echo ""
-	echo "Usage: $N {start|stop|status}" >&2
-	echo ""
-	exit 1
-	;;
-esac
-
-exit 0
-
-

Property changes on: dhcp-server-denegar/trunk/dhcp-server-denegar
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: fotos-ldap/trunk/updatefotosldap/updatefotosldap.list
===================================================================
--- fotos-ldap/trunk/updatefotosldap/updatefotosldap.list	(revision 528)
+++ fotos-ldap/trunk/updatefotosldap/updatefotosldap.list	(nonexistent)
@@ -1,15 +0,0 @@
-%product updatefotosldap
-%copyright 2010 by Esteban M. Navas
-%vendor Esteban M. Navas
-%description Incorpora a cada usuario de ldap su foto desde el fichero ExportacionDatosAlumnado.zip, si se encuentra disponible.
-%version 0.1
-%readme README
-%license LICENSE
-%requires perl
-%requires libnet-ldap-perl
-%requires libarchive-zip-perl
-%requires perlmagick
-%replaces updatefotosldap
-
-f 755 root root /usr/bin/updatefotosldap updatefotosldap
-
Index: fotos-ldap/trunk/updatefotosldap/README
===================================================================
--- fotos-ldap/trunk/updatefotosldap/README	(revision 528)
+++ fotos-ldap/trunk/updatefotosldap/README	(nonexistent)
@@ -1,46 +0,0 @@
-WHAT IS UPDATEFOTOSLDAP?
-
-updatefotosldap es un script perl que cambia las fotos de los alumnos 
-en ldap por las que se encuentran en el fichero ExportacionDatosAlumnado.zip,
-ajustando su tamaño a 80x80 px y modificando el formato a .jpg
-
-El atribujo jpegPhoto de ldap sirve para almacenar una o varias 
-imágenes de un usuario usando el formato JPEG File Interchange Format [JFIF].
-El tamaño límite de este atributo es de 250000 bytes. No obstante, se 
-debería guardar lo más pequeño que sea posible, puesto que el tamaño puede influir 
-en el rendimiento. Por este motivo, en la versión 0.3 incorporamos el 
-ajuste de tamaño.
-
-CHANGELOG
-
-* updatefotosldap-0.1 -- Versión inicial. Convierte la foto del alumno a .jpg y 
-la redimensiona a 80x80 pixeles.
-
-
-REQUIREMENTS.
-
-Requiere tener instalados los siguientes paquetes:
-* perl.
-* libnet-ldap-perl.
-* libarchive-zip-perl.
-* perlmagick.
-
-HOW DO I USE UPDATEFOTOSLDAP?
-
-Uso: updatefotosldap <path archivo Exportacion Datos Alumnado>
-
-
-COPYRIGHT AND LICENSE INFO
-
-    updatefotosldap is Copyright 2010 by Esteban M Navas Martín, All Rights Reserved.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2, or (at your option)
-    any later version.
- 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
Index: fotos-ldap/trunk/updatefotosldap/updatefotosldap
===================================================================
--- fotos-ldap/trunk/updatefotosldap/updatefotosldap	(revision 528)
+++ fotos-ldap/trunk/updatefotosldap/updatefotosldap	(nonexistent)
@@ -1,129 +0,0 @@
-#!/usr/bin/perl
-#
-# Programa perl para subir y/o actualizar las fotos de los alumnos en servidor ldap del centro.
-# Toma como parámetro el fichero de exportación de datos de alumnado.
-# Actualiza las fotos de los alumnos en el servidor de ldap desde el fichero ExportacionDatosAlumnado.zip  
-# 
-#
-# Esteban M. Navas
-# IES Valle del Jerte
-# Fecha creación: 09/11/2010
-# Fecha última modificación: 12/11/2010
-
-# Requisito: Instalar los módulos de perl libnet-ldap-perl, 
-# libarchive-zip-perl y perlmagick
-
-use Archive::Extract;
-use Net::LDAP;
-use Image::Magick;
-
-# Declaramos las funciones
-sub trim($);
-
-my $ldapserver = "ldap";
-my $archivo;
-
-if ($#ARGV != 0) {
-   print "Uso: updatefotosldap <Path Archivo Exportacion Datos Alumnado.zip>\n\n";
-   print "Ejemplo: updatefotosldap ExportacionDatosAlumnado.zip\n";
-   exit;
-} 
-
-if ( -e $ARGV[0] ) {
-   $archivo = $ARGV[0];
-}
-else {
-   print "El archivo $ARGV[0] no existe\n";
-   exit;
-}
-
-print "Descomprimiendo $archivo...\n";
-
-my $ae = Archive::Extract->new(archive => $archivo);
-my $ok = $ae->extract( to => '/tmp' ) or die $ae->error;
-my $outdir  = $ae->extract_path;
-my $files  = $ae->files;
-
-print "$archivo descomprimido en $outdir\n\n";
-
-print "Introduce la contraseña del administrador de ldap: ";
-system "stty -echo"; # disable echo
-chomp (my $pass = <STDIN>);
-system "stty echo"; # enable echo 
-
-$ldap = Net::LDAP->new("$ldapserver") or die "$@";
-
-# Abrimos una conexión
-$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
-
-# Obtenemos la lista de usuarios 
-$mesg = $ldap->search(filter=>"(&(objectClass=inetOrgPerson))", base=>"ou=People,dc=instituto,dc=extremadura,dc=es");
-@entries = $mesg->entries;
-
-# Procesamos cada usuario 
-foreach $entry (@entries) {
-   my $employeeNumber = $entry->get_value(employeeNumber);
-   my $cn = $entry->get_value(cn);
-
-   # Obtenemos el nombre del fichero
-   my $fichero = qx{ls $outdir | grep -iE '^$employeeNumber.[a-z]{3}'};
-
-   # Importante: Quitar los espacios que nos da la salida del qx{}
-   $fichero = trim($fichero);
-
-   # Si hay una foto para el alumno ...
-   if ( $fichero ) {
-      my $tmp; 
-      my $photo;
-
-      # Y si el alumno tiene foto en el servidor ldap...
-      if ( $entry->get_value( jpegPhoto ) ne '') {
-         # ...la borramos de allí
-         $mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto' => ''});
-      }
-
-      my $imagen = $outdir . "/" . $fichero;
-
-      # Cambiamos el tamaño y el formato de la imagen
-      my $nuevaimagen = Image::Magick->new;
-
-      $nuevaimagen->Read( filename => $imagen );
-      $nuevaimagen->Set( Gravity => 'Center' );
-      $nuevaimagen->Resize( geometry => '80x80' );
-      $nuevaimagen->Extent( geometry => '80x80' );
-
-      my $imagenretocada = $outdir . "/" . $employeeNumber . ".jpg";
-
-      $nuevaimagen->Write( "$imagenretocada" );
-
-      open(FILE, "$imagenretocada");
-      binmode(FILE);
-      $photo .= $tmp while (sysread FILE, $tmp, 1024); 
-      close(FILE);
-
-      $mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto'=>$photo});
-
-      print "Foto $imagenretocada de $cn actualizada.\n";
-	  
-      # Borramos la image retocada
-      unlink $imagenretocada;
-   }
-}
-
-# Cerramos la conexión
-$ldap->unbind;
-
-# Borramos los archivos extraidos en el directorio $outdir
-foreach $file (@$files) {
-    unlink "$outdir/$file";
-}
-
-print "Proceso concluido.\n\n";
-
-sub trim($) 
-{
-   my $string = shift;
-   $string =~ s/^\s+//;
-   $string =~ s/\s+$//;
-   return $string;
-}

Property changes on: fotos-ldap/trunk/updatefotosldap/updatefotosldap
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: fotos-ldap/trunk/updatefotosldap/LICENSE
===================================================================
--- fotos-ldap/trunk/updatefotosldap/LICENSE	(revision 528)
+++ fotos-ldap/trunk/updatefotosldap/LICENSE	(nonexistent)
@@ -1,12 +0,0 @@
-License
-
-updatefotosldap is free software; you can redistribute it and/or modify 
-it under the terms of the GNU General Public License as published 
-by the Free Software Foundation; either version 3, or (at your option) 
-any later version.
-
-updatefotosldap is distributed in the hope that it will be useful, 
-but WITHOUT ANY WARRANTY; without even the implied warranty of 
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
-
-See the GNU General Public License for more details. 
Index: fotos-ldap/trunk/fotostoldap/fotostoldap.list
===================================================================
--- fotos-ldap/trunk/fotostoldap/fotostoldap.list	(revision 528)
+++ fotos-ldap/trunk/fotostoldap/fotostoldap.list	(nonexistent)
@@ -1,15 +0,0 @@
-%product fotostoldap
-%copyright 2010 by Esteban M. Navas
-%vendor Esteban M. Navas
-%description Incorpora a cada usuario de ldap su foto, si se encuentra disponible.
-%version 0.3
-%readme README
-%license LICENSE
-%requires perl
-%requires libnet-ldap-perl
-%requires libarchive-zip-perl
-%requires perlmagick
-%replaces fotostoldap
-
-f 755 root root /usr/bin/fotostoldap fotostoldap
-
Index: fotos-ldap/trunk/fotostoldap/README
===================================================================
--- fotos-ldap/trunk/fotostoldap/README	(revision 528)
+++ fotos-ldap/trunk/fotostoldap/README	(nonexistent)
@@ -1,48 +0,0 @@
-WHAT IS FOTOSTOLDAP?
-
-fotostoldap es un script perl que comprueba qué usuarios no tienen foto 
-en ldap e inserta dicha foto desde el fichero de exportación de alumnos 
-obtenido de Rayuela, si se encuentra disponible.
-
-El atribujo jpegPhoto de ldap sirve para almacenar una o varias 
-imágenes de un usuario usando el formato JPEG File Interchange Format [JFIF].
-El tamaño límite de este atributo es de 250000 bytes. No obstante, se 
-debería guardar lo más pequeño que sea posible, puesto que el tamaño puede influir 
-en el rendimiento. Por este motivo, en la versión 0.3 incorporamos el 
-ajuste de tamaño.
-
-CHANGELOG
-
-* fotostoldap-0.2 -- Versión inicial.
-
-* fotostoldap-0.3 -- Esta versión convierte la foto del alumno a .jpg y 
-la redimensiona a 80x80 pixeles.
-
-
-REQUIREMENTS.
-
-Requiere tener instalados los siguientes paquetes:
-* perl.
-* libnet-ldap-perl.
-* libarchive-zip-perl.
-* perlmagick.
-
-HOW DO I USE FOTOSTOLDAP?
-
-Uso: fotostoldap <path archivo Exportacion Datos Alumnado>
-
-
-COPYRIGHT AND LICENSE INFO
-
-    fotostoldap is Copyright 2010 by Esteban M Navas Martín, All Rights Reserved.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2, or (at your option)
-    any later version.
- 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
Index: fotos-ldap/trunk/fotostoldap/fotostoldap
===================================================================
--- fotos-ldap/trunk/fotostoldap/fotostoldap	(revision 528)
+++ fotos-ldap/trunk/fotostoldap/fotostoldap	(nonexistent)
@@ -1,123 +0,0 @@
-#!/usr/bin/perl
-#
-# Programa perl para subir las fotos de los alumnos al servidor ldap del centro
-# Toma como parámetro el fichero de exportación de datos de alumnado.
-# Sube a ldap las fotos que se encuentran en el fichero de exportación de datos 
-# de aquellos alumnos que no tengan foto en ldap.
-#
-# Esteban M. Navas
-# IES Valle del Jerte
-# Fecha creación: 30/09/2010
-# Fecha última modificación: 05/11/2010
-
-# Requisito: Instalar los módulos de perl libnet-ldap-perl, 
-# libarchive-zip-perl y perlmagick
-
-use Archive::Extract;
-use Net::LDAP;
-use Image::Magick;
-
-# Declaramos las funciones
-sub trim($);
-
-my $ldapserver = "ldap";
-my $archivo;
-
-if ($#ARGV != 0) {
-   print "Uso: fotostoldap <Path Archivo Exportacion Datos Alumnado.zip>\n\n";
-   print "Ejemplo: fotostoldap ExportacionDatosAlumnado.zip\n";
-   exit;
-} 
-
-if ( -e $ARGV[0] ) {
-   $archivo = $ARGV[0];
-}
-else {
-   print "El archivo $ARGV[0] no existe\n";
-   exit;
-}
-
-print "Descomprimiendo $archivo...\n";
-
-my $ae = Archive::Extract->new(archive => $archivo);
-my $ok = $ae->extract( to => '/tmp' ) or die $ae->error;
-my $outdir  = $ae->extract_path;
-my $files  = $ae->files;
-
-print "$archivo descomprimido en $outdir\n\n";
-
-print "Introduce la contraseña del administrador de ldap: ";
-system "stty -echo"; # disable echo
-chomp (my $pass = <STDIN>);
-system "stty echo"; # enable echo 
-
-$ldap = Net::LDAP->new("$ldapserver") or die "$@";
-
-# Abrimos una conexión
-$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
-
-# Obtenemos la lista de usuarios sin foto
-$mesg = $ldap->search(filter=>"(&(objectClass=inetOrgPerson)(!(jpegPhoto=*)))", base=>"ou=People,dc=instituto,dc=extremadura,dc=es");
-@entries = $mesg->entries;
-
-# Procesamos cada usuario sin foto
-foreach $entry (@entries) {
-   my $employeeNumber = $entry->get_value(employeeNumber);
-   my $cn = $entry->get_value(cn);
-
-   # Obtenemos el nombre del fichero
-   my $fichero = qx{ls $outdir | grep -iE '^$employeeNumber.[a-z]{3}'};
-
-   # Importante: Quitar los espacios que nos da la salida del qx{}
-   $fichero = trim($fichero);
-
-   # Si hay una foto para el alumno ...
-   if ( $fichero ) {
-      my $tmp; 
-      my $photo;
-
-      my $imagen = $outdir . "/" . $fichero;
-
-      # Cambiamos el tamaño y el formato de la imagen
-      my $nuevaimagen = Image::Magick->new;
-
-      $nuevaimagen->Read( filename => $imagen );
-      $nuevaimagen->Set( Gravity => 'Center' );
-      $nuevaimagen->Resize( geometry => '80x80' );
-      $nuevaimagen->Extent( geometry => '80x80' );
-
-      my $imagenretocada = $outdir . "/" . $employeeNumber . ".jpg";
-
-      $nuevaimagen->Write( "$imagenretocada" );
-
-      open(FILE, "$imagenretocada");
-      binmode(FILE);
-      $photo .= $tmp while (sysread FILE, $tmp, 1024); 
-      close(FILE);
-
-      $mesg = $ldap->modify($entry->dn(), add => {'jpegPhoto'=>$photo});
-
-      print "Foto $imagenretocada añadida a $cn\n";
-	  
-      # Borramos la image retocada
-      unlink $imagenretocada;
-   }
-}
-
-# Cerramos la conexión
-$ldap->unbind;
-
-# Borramos los archivos extraidos en el directorio $outdir
-foreach $file (@$files) {
-    unlink "$outdir/$file";
-}
-
-print "Proceso concluido.\n\n";
-
-sub trim($) 
-{
-   my $string = shift;
-   $string =~ s/^\s+//;
-   $string =~ s/\s+$//;
-   return $string;
-}

Property changes on: fotos-ldap/trunk/fotostoldap/fotostoldap
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: fotos-ldap/trunk/fotostoldap/LICENSE
===================================================================
--- fotos-ldap/trunk/fotostoldap/LICENSE	(revision 528)
+++ fotos-ldap/trunk/fotostoldap/LICENSE	(nonexistent)
@@ -1,12 +0,0 @@
-License
-
-fotostoldap is free software; you can redistribute it and/or modify 
-it under the terms of the GNU General Public License as published 
-by the Free Software Foundation; either version 3, or (at your option) 
-any later version.
-
-fotostoldap is distributed in the hope that it will be useful, 
-but WITHOUT ANY WARRANTY; without even the implied warranty of 
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
-
-See the GNU General Public License for more details. 
Index: quotas/setgroupquota.list
===================================================================
--- quotas/setgroupquota.list	(revision 528)
+++ quotas/setgroupquota.list	(nonexistent)
@@ -1,15 +0,0 @@
-%product setgroupquota
-%system all
-%copyright 2012 by Esteban M. Navas
-%vendor Esteban M. Navas
-%description Establecer quotas de disco para alumnos por grupos
-%version 0.1
-%readme README
-%license LICENSE
-%requires perl
-%requires libnet-ldap-perl
-%requires quota
-
-f 0755 root root /usr/local/sbin/setgroupquota setgroupquota
-
-

Property changes on: quotas/setgroupquota.list
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: quotas/README
===================================================================
--- quotas/README	(revision 528)
+++ quotas/README	(nonexistent)
@@ -1,38 +0,0 @@
-WHAT IS setgroupquota?
-
-	setgroupquota es un paquete que nos va a permitir establecer cuotas de disco para 
-	los usuarios de un grupo determinado. Ésto facilita el trabajo de los administradores,
-	ya que podemos asignar una quota de disco para alumnos, para profesores o para los 
-	alumnos de un grupo determinado de clase.
-	 
-	Este script perl busca los usuarios que pertenecen al grupo en el servidor de ldap.
-
-	setgroupquota instala el script perl setgroupquota en el directorio /usr/local/sbin
-
-	setgroupquota solicita que el usuario introduzca tres datos:
-
-	* La password del administrador de ldap para consultar los datos.
-	* El grupo al que le queremos asignar una quota de disco: teachers, students, E-1A ...
-	* La quota de disco que queremos asignar (número de bloques).
-
-	El nombre del grupo que hay que introducir es cualquiera de los que tengamos creado
-	en ldap.
-
-
-
-COPYRIGHT AND LICENSE INFO
-
-	setgroupquota is Copyright 2012 by Esteban M Navas Martín, All Rights Reserved.
-
-	This program is free software; you can redistribute it and/or modify
-	it under the terms of the GNU General Public License as published by
-	the Free Software Foundation; either version 2, or (at your option)
-	any later version.
- 
-	This program is distributed in the hope that it will be useful,
-	but WITHOUT ANY WARRANTY; without even the implied warranty of
-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	GNU General Public License for more details.
-    
-	You should have received a copy of the GNU General Public License
-	along with this program. If not, see <http://www.gnu.org/licenses/>.

Property changes on: quotas/README
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: quotas/setgroupquota
===================================================================
--- quotas/setgroupquota	(revision 528)
+++ quotas/setgroupquota	(nonexistent)
@@ -1,90 +0,0 @@
-#!/usr/bin/perl
-# ------------------------------------------------------------
-# script:  setgroupquota
-# Author:  Esteban M. Navas Mart�n
-# Date:    06-03-2011
-# Ver: 	   06-03-2011	
-# Requisito: Instalar el m�dulo de perl libnet-ldap-perl
-#
-# Purpose: This program set the quota for the users in a group class
-#
-# Copyright (c)	2012 Esteban M. Navas Mart�n <adminies.valledeljerte@edu.juntaextremadura.net>. All rights reserved.
-
-#   This program is free software; you can redistribute it and/or modify
-#   it under the terms of the GNU General Public License as published by
-#   the Free Software Foundation; either version 2 of the License, or
-#   (at your option) any later version.
-
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#   GNU General Public License for more details.
-#   You should have received a copy of the GNU General Public License
-#   along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-use Net::LDAP;
-
-my $ldapserver = ldap;
-my $baseGroup = "ou=Group,dc=instituto,dc=extremadura,dc=es";
-my $basePeople = "ou=People,dc=instituto,dc=extremadura,dc=es";
-my $groupClass;
-my $groupQuota;
-
-print "Introduce la contrase�a del administrador de ldap: ";
-system "stty -echo"; # disable echo
-chomp (my $pass = <STDIN>);
-system "stty echo"; # enable echo
-print "\n";
-
-print "Introduce el nombre del grupo de clase: ";
-chomp (my $groupClass = <STDIN>);
-
-if (! $groupClass) {
-    print "$0: Debe especificar el nombre del grupo\n";
-    print "Ejemplos: E-1A, E-1B, B-1A, disabled...\n";
-    exit 1;
-}
-
-print "Introduce la quota para el grupo de clase $groupClass: ";
-chomp (my $groupQuota = <STDIN>);
-
-if (! $groupQuota) {
-    print "$0: Debe especificar la quota que quiere asignar al grupo\n";
-    exit 1;
-}
-
-
-$ldap = Net::LDAP->new("$ldapserver") or die "$@";
-
-# Abrimos una conexi�n
-$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
-
-# Obtenemos los miembros del grupo elegido
-$mesg = $ldap->search(base=> $baseGroup, filter =>"(&(objectclass=posixGroup)(groupType=school_class)(cn=$groupClass))");
-
-$mesg->code && die $mesg->error;
-
-foreach $entry ($mesg->entries) {
-	my(@members) = $entry->get_value('memberUid');
-
-	foreach $memberUid (@members) {
-	   
-		$mesg2 = $ldap->search(base=> $basePeople, filter =>"(&(objectclass=posixAccount)(uid=$memberUid))");
-
-		$mesg2->code && die $mesg2->error;
-
-        @users = $mesg2->entries;
-
-		foreach $user (@users) {
-               	$uid = $user->get_value('uid');
-               	$uidNumber = $user->get_value('uidNumber');
-	    		print "Asignando quota de $groupQuota a $uid con uidNumber $uidNumber -> groupClass: $groupClass\n";
-	    		system ("setquota $uidNumber $groupQuota $groupQuota 0 0 /home");
-		}
-   	}
-}
-
-print "Proceso concluido.\n\n";
-
-$ldap->unbind;

Property changes on: quotas/setgroupquota
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: quotas/LICENSE
===================================================================
--- quotas/LICENSE	(revision 528)
+++ quotas/LICENSE	(nonexistent)
@@ -1,12 +0,0 @@
-License
-
-setgroupquota is free software; you can redistribute it and/or modify 
-it under the terms of the GNU General Public License as published 
-by the Free Software Foundation; either version 3, or (at your option) 
-any later version.
-
-setgroupquota is distributed in the hope that it will be useful, 
-but WITHOUT ANY WARRANTY; without even the implied warranty of 
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
-
-See the GNU General Public License for more details. 

Property changes on: quotas/LICENSE
___________________________________________________________________
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: ExportaCerts/trunk/Leeme.txt
===================================================================
--- ExportaCerts/trunk/Leeme.txt	(revision 528)
+++ ExportaCerts/trunk/Leeme.txt	(nonexistent)
@@ -1,21 +0,0 @@
-EXPORTACERTS
-================
-
-CONTENIDO:
-
-ExportaCerts.py: Programa principal. Obtiene datos de certificados de /var/lib/puppet/yaml/facts y del servidor LDAP, generando dos archivos csv
-que posteriormente pueden ser importados en la aplicacion CONTROLIES para dar de alta de forma automatizada los portatiles de los centros.
-Debeis modificar la IP que hace referencia al ldap, en la linea l = LdapConnection ("172.23.36.5"), y poner la de vuestro LDAP.
-
-Asimismo, debeis añadir la linea "by * read" en /etc/ldap/slapd.conf del LDAP para permitir obtener el campo "employeeID" de forma anonima, como
-sigue:
-
-access to attrs=employeeNumber,jpegPhoto
-        by dn="cn=replica,dc=instituto,dc=extremadura,dc=es" read
-        by dn="cn=interno,dc=instituto,dc=extremadura,dc=es" read
-        by * read
-
-
-LdapConnection.py: Utilidades para conectar y buscar en LDAP.
-
-
Index: ExportaCerts/trunk/LdapConnection.py
===================================================================
--- ExportaCerts/trunk/LdapConnection.py	(revision 528)
+++ ExportaCerts/trunk/LdapConnection.py	(nonexistent)
@@ -1,128 +0,0 @@
-##############################################################################
-# -*- coding: utf-8 -*-
-# Project:     ControlIES
-# Module:    LdapConnection.py
-# Purpose:     Connection with ldap server
-# Language:    Python 2.5
-# Date:        7-Feb-2011.
-# Ver:        7-Feb-2011.
-# Author:    Manuel Mora Gordillo
-# Copyright:    2011 - Manuel Mora Gordillo <manuito @no-spam@ gmail.com>
-#
-# ControlIES is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# ControlIES is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with ControlAula. If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-import ldap
-
-class LdapConnection(object):
-    
-    def __init__(self):
-        self.host = "172.23.36.5"
-        self.user = "admin"
-        self.passwd = "Sta1987teleco"
-
-    def setCredentials(self,host,user,passwd):
-        self.host = host
-        self.user = user
-        self.passwd = passwd
-
-    def validation(self):
-        if self.host == "":
-            return "host"
-
-        if self.user == "":
-            return "user"
-
-        if self.passwd == "":
-            return "password"
-
-        return "OK"
-
-    def process(self):
-        val = self.validation()
-            
-        if val != "OK":
-            return val
-
-        auth = self.connect()
-        return auth
-
-    def connect2(self):
-        ## first you must open a connection to the server
-        try:
-	    self.connection = ldap.open("172.23.36.5")
-	    self.connection.protocol_version = ldap.VERSION3
-        except ldap.LDAPError, e:
-	    print e
-
-
-    def search2(self,baseDN,filter,retrieveAttributes):
-        searchScope = ldap.SCOPE_SUBTREE
-        try:
-            ldap_result_id = self.connection.search(baseDN+ ",dc=instituto,dc=extremadura,dc=es", ldap.SCOPE_SUBTREE, filter, retrieveAttributes)
-            result_set = []
-            while 1:
-                result_type, result_data = self.connection.result(ldap_result_id, 0)
-                if (result_data == []):
-                    break
-                else:
-                    if result_type == ldap.RES_SEARCH_ENTRY:
-                        result_set.append(result_data)
-            return result_set
-        except ldap.LDAPError, e:
-	    print e
-
-    def getConnect(self):
-        return self.connection
-        
-    def add(self,baseDN,attr):
-        try:
-            self.connection.add_s(baseDN+",dc=instituto,dc=extremadura,dc=es", attr)
-            
-        except ldap.ALREADY_EXISTS:
-            logging.getLogger().debug("LDAP already exists %s" % (baseDN))
-        except ldap.OPERATIONS_ERROR:
-            logging.getLogger().debug("LDAP operation error %s" % (baseDN))
-        except ldap.NO_SUCH_OBJECT:
-            logging.getLogger().debug("LDAP no such object %s" % (baseDN))
-            
-        return True
-
-    def modify(self,baseDN,attr):
-        try:
-            self.connection.modify_s(baseDN+",dc=instituto,dc=extremadura,dc=es", attr)
-        except ldap.OPERATIONS_ERROR:
-            print "error"
-        except ldap.NO_SUCH_OBJECT:
-            print "no_such_object"
-        except Exception,e:
-            print e
-            
-        return True
-        
-    def delete(self,baseDN):
-        try:
-            self.connection.delete_s(baseDN+",dc=instituto,dc=extremadura,dc=es")
-            
-        except ldap.OPERATIONS_ERROR:
-            print "error"
-        except ldap.NO_SUCH_OBJECT:
-            print "no_such_object"
-            
-        return True
-        
-        
-    def close(self):
-        self.connection.unbind()
-        
-
Index: ExportaCerts/trunk/ExportaCerts.py
===================================================================
--- ExportaCerts/trunk/ExportaCerts.py	(revision 528)
+++ ExportaCerts/trunk/ExportaCerts.py	(nonexistent)
@@ -1,92 +0,0 @@
-##############################################################################
-# -*- coding: utf-8 -*-
-# Project:      EnciendeEquipos
-# Module:    	EnciendeEquipos.py
-# Purpose:     	Wakes up classrom servers in an IES environment
-# Language:    	Python 2.5
-# Date:        	23-Feb-2011.
-# Ver:         	23-Feb-2011.
-# Author:    	Francisco Mendez Palma
-# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
-#
-# EnciendeEquipos is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# EnciendeEquipos is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-##############################################################################
-
-from LdapConnection import LdapConnection
-#import NetworkUtils
-import sys
-import os
-import datetime
-
-
-l = LdapConnection()
-l.connect2()
-
-#leer archivos 
-path = '/var/lib/puppet/yaml/facts/'
-listing = os.listdir(path)
-
-# ficheros de intercambio para profesores y alumnos
-fp = open('./profesores.csv','w')
-fa = open('./alumnos.csv','w')
-for infile in listing:
-    # leer primero datos del archivo de certificado
-    f = open(path+infile)
-    quienes="alumno"
-    registro=""
-    line = f.readline()
-    serialnumber=""
-    marcamodelo="1"
-    username=infile.replace(".santaeulalia.yaml", "")
-    while line:
-        if "serialnumber" in line:
-            serialnumber=line.replace("    serialnumber: ", "")
-            serialnumber=serialnumber.replace(" ", "")
-            serialnumber=serialnumber.replace("\n","")
-            serialnumber=serialnumber.replace("serialnumber:", "")
-        if "manufacturer" in line:
-            manufacturer=line.replace("    manufacturer: ", "")
-            manufacturer=manufacturer.replace(" ", "")
-            manufacturer=manufacturer.replace('"',"")
-            manufacturer=manufacturer.replace("\n","")
-            marcamodelo="2"
-            if "Acer" in manufacturer:
-                marcamodelo="1"
-        line = f.readline()
-
-    # buscar en ldap datos restantes. Inicialmente, suponemos que se trata de un alumno
-    filter="(homeDirectory=/home/alumnos/" + username + ")"
-    search  = l.search2("ou=People",filter,["cn","employeeNumber","homeDirectory"])
-    # si no, es un profe
-    if not search:
-        quienes="profesor"
-        filter="(homeDirectory=/home/profesor/" + username + ")"
-        search  = l.search2("ou=People",filter,["cn","employeeNumber","homeDirectory"])
-    # añadir datos a linea
-    if search:
-        uid=search[0][0][1]['employeeNumber'][0]
-        logname=search [0][0][1]["cn"][0]
-        if serialnumber:
-            registro=registro+"PORTATIL, '"+serialnumber+"', "+marcamodelo + ", "
-            now = datetime.datetime(2009,5,5)
-            str_now = now.date().isoformat()
-            registro=registro+"HISTORICO, " + str_now + "', '" + uid + "', 2, '', 1, '" + username + "', '" + logname + "'"
-            if quienes=="alumno":
-                fa.write(registro+'\n')
-            else:
-                fp.write(registro+'\n')
-            print registro
-    f.close()
-fp.close()
-fa.close()
-    #print registro
-
-
Index: EnciendeEquipos/trunk/NetworkUtils.py
===================================================================
--- EnciendeEquipos/trunk/NetworkUtils.py	(revision 528)
+++ EnciendeEquipos/trunk/NetworkUtils.py	(nonexistent)
@@ -1,47 +0,0 @@
-##############################################################################
-# -*- coding: utf-8 -*-
-# Project:     EnciendeEquipos
-# Module:     NetworkUtils.py
-# Purpose:     Network utilities
-# Language:    Python 2.5
-# Date:        17-Jan-2010.
-# Ver:        17-Jan-2010.
-# Author:    José L. Redrejo Rodríguez
-# Copyright:   2009 - José L. Redrejo Rodríguez    <jredrejo @nospam@ debian.org>
-#
-# EnciendeEquipos is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# EnciendeEquipos is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-##############################################################################
-
-import socket,struct
-
-def startup(address):
-
-    addr_byte = address.split(':')
-    hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16),
-      int(addr_byte[1], 16),
-      int(addr_byte[2], 16),
-      int(addr_byte[3], 16),
-      int(addr_byte[4], 16),
-      int(addr_byte[5], 16))
-
-    msg = '\xff' * 6 + hw_addr * 16
-    
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
-    try:
-        s.sendto(msg, ('<broadcast>', 9))
-        s.sendto(msg, ('<broadcast>', 7))
-        s.sendto(msg, ('192.168.0.255', 9))
-        s.sendto(msg, ('192.168.0.255', 7))   
-    except:
-        s.sendto(msg, ('<broadcast>', 2000))
-        s.sendto(msg, ('192.168.0.255', 2000))
-    s.close()
Index: EnciendeEquipos/trunk/Leeme.txt
===================================================================
--- EnciendeEquipos/trunk/Leeme.txt	(revision 528)
+++ EnciendeEquipos/trunk/Leeme.txt	(nonexistent)
@@ -1,22 +0,0 @@
-ENCIENDE EQUIPOS
-================
-
-CONTENIDO:
-
-EnciendeEquipos.py: Programa principal. Realiza consulta anonima a LDAP, obteniendo las MAC's de los equipos que quieren encenderse. Utiliza dos filtros
-distintos para realizar la consulta: uno se refiere a los equipos del diurno y otro a los del nocturno, podeis modificarlos a vuestro antojo e incluir los 
-equipos que querais. La consulta para obtener las MAC'S la hace en la rama host del LDAP. Debeis modificar la IP que hace referencia al ldap, en la linea
-l = LdapConnection ("172.23.36.5"), y poner la de vuestro LDAP.
-
-NetworkUtils.py: Contiene funcion para el encendido de un equipo, a partir de su mac. Esta funcion ha sido programada por J.L. Redrejo.
-
-LdapConnection.py: Utilidades para conectar y buscar en LDAP.
-
-
-INSTRUCCIONES DE USO:
-
-Copiar carpeta EnciendeEquipos en /usr/bin del servidor. Modificar crontab para que se lance en el momento del dia que nos interese:
-
-20 8 * * 1-5 root /usr/bin/python /usr/bin/EnciendeEquipos/EnciendeEquipos.py    (para el dia)
-
-35 17 * * 1-5 root /usr/bin/python /usr/bin/EnciendeEquipos/EnciendeEquipos.py Noche    (para la noche)
Index: EnciendeEquipos/trunk/LdapConnection.py
===================================================================
--- EnciendeEquipos/trunk/LdapConnection.py	(revision 528)
+++ EnciendeEquipos/trunk/LdapConnection.py	(nonexistent)
@@ -1,60 +0,0 @@
-##############################################################################
-# -*- coding: utf-8 -*-
-# Project:      EnciendeEquipos
-# Module:    	LdapConnection.py
-# Purpose:     	Anonymous Connection with ldap server
-# Language:    	Python 2.5
-# Date:        	23-Feb-2011.
-# Ver:         	23-Feb-2011.
-# Author:    	Francisco Mendez Palma
-# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
-#
-# EnciendeEquipos is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# EnciendeEquipos is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-##############################################################################
-
-import ldap
-
-class LdapConnection(object):
-
-    def __init__(self,host):
-		self.host = host
-
-    def connect(self):
-		## first you must open a connection to the server
-		
-		try:
-			self.connect=ldap.open(self.host)
-			## searching doesn't require a bind in LDAP V3.  If you're using LDAP v2, set the next line appropriately
-			## and do a bind as shown in the above example.
-			# you can also set this to ldap.VERSION2 if you're using a v2 directory
-			# you should  set the next option to ldap.VERSION2 if you're using a v2 directory
-			self.protocol_version = ldap.VERSION3
-		except ldap.LDAPError, e:
-			return False
-			# handle error however you like
-			
-		return True
-
-    def search(self,baseDN,filter,retrieveAttributes):
-		
-		try:
-			ldap_result_id = self.connect.search(baseDN+",dc=instituto,dc=extremadura,dc=es", ldap.SCOPE_SUBTREE, filter, retrieveAttributes)
-			result_set = []
-			while 1:
-				result_type, result_data = self.connect.result(ldap_result_id, 0)
-				if (result_data == []):
-					break
-				else:
-					if result_type == ldap.RES_SEARCH_ENTRY:
-						result_set.append(result_data)
-			return result_set
-		except ldap.LDAPError, e:
-			print e
Index: EnciendeEquipos/trunk/EnciendeEquipos.py
===================================================================
--- EnciendeEquipos/trunk/EnciendeEquipos.py	(revision 528)
+++ EnciendeEquipos/trunk/EnciendeEquipos.py	(nonexistent)
@@ -1,48 +0,0 @@
-##############################################################################
-# -*- coding: utf-8 -*-
-# Project:      EnciendeEquipos
-# Module:    	EnciendeEquipos.py
-# Purpose:     	Wakes up classrom servers in an IES environment
-# Language:    	Python 2.5
-# Date:        	23-Feb-2011.
-# Ver:         	23-Feb-2011.
-# Author:    	Francisco Mendez Palma
-# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
-#
-# EnciendeEquipos is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# EnciendeEquipos is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-##############################################################################
-
-from LdapConnection import LdapConnection
-import NetworkUtils
-import sys
-
-# Capturo argumento para saber que ordenadores encender: Nocturno ("Noche") o Diurno (vacio)
-if len (sys.argv)==2:
-	cuando=sys.argv[1]
-else:
-	cuando="Dia"
-
-#Conexion anonima: solo ip del ldap
-l = LdapConnection("172.23.36.5")
-l.connect()
-
-#Segun momento del dia, encendemos distintos equipos
-if cuando=="Noche":
-	filter="(|(cn=d-profesores*)(cn=a02-pro)(cn=a03-pro)(cn=a15-pro)(cn=a16-pro)(cn=a17-pro)(cn=a18-pro)(cn=a32-pro)(cn=a33-pro)(cn=a34-pro)(cn=a35-pro))"
-else:
-	filter="(|(cn=*-pro*)(cn=d-profesores*))"
-	
-search  = l.search("ou=hosts",filter,["macAddress"])
-
-#Obtenemos macs y lanzamos encendido
-for elto in search:
-	mac=elto[0][1]["macAddress"][0]
-	NetworkUtils.startup(mac)
Index: scripts/ltsp-server/wifi-ltsp/trunk/configura_hostapd.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/configura_hostapd.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/configura_hostapd.py	(revision 529)
@@ -0,0 +1,245 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     configura_hostapd.py
+# Purpose:     genera un archivo hostapc.accept para dar acceso a internet a los alumnos.
+# Language:    Python 2.5
+# Date:        07-Feb-2011.
+# Ver:        07-Feb-2011.
+# Author:    Isabel Aparicio Pérez
+# Copyright:   2011 - Isabel Aparicio Pérez    <prog5pe@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# Script2 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+""" Este programa genera el archivo hostapd.access necesario para que en el momento del logueo del
+profesor se de acceso a internet a los alumnos que tienen clase en esa hora con ese profesor. Para ello
+tenemos que recoger el dia de la semana y la hora actual que tiene el servidor de aula y con el dia actual
+buscar en el servidor nfs el fichero del dia de la semana que corresponde con el dia concreto. El fichero
+descargado del servidor nfs se almacena en el servidor de aula en la ruta /wifi con el nombre horario.txt.
+Tambien controlamos el usuario que esta logueado en ese preciso momento en el servidor. A partir del usuario
+logueado, de la hora del sistema y del fichero descargado del servidor nfs se genera el fichero hostapd.access 
+con las mac de los alumnos correspondientes.
+
+Isabel Aparicio Pérez
+Consejería de Educacion.
+prog5pe@edu.juntaextremadura.net
+
+"""
+
+import time
+import urllib
+import os
+import sys
+from parsehostapd import parsehostapd
+import socket
+import logging
+import subprocess
+from shutil import copy
+
+LOG_FILENAME= "/var/log/configura-hostapd.log"
+fecha=[]
+ip=[]
+dia_semana={"Mon":"lunes.txt","Tue":"martes.txt","Wed":"miercoles.txt","Thu":"jueves.txt","Fri":"viernes.txt"}
+
+
+def dia_actual():
+    """con esta funcion se obtiene la fecha actual que tiene el servidor de aula"""
+    hoy = time.asctime() 
+    return hoy
+
+def fichero_semana(fecha1):	
+    """Con esta funcion se obtiene la parte de la fecha actual que corresponde con el dia de la semana"""
+    dia= fecha1[0:3]
+    if dia not in ["Mon","Tue","Wed","Thu","Fri"]:
+        logging.getLogger().error("El formato de la fecha del sistema no es el esperado")
+        return ""
+    else:
+        fichero=dia_semana[dia]
+    return fichero
+
+def hora_actual(fecha1):
+    """Con esta funcion se obtiene la hora actual del sistema sin los : de forma que la 08:45 se representaran
+    como la 0845"""
+    hora= fecha1[11:13]+fecha1[14:16]
+    h=int(hora)
+    if (h<int(0000) or h>int(2500)):
+        logging.getLogger().error("El formato de la hora del sistema no es el esperado")
+        return "9999"
+    else:
+        return hora
+	
+
+def descargar_fichero(fichero):
+    """funcion que se encarga de descargar el fichero del dia de la semana correspondiente al dia actual del
+    servidor nfs y colocarlo en la ubicacion correcta en el servidor de terminales con el nombre de horario.txt"""
+    archivo="http://servidor/wifi/"+fichero
+    print archivo
+    destino="/wifi/horario.txt"
+    destino2="/wifi"
+    if not os.path.exists(destino2):
+        logging.getLogger().debug("La ruta destino no existe y hay que crearla")
+        try:
+            os.makedirs(destino2)
+        except OSError:
+            logging.getLogger().error("Hay algun error a la hora de crear el directorio /wifi en el servidor de aula")
+    try:
+        urllib.urlretrieve(archivo, destino)
+    except:
+        logging.getLogger().error("No hay acceso al servidor para encontrar el fichero de horario")
+        return ""
+    return destino
+
+
+def devuelve_usuario():
+    """con esta funcion recogemos el usuario que esta logueado en ese momento en el ordenador, seguira intentandolo 
+    hasta que se loguee antes"""
+    resultado = sys.argv[1]
+    return resultado
+	
+def crea_hostapd(destino,resultado,hora):
+    """con esta funcion generamos el fichero hostapd con las mac correspondientes a los alumnos a los que se 
+    les va a dar acceso a internet y lo colocamos en la ruta correcta."""
+    if not os.path.exists(destino):
+        logging.getLogger().error("Hay un error el el fichero horario.txt en el servidor de aula")
+        return ""
+    else:
+        try:
+            copy("/etc/hostapd/hostapd.accept","/etc/hostapd/hostapd.accept.bak")
+        except:
+            pass
+        f=open(destino,"r")
+    if not os.path.exists("/etc/hostapd"):
+        try:
+            os.makedirs("/etc/hostapd")
+        except IOError:
+            logging.getLogger().error("Ha habido algun error a la hora de crear el directorio /etc/hostapd")
+            return ""
+    if not os.access("/etc/hostapd", os.W_OK):
+        logging.getLogger().error("No tiene permisos de escritura sobre el directorio /etc/hostapd")
+        return ""
+    else:
+        g=open("/etc/hostapd/hostapd.accept","w")
+        
+    esta_en_horario=False
+    while True:
+        dato=f.readline()
+        if not dato:
+            break 
+        else:
+            lin=dato.split("|")
+            if lin[0]==resultado:   
+                if hora>lin[2] and hora<lin[3]:
+                    g.write(lin[1])
+                    g.write("\n")
+                    esta_en_horario=True
+    f.close()
+    g.close()
+
+    #si un profesor de guardia hace login, se autorizan automáticamente los 
+    #alumnos que hubiera autorizado el profesor anterior:
+    if not esta_en_horario:
+        try:
+            copy("/etc/hostapd/hostapd.accept.bak","/etc/hostapd/hostapd.accept")
+        except:
+            pass
+
+    return g
+
+def inicia_hostapd():
+    subprocess.Popen(["ifconfig","wlan0","up"])
+    subprocess.Popen(["invoke-rc.d","hostapd","restart"])
+
+def userIsTeacher(user_name):   
+    p1 = subprocess.Popen(["id", "-Gn",user_name], stdout=subprocess.PIPE)
+    p2 = subprocess.Popen(["grep", 'teachers'], stdin=p1.stdout, stdout=subprocess.PIPE)
+    output = p2.communicate()[0]
+    return (output != '')	
+
+if  __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG,
+                format='%(asctime)s %(levelname)-8s %(message)s',
+                datefmt='%a, %d %b %Y %H:%M:%S',
+                filename=LOG_FILENAME)
+                
+    if len(sys.argv)>1:                    
+        dia_hoy=""
+        hora=""
+        user=""
+        fich=""
+        hos=""
+        res=""
+        f=""
+
+        dia_hoy=dia_actual()
+        hora=hora_actual(dia_hoy)
+        fich=fichero_semana(dia_hoy)
+        f=descargar_fichero(fich)
+        if f!="":
+            user=devuelve_usuario()
+            if userIsTeacher(user):
+                hos=crea_hostapd(f,user,hora) 
+            else: #login de un alumno
+                subprocess.Popen(["invoke-rc.d","hostapd","stop"]).wait()
+                sys.exit(0)
+        
+        if hos=="":
+            logging.getLogger().error("Error al generar las mac autorizadas")
+
+
+    #Aquí metemos ahora la reconfiguración de hostapd.conf con la parte
+    #hecha por Francisco Mora
+    hostapdconf="/etc/hostapd/hostapd.conf"
+
+    canaloptimo = parsehostapd.selectbestchannel(True)
+
+    ssid = socket.gethostname()
+    pos = ssid.find(".")
+    if pos > -1:
+        ssid = ssid[:pos]
+    pos = ssid.find("-pro")
+    if pos > -1:
+        ssid = ssid[:pos]
+    try:
+        #Abre el archivo para lectura de datos
+        archivoLectura = open(hostapdconf,"r")
+        lineas = archivoLectura.readlines()
+        archivoLectura.close()
+    except (RuntimeError, TypeError, NameError, IOError):
+        logging.getLogger().error("Error en la ubicacion o nombre del archivo")
+        sys.exit(0) #salimos con 0 para no fastidiar gdm
+    #Modifica la cadena del channel y ssid
+    encontradoChannel = False
+    encontradoSsid = False
+    for numlinea in range(0, len(lineas)):
+        linea = lineas[numlinea]
+        #comprobamos si estamos en channel o en ssid
+        if linea[:7] == "channel":
+            encontradoChannel = True
+            lineas[numlinea] = "channel="+str(canaloptimo)+"\n"
+        if linea[:4] == "ssid":
+            encontradoSsid = True
+            lineas[numlinea] = "ssid="+ssid+"\n"
+    if not encontradoChannel:
+        lineas.append("channel="+str(canaloptimo)+"\n")
+    if not encontradoSsid:
+        lineas.append("ssid="+ssid+"\n")
+            
+    #Abre el archivo para escritura de datos
+    archivoEscritura = open(hostapdconf,"w")
+    archivoEscritura.writelines(lineas)
+    archivoEscritura.close()
+    logging.getLogger().debug('Establecido el canal %s con ESSID %s' %   (canaloptimo,ssid))
+
+
+
+    res=inicia_hostapd()
+

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/configura_hostapd.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mergeinfo
## -0,0 +0,0 ##
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/changelog
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/changelog	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/changelog	(revision 529)
@@ -0,0 +1,31 @@
+wifi-ltsp (0.5-1) unstable; urgency=low
+
+  * Nueva versión para ordenadores con Debian Squeeze
+  * Si no se le pasa parámetro a configura_hostapd.py no crea las macs
+
+ -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Thu, 24 Nov 2011 12:47:54 +0100
+
+wifi-ltsp (0.4-1) unstable; urgency=low
+
+  * Autoriza wifi para guardias
+
+ -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Mon, 21 Mar 2011 18:05:33 +0100
+
+wifi-ltsp (0.3-1) unstable; urgency=low
+
+  * Contempla alguna posibilidad más
+
+ -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Wed, 16 Feb 2011 12:42:31 +0100
+
+wifi-ltsp (0.2-1) unstable; urgency=low
+
+  * Corregidos bugs detectados en pruebas
+
+ -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Fri, 11 Feb 2011 11:03:17 +0100
+
+wifi-ltsp (0.1-1) unstable; urgency=low
+
+  * First version
+
+ -- José L. Redrejo Rodríguez <jredrejo@debian.org>  Wed, 09 Feb 2011 12:42:48 +0100
+
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/rules
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/rules	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/rules	(revision 529)
@@ -0,0 +1,50 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+build: build-stamp
+
+build-stamp:
+	dh_testdir
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp 
+	rm -Rf build
+
+	dh_clean 
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k 
+	dh_installdirs
+	python setup.py install --prefix=/usr --install-layout=deb  --root=$(CURDIR)/debian/wifi-ltsp
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs 
+	dh_installdocs
+	dh_installman 
+	dh_install
+	dh_python2
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+# Build architecture-dependent files here.
+binary-arch: build install
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/debian/rules
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/postrm
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/postrm	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/postrm	(revision 529)
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+if  grep configura_hostapd  /etc/sudoers > /dev/null ; then
+	sed -i -r -e '/configura_hostapd/d' /etc/sudoers
+	chmod 0440 /etc/sudoers
+fi
+
+exit 0
+
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/install
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/install	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/install	(revision 529)
@@ -0,0 +1 @@
+autoriza-wifi.desktop usr/share/applications
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/dirs
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/dirs	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/dirs	(revision 529)
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/applications
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/postinst
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/postinst	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/postinst	(revision 529)
@@ -0,0 +1,9 @@
+#! /bin/sh
+
+set -e
+
+if ! grep configura_hostapd.py  /etc/sudoers > /dev/null ; then
+	echo "%teachers  ALL = NOPASSWD: /usr/bin/configura_hostapd.py" >> /etc/sudoers
+	chmod 0440 /etc/sudoers
+fi
+
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/control
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/control	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/control	(revision 529)
@@ -0,0 +1,19 @@
+Source: wifi-ltsp
+Section: admin
+Priority: optional
+Maintainer: José L. Redrejo Rodríguez <jredrejo@debian.org>
+Standards-Version: 3.8.2
+Build-Depends: debhelper (>= 5.0.37.2), python-support (>= 0.3)
+Build-Depends-Indep: python
+Homepage:http://desarrollo.educarex.es/linex/projects/servidoressecundaria/repository/show/wifi-ltsp
+
+Package: wifi-ltsp
+Architecture: all
+Depends: ${python:Depends}, hostapd
+Description: Hostapd auto configuration
+ Configura automáticamente hostapd en función de la información 
+ recibida desde el servidor del centro con los horarios de los 
+ profesores.
+ .
+ Escoje el mejor canal wifi disponible, autoriza a los alumnos 
+ correspondientes, coloca el essid del aula y reinicia hostapd
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/compat
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/compat	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/compat	(revision 529)
@@ -0,0 +1 @@
+5
Index: scripts/ltsp-server/wifi-ltsp/trunk/debian/copyright
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/debian/copyright	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/debian/copyright	(revision 529)
@@ -0,0 +1,30 @@
+This package was debianized by José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net> on
+Wed, 09 Feb 2011 12:42:48 +0100.
+
+
+Upstream Authors:   José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net>
+                    Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
+                    Isabel Aparicio Pérez <prog5pe@edu.juntaextremadura.net>
+
+Copyright:
+
+    Copyright (C) 2011 José L. Redrejo Rodríguez <jredrejo@edu.juntaextremadura.net>,
+                            Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
+                            Isabel Aparicio Pérez <prog5pe@edu.juntaextremadura.net>
+    
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+On Debian GNU/Linux systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
Index: scripts/ltsp-server/wifi-ltsp/trunk/transformaArchivos.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/transformaArchivos.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/transformaArchivos.py	(revision 529)
@@ -0,0 +1,383 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     transformaArchivos.py
+# Purpose:     Genera archivo de macs con horarios desde Rayuela y Ldap
+# Language:    Python 2.5
+# Date:        03-Feb-2011.
+# Ver:        07-Feb-2011.
+# Author:    Francisco Mora Sánchez
+# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# Script2 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+""" Programa para generar los archivos necesarios para permitir
+que los portátiles de los alumnos puedan unirse al punto de acceso
+hostapd del profesor, según el horario del propio profesor, y los
+alumnos que tienen clase con él a esa hora.
+
+Partiremos de los archivos de datos generados por Rayuela, el formato
+de estos archivos es: por cada centro hay un directorio con cinco archivos
+uno por cada día de la semana, llamados Lunes.txt, Martes.txt, Miercoles.txt,
+Jueves.txt y Viernes.txt. Cada uno de estos archivos de texto contienen 
+la siguiente información:
+
+D.N.I. del docente|N.I.A. del alumno|Hora de inicio|Hora de fin
+08848648L|3251023|815|870|
+08848648L|3383767|815|870|
+08848648L|3383770|815|870| 
+
+la primera línea indica la estructura y a partir de ésta están los datos
+que son: dni del profesor, nie del alumno y horas de inicio y fin expresadas
+como minutos transcurridos desde las 00:00 horas.
+
+Los ficheros que se generan, deben copiarse al directorio de destino
+especificado como parámetro, y que en caso de no darse será por defecto
+"/var/www/wifi/(lunes.txt|martex.txt|miercoles.txt|jueves.txt|viernes.txt)"
+si la ruta no existe, ésta se creará. Para escribir en el destino debemos
+tener los privilegios adecuados.
+
+Los archivos que generaremos, tendrán el mismo nombre, sin mayúsculas, pero
+el formato será el siguiente:
+
+login_profesor|mac_alumno|inicio|fin|
+
+no tenemos línea descriptora de estructura, y los datos se obtienen de
+realizar consulta al directorio ldap del centro, para lo cual es necesario
+que tengamos instalado el paquete python-ldap, además de python, claro está.
+El dato de login_profesor es directo en la consulta a ldap, así como la 
+generación de las horas y minutos, pero el dato de mac_alumno, se realiza
+consultando ldap para obtener el login del alumno, que concuerda con el
+nombre del portátil asignado al alumno. A partir de este dato accederemos
+a la información recogida por puppet de cada ordenador, que se encuentra
+en /var/lib/puppet/yaml/node/(login_del_alumno.dominiodelcentro).yaml, 
+para obtener la mac de la interfaz wifi asociada a ese portátil. Las
+líneas importantes son: macaddress_wlan0 o macaddress_eth1 que se
+establece en algunos modelos de portátiles.
+
+Uso: crearemos una carpeta donde copiaremos este programa y además 
+pondremos los txts obtenidos por Rayuela, ejecutaremos el script pasando
+como parámetros el lugar donde están los archivos con el parámetro
+--datosrayuela rutarayuela, y tambien el lugar donde queremos depositar los
+archivos generados, con el parámetros --datosservidor rutaservidor.
+Si --datosrayuela no se establece, asumiremos el directorio actual, si
+--datosservidor no está establecido, se establecerá internamente en
+/var/www/wifi, creando la estructura de directorios mencionada si es que 
+no existe, además comprobaremos que disponemos de privilegios para escribir
+en el directorio de destino.
+
+Francisco Mora Sánchez
+IES Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+
+"""
+
+import sys,os,re
+import ldap
+
+# Expresiones Regulares.
+_re_mode = (re.I | re.M | re.S)
+macwlan0_pattern = re.compile('.*macaddress_wlan0: (.*?)\n', _re_mode)
+maceth1_pattern = re.compile('.*macaddress_eth1: (.*?)\n', _re_mode)
+
+			
+def EjecutaRegex(regex, cadena):
+    """ ejecuta búsqueda de expresión regular en una cadena """
+    m = regex.search(cadena)
+    if m:
+        return m.groups()[0]
+    else:
+        return None
+
+			
+def lee_parametros(lista,params):
+	"""Funcion que crea un diccionario para leer el valor de los 
+	parametros que se pasan en la linea de comandos."""
+	for i in range(1,len(lista)):
+		if lista[i][:2] == "--":
+			#veamos si tiene valor
+			if i+1 < len(lista) and lista[i+1] <> "--":
+				#estamos en un parametro y valor
+				params[lista[i][2:]] = lista[i+1]
+
+def dameDatosLineaRayuela(linea):
+	"""Funcion que trocea la linea de datos de rayuela y
+	devuelve un diccionario cuyas claves son login_profesor
+	login_alumno, inicio y final
+	"""
+	datos = linea.split("|")
+	return { "dni_profesor" : datos[0], "nie_alumno" : datos[1], "inicio" : datos[2], "final" : datos[3]}
+
+def consultaLdap(identificador, contra):
+	"""Función que consulta el servidor ldap, con el atributo
+	employeeNumber. Devuelve el login asociado al profesor o al alumno
+	"""
+	try:
+			l = ldap.open("ldap")
+			l.protocol_version = ldap.VERSION3
+			usuario = 'cn=Admin,ou=People,dc=instituto,dc=extremadura,dc=es'
+			l.simple_bind(usuario, contra)
+			
+	except ldap.LDAPError, e:
+			print e
+			return "ERRORLDAP"
+	
+	base_dn='ou=People,dc=instituto,dc=extremadura,dc=es'
+	searchFilter = '(employeeNumber='+identificador+')'
+	searchScope = ldap.SCOPE_SUBTREE
+	
+	retrieveAttributes = ['uid']
+	
+	try:
+		ldap_result_id = l.search(base_dn, searchScope, searchFilter, retrieveAttributes)
+		result_type, result_data = l.result(ldap_result_id, 0)
+		if len(result_data)==0:
+			#print "la búsqueda no da ningún resultado"
+			return "NO ENCONTRADO"
+		elif len(result_data)>1:
+			#print "La búsqueda da más de un resultado"
+			resultado= result_data[0]
+		else:
+			resultado=result_data[0]
+			
+		#print resultado[1]['uid'][0]
+	except ldap.LDAPError, e:
+			print e
+			print "ERRORLDAP"
+
+	return resultado[1]['uid'][0]
+
+def obtenerMac(login_alumno, archivosYaml, datosyaml):
+	"""Función que dado un login de alumno, buscará en el archivo yaml
+	de puppet asociado a ese login de alumno, la cadena macaddress_wlan0,
+	o bien macaddress_eth1 en caso que no exista la primera. Esta función
+	quizá se deba testear bien.
+	Tenemos disponible la lista archivosYaml con todos los archivos yaml
+	de puppet, incluyendo sus rutas...
+	"""
+	#Primero buscamos el archivo en cuestion, tendrá el login_alumno mas
+	#un punto, dominio, punto y terminación yaml, busquemos el patrón con dos puntos
+	#ya que suele haber archivos fantasmas con el nombre solamente.
+	for a in archivosYaml:
+		if a.count(".") == 2:
+			#Estamos en un patrón de archivo correcto.
+			pos = a.find(".")
+			sufijo = a[pos:]
+			break
+			
+	archivoDatosYaml = login_alumno + sufijo
+	try:
+		filearchivoDatosYaml = open(os.path.join(datosyaml,archivoDatosYaml), "r")
+	except:
+		pass
+		return "99:99:99:99:99:99"
+	contenidoyaml = filearchivoDatosYaml.read()
+	filearchivoDatosYaml.close() 
+	#print contenidoyaml
+	mac = EjecutaRegex(macwlan0_pattern, contenidoyaml)
+	if mac == None:
+		mac = EjecutaRegex(maceth1_pattern, contenidoyaml)
+	#print mac
+	if mac == None:
+		mac = "99:99:99:99:99:99"
+	return mac
+	
+def transformaHora(datohora):
+	"""Función que pasado un parámetro numérico que almacena los minutos
+	desde las 00:00. 
+	Devuelve una cadena en la forma "08:35", con la hora y los minutos.
+	"""
+	hora = datohora // 60
+	minutos = datohora % 60
+	return "%02d%02d" % (hora,minutos)
+	
+def transformaArchivos(datosrayuela, datosservidor, datosyaml, contra, debug = False):
+	#Comprobemos la existencia del directorio de datos de Rayuela
+	if not os.path.exists(datosrayuela):
+		if debug:
+			print "Directorio para datos de rayuela",datosrayuela,"no existe, abortando ejecución..."
+		return 1
+
+	#Comprobemos que sea un directorio
+	if not os.path.isdir(datosrayuela):
+		if debug:
+			print "Directorio para datos de rayuela",datosrayuela,"no es un directorio, abortando ejecución..."
+		return 2
+		
+	#Comprobemos que tengamos permisos de apertura y lectura de archivos
+	if os.path.isdir(datosrayuela):
+		try:
+			archivosRayuela = os.listdir(datosrayuela)
+		except:
+			if debug:
+				print "Directorio para datos de rayuela",datosrayuela,"problemas de permisos en carpeta, abortando ejecución..."
+			return 3
+
+	#Comprobemos que existe el directorio de destino
+	if not os.path.exists(datosservidor):
+		#No existe directorio de destino, debemos crearlo
+		if debug:
+			print "No existe directorio de destino en servidor",datosservidor,"se intentará crear directorio..."
+		try:
+			os.makedirs(datosservidor)
+		except OSError:
+			if debug:
+				print "Hay algún problema con la creación del directorio de destino, abortando ejecución..."
+			return 4
+	
+	#Comprobemos que tenemos permisos de escritura 
+	if os.path.exists(datosservidor):
+		if not os.access(datosservidor, os.W_OK):
+			if debug:
+				print "Hay algún problema de permisos para la creación de archivos en el directorio de destino del servidor, abortando ejecución..."
+			return 5
+
+	#Comprobemos la existencia del directorio de datos yaml de puppet
+	if not os.path.exists(datosyaml):
+		if debug:
+			print "Directorio para datos yaml de puppet",datosyaml,"no existe, abortando ejecución..."
+		return 6
+
+	#Comprobemos que sea un directorio
+	if not os.path.isdir(datosyaml):
+		if debug:
+			print "Directorio para datos yaml de puppet",datosyaml,"no es un directorio, abortando ejecución..."
+		return 7
+		
+	#Comprobemos que tengamos permisos de apertura y lectura de archivos
+	if os.path.isdir(datosyaml):
+		try:
+			#archivosYaml = glob.glob(os.path.join(params["datosyaml"],"*.*.yaml"))
+			archivosYaml = os.listdir(datosyaml)
+		except:
+			if debug:
+				print "Directorio para datos yaml de puppet",datosyaml,"problemas de permisos en directorio, abortando ejecución..."
+			return 8
+			
+	#Limpiemos las listas de archivos 
+	#Tengamos en cuenta que los archivos entregados por rayuela pueden contener distinto patron en mayusculas y minusculas
+	dicArchivosRayuela = {"lunes.txt":"","martes.txt":"","miercoles.txt":"","jueves.txt":"","viernes.txt":""}
+	for archivoRayuela in archivosRayuela:
+		if archivoRayuela.lower() in dicArchivosRayuela.keys():
+			dicArchivosRayuela[archivoRayuela.lower()] = archivoRayuela
+
+	archivosYaml = [ archivo for archivo in archivosYaml if archivo[-5:] == ".yaml"]
+	#print archivosRayuela
+	#print archivosYaml
+	#Para evitar consultar al servidor ldap varias veces para un mismo dni o nie crearemos 
+	#dos diccionarios, uno para profesores y otro para alumnos con los datos que
+	#recuperaremos del servidor ldap, además otro con los logins de alumnos y
+	#las macs
+	#profesores = { "dni" : "login_profesor", ... }
+	#alumnos = { "nie" : "login_alumno", ... }
+	#macs = { "login_alumno" : "mac", ... }
+	profesores = {}
+	alumnos = {}
+	macs = {}
+	#Procesemos cada archivo de Rayuela
+	for archivoRayuela in dicArchivosRayuela.keys():
+		if debug:
+			print "Procesando archivo",os.path.join(datosrayuela,dicArchivosRayuela[archivoRayuela])
+		filearchivoRayuela = open(os.path.join(datosrayuela,dicArchivosRayuela[archivoRayuela]), 'r')
+		archivoServidor = os.path.join(datosservidor,archivoRayuela)
+		if debug:
+			print "Generando archivo",archivoServidor
+		filearchivoServidor = open(archivoServidor, 'w')
+		while True:
+			linea = filearchivoRayuela.readline()
+			if not linea:
+				break
+			if not linea[:1].isdigit():
+				continue
+			#Procesemos cada linea de Rayuela
+			#datosLineaRayuela es un diccionario cuyas claves son dni_profesor, nie_alumno, inicio, final
+			datosLineaRayuela = dameDatosLineaRayuela(linea)
+			datosLineaServidor = ""			
+			#Consultemos el login del profesor en ldap por su dni y el nie del alumno
+			#comprobando que no lo hemos encontrado previamente
+			dni_profesor=datosLineaRayuela["dni_profesor"]
+			if profesores.has_key(dni_profesor):
+				login_profesor = profesores[dni_profesor]
+				#if debug:
+				#	print "Nooooo se consulta a ldap, profesor dni",datosLineaRayuela["dni_profesor"],"pertenece a",login_profesor
+			else:
+				login_profesor = consultaLdap(dni_profesor, contra)
+				if login_profesor=="NO ENCONTRADO":
+					login_profesor = consultaLdap(dni_profesor[1:], contra)
+				profesores[dni_profesor] = login_profesor
+				if debug:
+					print "Se consulta a ldap, profesor dni",datosLineaRayuela["dni_profesor"],"pertenece a",login_profesor								
+			if alumnos.has_key(datosLineaRayuela["nie_alumno"]):
+				login_alumno = alumnos[datosLineaRayuela["nie_alumno"]]
+				#if debug:
+				#	print "Nooooo se consulta a ldap, alumno nie",datosLineaRayuela["nie_alumno"],"pertenece a",login_alumno
+			else:
+				login_alumno = consultaLdap(datosLineaRayuela["nie_alumno"], contra)
+				alumnos[datosLineaRayuela["nie_alumno"]] = login_alumno
+				if debug:
+					print "Se consulta a ldap, alumno nie",datosLineaRayuela["nie_alumno"],"pertenece a",login_alumno
+
+			if macs.has_key(login_alumno):
+				mac_alumno = macs[login_alumno]
+				#if debug:
+				#	print "Nooooo se consultan datos yaml, alumno login",login_alumno,"tiene mac",mac_alumno
+			else:
+				mac_alumno = obtenerMac(login_alumno, archivosYaml, datosyaml)
+				#mac_alumno = obtenerMac("dmoral01", archivosYaml, datosyaml)
+				macs[login_alumno] = mac_alumno
+				if debug:
+					print "Se consultan datos yaml, alumno login",login_alumno,"tiene mac",mac_alumno
+			inicio = transformaHora(int(datosLineaRayuela["inicio"]))
+			final = transformaHora(int(datosLineaRayuela["final"]))
+			datosLineaServidor = login_profesor+"|"+mac_alumno+"|"+str(inicio)+"|"+str(final)+"|"+"\n"			
+			#datosLineaServidor = login_profesor+"|"+mac_alumno+"|"+datosLineaRayuela["inicio"]+"|"+datosLineaRayuela["final"]+"|"+"\n"			
+			if debug:
+				print datosLineaServidor
+			filearchivoServidor.write(datosLineaServidor)
+		filearchivoRayuela.close()
+		filearchivoServidor.close()
+	return 0
+
+if __name__ == '__main__':
+	params = {}
+	lista = sys.argv
+	lee_parametros(lista,params)
+	#comprobaremos las combinaciones de parametros en linea de comandos
+	if len(lista) == 2 and lista[1] == "--help":
+		print 'uso: ./transformaArchivos.py [--datosrayuela rutadatosrayuela] [--datosservidor rutadatosservidor] [--datosyaml rutadatosyaml] [--contra contraadminldap]'
+		sys.exit(1)
+	if not params.has_key("contra"):
+		print "No se ha establecido la contraseña del administrador ldap..."
+		sys.exit(2)			
+	if not params.has_key("datosrayuela"):
+		print "No se ha establecido la ruta a la carpeta con los datos de rayuela, usando por defecto '"+os.getcwd()+"'"
+		params["datosrayuela"] = os.getcwd()
+	if not params.has_key("datosservidor"):
+		print "No se ha establecido la ruta dónde depositar los archivos generados, usando por defecto '/var/www/wifi'"
+		params["datosservidor"] = "/var/www/wifi"
+	if not params.has_key("datosyaml"):
+		print "No se ha establecido la ruta dónde se encuentran los datos yaml de puppet, usando por defecto '/var/lib/puppet/yaml/node'"
+		params["datosyaml"] = "/var/lib/puppet/yaml/node"
+
+	print
+	print "Los valores pasado son los siguientes:"
+	print "Directorio de datos de Rayuela:",params["datosrayuela"]
+	print "Directorio de datos de para el servidor:",params["datosservidor"]
+	print "Directorio de datos yaml de puppet:",params["datosyaml"]
+
+	resultado = transformaArchivos(params["datosrayuela"], params["datosservidor"], params["datosyaml"], params["contra"], True)
+	if resultado > 0:
+		print "Se ha producido errores en el procesamiento, código de error",resultado
+	else:
+		print "Se ha ejecutado correctamente"
+	exit(resultado)

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/transformaArchivos.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/escanea.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/escanea.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/escanea.py	(revision 529)
@@ -0,0 +1,288 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     escanea.py
+# Purpose:     Busca el canal libre más adecuado para la wifi
+# Language:    Python 2.5
+# Date:        03-Feb-2011.
+# Ver:        07-Feb-2011.
+# Author:    Francisco Mora Sánchez
+# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# Script2 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Módulo auxiliar para obtener información a través
+del comando iwlist, perteneciente a las herramientas
+wireless-tools
+
+Francisco Mora Sánchez
+IES Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+
+"""
+
+import os
+import re
+import locale
+import time
+from subprocess import Popen, STDOUT, PIPE, call
+
+# Expresiones Regulares.
+_re_mode = (re.I | re.M | re.S)
+essid_pattern = re.compile('.*ESSID:"?(.*?)"?\s*\n', _re_mode)
+ap_mac_pattern = re.compile('.*Address: (.*?)\n', _re_mode)
+channel_pattern = re.compile('.*Channel:?=? ?(\d\d?)', _re_mode)
+strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)', _re_mode)
+altstrength_pattern = re.compile('.*Signal level:?=? ?(\d+)\s*/?\s*(\d*)', _re_mode)
+signaldbm_pattern = re.compile('.*Signal level:?=? ?(-\d\d*)', _re_mode)
+freq_pattern = re.compile('.*Frequency:(.*?)\n', _re_mode)
+
+def to_unicode(x):
+    """ Convierte una cadena a codificación utf-8. """
+    # Si ésta es una cadena unicode, la codifica y la devuelve
+    if not isinstance(x, basestring):
+        return x
+    if isinstance(x, unicode):
+        return x.encode('utf-8')
+    encoding = locale.getpreferredencoding()
+    try:
+        ret = x.decode(encoding).encode('utf-8')
+    except UnicodeError:
+        try:
+            ret = x.decode('utf-8').encode('utf-8')
+        except UnicodeError:
+            try:
+                ret = x.decode('latin-1').encode('utf-8')
+            except UnicodeError:
+                ret = x.decode('utf-8', 'replace').encode('utf-8')
+            
+    return ret
+
+def EjecutaRegex(regex, cadena):
+    """ ejecuta búsqueda de expresión regular en una cadena """
+    m = regex.search(cadena)
+    if m:
+        return m.groups()[0]
+    else:
+        return None
+
+def Ejecuta(comando, include_stderr=False, return_pipe=False,
+        return_obj=False, return_retcode=True):
+    """ Ejecuta un comando.
+
+    Ejecuta el comando dado, retornando la salida del programa
+    o un pipe para leer la salida.
+
+    argumentos --
+    comando - Comando a ejecutar
+    include_std_err - Boleano, especifica si la salida de error debe
+					ser incluida en el pipe.
+    return_pipe - Boleano, especifica si el pipe del comando se
+					devuelve. Si es False, todo lo que devolverá
+					es la cadena de salida del comando.
+    return_obj - Si True, Ejecuta devolverá el objeto Popen
+					para el comando que se ha ejecutado.
+
+    """
+    if not isinstance(comando, list):
+        comando = to_unicode(str(comando))
+        comando = comando.split()
+    if include_stderr:
+        err = STDOUT
+        fds = True
+    else:
+        err = None
+        fds = False
+    if return_obj:
+        std_in = PIPE
+    else:
+        std_in = None
+    
+    # Debemos asegurarnos que los resultados del comando ejecutado
+    # están en inglés, así ajustaremos un entorno temporal.
+    tmpenv = os.environ.copy()
+    tmpenv["LC_ALL"] = "C"
+    tmpenv["LANG"] = "C"
+    
+    try:
+        f = Popen(comando, shell=False, stdout=PIPE, stdin=std_in, stderr=err,
+                  close_fds=fds, cwd='/', env=tmpenv)
+    except OSError, e:
+        print "Fallo ejecuando comando %s : %s" % (str(comando), str(e))
+        return ""
+        
+    if return_obj:
+        return f
+    if return_pipe:
+        return f.stdout
+    else:
+        return f.communicate()[0]
+
+def FrecuenciaACanal(frecuencia):
+	""" Transforma una frecuencia a canal.
+	
+		Nota: Esta función es una búsqueda en diccionario, por lo que
+		la frecuencia debe estar en el diccionario para que pueda
+		devolverse un canal válido.
+		
+        Parámetros:
+        frecuencia -- cadena conteniendo la frecuencia
+        
+        Devuelve:
+        El número de canal, o None si no se encuentra.
+	"""
+	ret = None
+	freq_dict = {'2.412 GHz': 1, '2.417 GHz': 2, '2.422 GHz': 3,
+		'2.427 GHz': 4, '2.432 GHz': 5, '2.437 GHz': 6,
+		'2.442 GHz': 7, '2.447 GHz': 8, '2.452 GHz': 9,
+		'2.457 GHz': 10, '2.462 GHz': 11, '2.467 GHz': 12,
+		'2.472 GHz': 13, '2.484 GHz': 14 }
+	try:
+		ret = freq_dict[frecuencia]
+	except KeyError:
+		print "No se puede determinar el canal para la frecuencia: " + str(frecuencia)
+	return ret
+
+def get_link_quality(red):
+	""" Obtiene la calidad del enlace desde la salida iwlist.
+	"""
+	try:
+		[(strength, max_strength)] = strength_pattern.findall(red)
+	except ValueError:
+		(strength, max_strength) = (None, None)
+	if strength in ['', None]:
+		try:
+			[(strength, max_strength)] = altstrength_pattern.findall(red)
+		except ValueError:
+			# Si el patrón no encuentra coincidencias
+			# retornamos 101
+			return 101
+	if strength not in ['', None] and max_strength:
+		#print "strength,max",strength,max_strength
+		return (100 * int(strength) // int(max_strength))
+	elif strength not in ["", None]:
+		#print "strength,max",strength,max_strength
+		return int(strength)
+	else:
+		#print "strength,max",strength,max_strength
+		return None
+    
+def ParseAccessPoint(red):
+	""" Examina una red wifi desde la salida de iwlist.
+		Parámetros:
+		red -- cadena que contiene la identificación de la red.
+		Devuelve:
+		Un diccionario que contiene las propiedades de la red wifi
+		examinada.
+	"""
+	ap = {}
+	ap['essid'] = EjecutaRegex(essid_pattern, red)
+	try:
+		ap['essid'] = to_unicode(ap['essid'])
+	except (UnicodeDecodeError, UnicodeEncodeError):
+		print 'Problema Unicode con el essid de la red actual, ignorando!!'
+		return None
+	if ap['essid'] in ['Hidden', '<hidden>', "", None]:
+		print 'hidden'
+		ap['oculta'] = True
+		ap['essid'] = "<hidden>"
+	else:
+		ap['oculta'] = False
+	# Canal - Para interfaces que no tienen un número de canal,
+	# convertir la frecuencia.
+	ap['canal'] = EjecutaRegex(channel_pattern, red)
+	if ap['canal'] == None:
+		freq = EjecutaRegex(freq_pattern, red)
+		ap['canal'] = FrecuenciaACanal(freq)
+	# BSSID
+	ap['bssid'] = EjecutaRegex(ap_mac_pattern, red)
+	# Calidad del enlace
+	# Ajusta strength a -1 si no se encuentra calidad
+	ap['calidad'] = get_link_quality(red)
+	if ap['calidad'] is None:
+		ap['calidad'] = -1
+	# Signal Strength (only used if user doesn't want link
+	# quality displayed or it isn't found)
+	if EjecutaRegex(signaldbm_pattern, red):
+		ap['intensidad'] = EjecutaRegex(signaldbm_pattern, red)
+	return ap
+
+def getWirelessInterfaces():
+    """ Extract wireless device names from /proc/net/wireless.
+
+        Returns empty list if no devices are present.
+
+        >>> getWirelessInterfaces()
+        ['eth1', 'wifi0']
+
+    """
+    device = re.compile('[a-z]{2,}[0-9]*:')
+    ifnames = []
+
+    fp = open('/proc/net/wireless', 'r')
+    for line in fp:
+        try:
+            # append matching pattern, without the trailing colon
+            ifnames.append(device.search(line).group()[:-1])
+        except AttributeError:
+            pass
+
+    return ifnames
+
+def ObtieneRedes(interface):
+	""" Obtiene una lista de redes wifi disponibles. La usamos para 
+		obtener via iwlist datos de las redes disponibles. De momento
+		lo usamos para obtener los valores del calidad e intensidad,
+		ya que la librería pythonwifi no parece dar los valores correctos
+		de estos parámetros.
+	
+		Parámetros:
+		interface -- Interfaz sobre la que escanear
+		Devuelve:
+		Diccionario cuyas claves son ls bssids y cada elemento
+		es otro diccionario cuyas claves con las características
+		recogidas por iwlist
+	"""
+    
+    #Si hostapd está corriendo iwlist scan no funciona:
+	Popen(["invoke-rc.d","hostapd","stop"]).wait()
+	time.sleep(2.0)
+	Popen(["ifconfig",interface,"up"]).wait()
+    
+	cmd = 'iwlist ' + interface + ' scan'
+	resultado = Ejecuta(cmd)
+	# Divide las redes, utilizando Cell como punto de división
+	# de esta forma podemos mirar una red cada vez.
+	# Los espacios alrededor de '   Cell ' son para evitar el caso
+	# de que alguien tenga un essid llamado Cell...
+	redes = resultado.split( '   Cell ' )
+	# An array for the access points
+	access_points = []
+	access_points = {}
+	for red in redes:
+		# Solo usa secciones donde haya un ESSID.
+		if 'ESSID:' in red:
+			# Añadir la red a la lista de redes
+			entry = ParseAccessPoint(red)
+			if entry is not None:
+				# Normalmente solo tenemos bssids duplicados con redes
+				# ocultas.  Solo nos fijamos en el essid real, para
+				# que esté en la lista.
+				if (entry['bssid'] not in access_points or not entry['oculta']):
+					access_points[entry['bssid']] = entry
+	return access_points
+
+if __name__ == "__main__":
+	datos_redes = ObtieneRedes('eth1')
+	print datos_redes

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/escanea.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/parsehostapd.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/parsehostapd.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/parsehostapd.py	(revision 529)
@@ -0,0 +1,229 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     parsehostapd.py
+# Purpose:     Parsea el fichero /etc/hostapd/hostapd.conf 
+# Language:    Python 2.5
+# Date:        26-Enero-2011.
+# Ver:        07-Feb-2011.
+# Author:    Francisco Mora Sánchez
+# Copyright:   2011 - Francisco Mora Sánchez   <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# Script2 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+""" Módulo que contiene la función selectbestchannel()
+Función  que escanea el espectro de canales de redes
+wifi y nos devuelve el canal más idóneo para ser utilizado en 
+el lugar en que estamos.
+
+La función admite dos parámetros
+
+Utiliza la libreria pythonwifi y está basado en uno de los ejemplos
+incluidos en la libreria
+Debe ser ejecutado como root
+
+El algoritmo utilizado se basa en sumar las redes que existen en cada
+canal y a continuación calcular las sumas de los solapes de las redes
+centradas en canales, patrón 1-6-11, escogeremos el canal cuyo valor
+de las sumas sea menor.
+
+Los canales que se solapan en el patrón 1-6-11 son los siguientes:
+
+Canal		Canales que se solapan
+1			1-5
+2			1-6
+3			1-7
+4			1-8
+5			1-9
+6			2-10
+7			3-11
+8			4-12
+9			5-13
+10			6-13
+11			7-13
+12			8-13
+13			9-13
+
+
+Francisco Mora Sánchez
+IES Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+
+"""
+
+import sys
+import os
+import socket
+
+#from pythonwifi.iwlibs import Wireless, getWNICnames
+
+import escanea
+
+def actualizadatosescaneo(datosescaneo, canal, bssid, essid, calidad, intensidad):
+	""" Actualizamos diccionario con los datos recogidos del
+		escaneado, comprobamos que no hemos insertado
+		previamente la red, comprobando el bssid del AP
+	"""
+	if not datosescaneo.has_key(canal):
+		#insertamos el canal inicializando los campos
+		datosescaneo[canal] = [1, [[bssid,calidad,intensidad]], 0]
+	else:
+		#comprobemos que no existe ese bssid en el diccionario 
+		#listabssid = datosescaneo[canal][1]
+		listabssid = [bssids[0] for bssids in datosescaneo[canal][1]]
+		if not bssid in listabssid:
+			#no está en la lista, añadimos y aumentamos el contador de redes
+			datosescaneo[canal][0] = datosescaneo[canal][0] + 1
+			datosescaneo[canal][1].append([bssid,calidad,intensidad])
+
+def procesadatosescaneo(datosescaneo):
+	""" Sumamos las redes solapadas centradas en los canales, basándonos
+		en el patrón 1-6-11
+	"""
+	adyacentes = {1:[1,2,3,4,5],2:[1,2,3,4,5,6],3:[1,2,3,4,5,6,7],4:[1,2,3,4,5,6,7,8],5:[1,2,3,4,5,6,7,8,9], \
+		6:[2,3,4,5,6,7,8,9,10],7:[3,4,5,6,7,8,9,10,11],8:[4,5,6,7,8,9,10,11,12],9:[5,6,7,8,9,10,11,12,13], \
+		10:[6,7,8,9,10,11,12,13],11:[7,8,9,10,11,12,13],12:[8,9,10,11,12,13],13:[9,10,11,12,13]}
+
+	#Rellenamos canales faltantes
+	for canal in range(1, 14):
+		if not datosescaneo.has_key(canal):
+			datosescaneo[canal] = [0, [], 0]
+
+	#Sumemor las redes solapadas
+	for canal in range(1, 14):
+		for adyacente in adyacentes[canal]:
+			datosescaneo[canal][2] = datosescaneo[canal][2] + datosescaneo[adyacente][0]
+				
+def seleccionacanaloptimo(datosescaneo):
+	""" Procesamos diccionario y retornamos el canal óptimo,
+		aquel cuyo valor de numero de redes totales solapadas
+		centradas es el mínimo
+    """
+    #El mejor canal, es el menor valor de los solapes de las redes centradas en canales
+	canaloptimo = 1
+	valor = datosescaneo[1][2]
+	for canal in range(1, 14):
+		if datosescaneo[canal][2] < valor:
+			canaloptimo = canal
+			valor = datosescaneo[canal][2]
+	return canaloptimo
+	
+def selectbestchannel(verbose = False):
+	""" Creamos diccionario para almacenar datos, la key principal es 
+		es el canal, y para cada canal hay una lista en
+		la que se almacena el número de redes detectadas, sus BSSID junto
+		a su potencia e intensidad, además se almacenará
+		y el número de redes que se solapan con las redes centradas en canales
+		según patrón 1-6-11.
+		Controlaremos que no se dupliquen los canales cuando hay más de un interfaz wifi
+		comparando los BSSID para este menester
+	"""
+	
+	#Esta seria la estructura que obtendriamos de nuestro escaneado
+	#{1:[3, [["MACAP1",70,-56], ["MACAP2",65,-61], ["MACAP3",60,-66]], 0],
+	# 2:[2, [["MACAP4",75,-51], ["MACAP5",65,-61]], 0]
+	# 3:[1, [["MACAP6",80,-45]], 0],
+	# 4:[1, [["MACAP7",60,-66]], 0]}
+	datosescaneo = {}
+	if verbose:
+		print "Escaneando redes WIFI..."
+	index = 1
+	for ifname in escanea.getWirelessInterfaces():
+		if verbose:
+			print "	Escaneado de la interfaz %-8.16s" % (ifname, )
+		otros_datos_escaneo = escanea.ObtieneRedes(ifname)
+		if len(otros_datos_escaneo.keys()) == 0:
+			if verbose:
+				print "%-8.16s  Escaneado sin resultados" % (ifname, )
+		for bssid in otros_datos_escaneo.keys():
+			if verbose:
+				print "          Red: %02d - Canal: %s BSSID: %s ESSID: %s Quality: %s Signal Strength: %s" % \
+			(index, otros_datos_escaneo[bssid]['canal'], bssid, otros_datos_escaneo[bssid]['essid'], otros_datos_escaneo[bssid]['calidad'], otros_datos_escaneo[bssid]['intensidad'])
+			#vamos a actualizar nuestro diccionario
+			actualizadatosescaneo(datosescaneo, int(otros_datos_escaneo[bssid]['canal']), bssid, otros_datos_escaneo[bssid]['essid'], otros_datos_escaneo[bssid]['calidad'], otros_datos_escaneo[bssid]['intensidad'])
+			index = index +1
+	#para pruebas
+	#datosescaneo = {1:[2, [["01",99,-99],["02",98,-98]], 0], 6:[3, [["03",97,-97],["04",96,-96],["05",95,-95]], 0], 11:[1, ["06",94,-94], 0]}
+	procesadatosescaneo(datosescaneo)
+	canaloptimo = seleccionacanaloptimo(datosescaneo)
+	if verbose:
+		print "\nTabla de datos obtenida:"
+		print datosescaneo
+		print "\n"
+		print "El canal óptimo es el: ", canaloptimo
+	
+	return canaloptimo
+
+if __name__ == "__main__":
+	""" Comprobaremos que se ha pasado la ruta al archivo hostapd.conf
+		El archivo hostapd.conf debe contener la cadena 'canalseleccionado'
+		que será reemplazada por la salida de la función selectchannelwifi().
+		
+		Además el SSID es el nombre de equipo menos la cadena '-pro', y
+		la cadena a buscar en el archivo hostapd.conf es 'ssidseleccionado'.
+	"""
+	if len(sys.argv) == 1:
+		print 'uso: ./parsehostapd.py /ruta/al/archivo/hostapd.conf'
+		sys.exit(1)
+	#Comprobemos la existencia del archivo
+	hostapdconf = sys.argv[1]
+	if not os.path.exists(hostapdconf):
+		print "El archivo",hostapdconf,"no existe"
+		exit(2)
+	print "Procesando archivo",hostapdconf
+	""" Aquí llamamos a la función  desarrollada en este módulo
+		para asignar el canal de transmisión óptimo,
+		si ponemos True en el parámetro podremos ver las redes 
+		que se detectan...
+	"""	
+	canaloptimo = selectbestchannel(True)
+	
+	ssid = socket.gethostname()
+	pos = ssid.find(".")
+	if pos > -1:
+		ssid = ssid[:pos]
+	pos = ssid.find("-pro")
+	if pos > -1:
+		ssid = ssid[:pos]
+	try:
+		#Abre el archivo para lectura de datos
+		archivoLectura = open(hostapdconf,"r")
+		lineas = archivoLectura.readlines()
+		archivoLectura.close()
+	except (RuntimeError, TypeError, NameError, IOError):
+		print "Error en la ubicacion o nombre del archivo"
+		exit()
+	#Modifica la cadena del channel y ssid
+	encontradoChannel = False
+	encontradoSsid = False
+	for numlinea in range(0, len(lineas)):
+		linea = lineas[numlinea]
+		#comprobamos si estamos en channel o en ssid
+		if linea[:7] == "channel":
+			encontradoChannel = True
+			lineas[numlinea] = "channel="+str(canaloptimo)+"\n"
+		if linea[:4] == "ssid":
+			encontradoSsid = True
+			lineas[numlinea] = "ssid="+ssid+"\n"
+	if not encontradoChannel:
+		lineas.append("channel="+str(canaloptimo)+"\n")
+	if not encontradoSsid:
+		lineas.append("ssid="+ssid+"\n")
+				
+	#Abre el archivo para escritura de datos
+	archivoEscritura = open(hostapdconf,"w")
+	archivoEscritura.writelines(lineas)
+	archivoEscritura.close()
+	print "El canal establecido es",canaloptimo
+	print "El SSID establecido es",ssid 
+	print "Se ha procesado el archivo",hostapdconf 

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/parsehostapd.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ltsp-server/wifi-ltsp/trunk/parsehostapd/__init__.py
===================================================================
Index: scripts/ltsp-server/wifi-ltsp/trunk/autoriza-wifi.desktop
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/autoriza-wifi.desktop	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/autoriza-wifi.desktop	(revision 529)
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Name=Autoriza WiFi Guardias
+Comment=El profesor de guardia puede simular otro profesor del centro
+Exec=autorizaWifiGuardias.py
+Icon=network-wireless
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=GNOME;GTK;Settings;X-GNOME-NetworkSettings;
+OnlyShowIn=GNOME;
Index: scripts/ltsp-server/wifi-ltsp/trunk/setup.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/setup.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/setup.py	(revision 529)
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from distutils.core import setup
+import os
+
+datafiles = []
+
+
+setup(name='wifi-ltsp',
+	version='0.1',
+	description='Archivos de configuración de hostapd con wifi',
+	long_description = """Really long text here.""",
+	author = 'José L. Redrejo Rodríguez, Francisco Mora Sánchez y Elisa Aparicio Pérez',
+	author_email = 'jredrejo@debian.org',
+	license = "GNU GPLv3",
+    packages=['parsehostapd'],
+	package_dir={'parsehostapd': 'parsehostapd/'},
+	url = 'http://desarrollo.educarex.es/linex/projects/servidoressecundaria/repository/show/wifi-ltsp',
+	# Those are going to be installed on /usr/bin/
+	scripts=['configura_hostapd.py','autorizaWifiGuardias.py'],
+
+	data_files=datafiles 
+    )
+
Index: scripts/ltsp-server/wifi-ltsp/trunk/autorizaWifiGuardias.py
===================================================================
--- scripts/ltsp-server/wifi-ltsp/trunk/autorizaWifiGuardias.py	(nonexistent)
+++ scripts/ltsp-server/wifi-ltsp/trunk/autorizaWifiGuardias.py	(revision 529)
@@ -0,0 +1,251 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     autorizaWifiGuardias.py
+# Purpose:     se usará por el profesor de guardia, y se seleccionará
+#				el profesor con clase en ese grupo y ese momento para
+#				activar el wifi de los portátiles de los alumnos.
+# Language:    Python 2.5
+# Date:        07-Mar-2011.
+# Ver:        07-Mar-2011.
+# Author:    Francisco Mora Sánchez
+# Copyright:   2011 - Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# autorizaWifiGuardias is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+""" Este programa muestra una lista con los profesores que tienen clase
+a la hora actual, cuando seleccionamos uno de ellos se ejecuta el módulo
+demonio configura_hostapd.py utilizando como parámetro el login del profesor
+seleccionado, que  tendrá clase con ese grupo a esa hora, aunque el profesor
+de guardia haya iniciado con su propio login. El módulo sólo se ejecuta
+si el usuario pertenece al grupo teachers. Para llevar a cabo la acción
+se necesita que el módulo configura_hostapd.py, que se ejecuta como root
+en el postlogin de gdm para cada usuario, tenga permisos de ejecución root
+llevándose a cabo esto utilizando el archivo /etc/sudoers, añadiendo una
+línea como:
+
+%teachers ALL=NOPASSWD: /usr/bin/configura_hostapd.py
+
+Procesa el archivo /wifi/horario.txt y genera un diccionario con los
+logins de profesores que tienen clase a la hora actual, adicionalmente
+consultamos ldap para confeccionar el nombre del profesor, con sus 
+nombres y apellidos, de forma que en la caja de selección aparecerán 
+los nombres completos en forma Apellidos, Nombre o bien el login
+del profesor. Tenemos que tener en cuenta que el archivo 
+/wifi/horario.txt ya existe en la ruta, ya que el script 
+configura_hostapd.py se ejecuta en el inicio y lo deja en el lugar 
+adecuado.
+
+Será responsabilidad de cada administrador o herramienta de gestión ldap
+que el atributo cn de cada objeto de la rama People, perteneciente a cada
+profesor, de ldap que sea un profesor, tenga el nombre en forma "humana".
+Tambien sería deseable que este atributo para los alumnos estuviese en
+esa forma.
+
+Francisco Mora Sánchez
+I.E.S. Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+"""
+
+import pygtk
+pygtk.require("2.0")
+import gtk
+import logging
+import subprocess
+import os
+import time
+import ldap
+
+LOG_FILENAME = "autorizaWifiGuardias.log"
+
+profesores = {}
+
+def hora_actual(fecha):
+	"""Con esta funcion se obtiene la hora actual del sistema sin los : de forma
+	que la 08:45 se representarancomo la 0845"""
+	hora= fecha[11:13]+fecha[14:16]
+	h=int(hora)
+	if (h<int(0000) or h>int(2500)):
+		logging.getLogger().error("El formato de la hora del sistema no es el esperado")
+		return "9999"
+	else:
+		return hora
+
+def procesahorario(profesores):
+	"""con esta funcion generamos el diccionario de profesores con clase a la hora actual,
+	además buscamos en el directorio ldap los valores cn en la rama people que deben
+	contener los nombres completos de los profesores
+	"""
+	if not os.path.exists("/wifi/horario.txt"):
+		logging.getLogger().error("No hay fichero /wifi/horario.txt en el servidor de aula")
+		return ""
+	
+	try:
+		horario = open("/wifi/horario.txt","r")
+	except:
+		logging.getLogger().error("Problemas para leer el archivo /wifi/horario.txt")
+		return ""
+	
+	hora = hora_actual(time.asctime())
+	#hora = "1241"
+	while True:
+		linea = horario.readline()
+		if not linea:
+			break
+		else:
+			lineasplit = linea.split("|")
+			profesor = lineasplit[0]
+			if hora>lineasplit[2] and hora<lineasplit[3]:
+				if  not profesores.has_key(profesor):
+					#print "Profesor en horario",profesor," hora",hora
+					profesores[profesor] = profesor
+	horario.close()
+	#ahora procesaremos el diccionario buscando en ldap los cn
+	l = ldap.initialize("ldap://ldap")
+	
+	base_dn='ou=People,dc=instituto,dc=extremadura,dc=es'
+	#searchFilter = '(uid='+identificador+')'
+	searchScope = ldap.SCOPE_SUBTREE
+	retrieveAttributes = ['cn']
+	
+	for profesor in profesores.keys():
+		nombre = profesor
+		try:
+			searchFilter = '(uid='+profesor+')'
+			ldap_result_id = l.search(base_dn, searchScope, searchFilter, retrieveAttributes)
+			result_type, result_data = l.result(ldap_result_id, 0)
+			if len(result_data)==0:
+				logging.getLogger().error("No encontrado en ldap..."+profesor)
+			else:
+				resultado=result_data[0]
+		except:
+			logging.getLogger().error("Error buscando en ldap..."+profesor)
+			continue
+		
+		profesores[profesor] = resultado[1]['cn'][0]
+	
+def userIsTeacher(teachersGroup='teachers'):   
+    p1 = subprocess.Popen(["id", "-Gn"], stdout=subprocess.PIPE)
+    p2 = subprocess.Popen(["grep", teachersGroup], stdin=p1.stdout, stdout=subprocess.PIPE)
+    output = p2.communicate()[0]
+    return (output != '')	
+
+class AutorizaWifiGuardias(): 
+
+	def delete_event(self, widget, event, data=None):
+		print "delete event occurred"
+		#con false se cierra la ventana principal, con true no
+		return False
+		
+	def destroy(self, widget, data=None):
+		gtk.main_quit()
+
+	def create_model(self):
+		store = gtk.ListStore(str, str)
+		procesahorario(profesores)
+		for profesor in profesores.keys():
+			store.append([profesores[profesor], profesor])
+		return store
+		
+	def create_columns(self, treeView):
+		rendererText = gtk.CellRendererText()
+		column = gtk.TreeViewColumn("Nombre y Apellidos", rendererText, text=0)
+		column.set_sort_column_id(0)
+		treeView.append_column(column)
+		
+		rendererText = gtk.CellRendererText()
+		column = gtk.TreeViewColumn("Login del profesor", rendererText, text=1)
+		column.set_sort_column_id(1)
+		treeView.append_column(column)
+		
+	def on_activated(self, widget, row, col):
+		model = widget.get_model()
+		try:
+			p = subprocess.Popen(["/usr/bin/sudo", "/usr/bin/configura_hostapd.py", model[row][1]])
+		except OSError, e:
+			logging.getLogger().error("Hay problemas al ejecutar comando activación WIFI")
+			self.statusbar.push(0, 'Hay algún problema al activar WIFI')
+			return
+		self.statusbar.push(0, 'Activado WIFI profesor '+model[row][0])
+			
+	def win_close(self, widget, event, data):
+		dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO, "¿Quieres salir realmente?")
+		dialog.set_title("Atención")
+		response = dialog.run()
+		dialog.destroy()
+		if response == gtk.RESPONSE_YES:
+			return False
+		else:
+			return True
+
+	def no_profesor(self, widget):
+		logging.getLogger().error("Ejecutando programa usuario no profesor")
+		md = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, 
+				gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, "Sólo los profesores pueden ejecutar esta aplicación")
+		md.run()
+		md.destroy()
+
+	def __init__(self):
+		#super(AutorizaWifiGuardias, self).__init__()
+		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+		
+		if not userIsTeacher():
+			logging.getLogger().error("Ejecutando programa usuario no profesor")	
+			self.no_profesor(self)
+			self.window.connect('event-after', gtk.main_quit) 
+			
+		self.window.set_size_request(500, 600)
+		self.window.set_position(gtk.WIN_POS_CENTER)
+		
+		self.window.connect("destroy", self.destroy)
+		self.window.connect("delete-event", self.win_close, None)
+		self.window.set_title("Autorización WIFI profesores de guardia")
+		
+		self.vbox = gtk.VBox(False, 8)
+		
+		self.label = gtk.Label()
+		self.label.set_markup("<b>Haz doble click en profesor sustituido</b>")
+		self.vbox.pack_start(self.label, False, False, 0)
+		
+		self.sw = gtk.ScrolledWindow()
+		self.sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+		self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+		
+		self.vbox.pack_start(self.sw, True, True, 0)
+		
+		self.store = self.create_model()
+		
+		self.treeView = gtk.TreeView(self.store)
+		self.treeView.connect("row-activated", self.on_activated)
+		self.treeView.set_rules_hint(True)
+		self.sw.add(self.treeView)
+		
+		self.create_columns(self.treeView)
+		
+		self.statusbar = gtk.Statusbar()
+		self.vbox.pack_start(self.statusbar, False, False, 0)
+		
+		self.window.add(self.vbox)
+		self.window.show_all()
+
+def main():
+	logging.basicConfig(level=logging.DEBUG,
+		format='%(asctime)s %(levelname)-8s %(message)s',
+		datefmt='%a, %d %b %Y %H:%M:%S',
+		filename=LOG_FILENAME,
+		filemode='w')
+		
+	AutorizaWifiGuardias()
+	gtk.main()
+
+main()

Property changes on: scripts/ltsp-server/wifi-ltsp/trunk/autorizaWifiGuardias.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/nfs/EnciendeEquipos/trunk/EnciendeEquipos.py
===================================================================
--- scripts/nfs/EnciendeEquipos/trunk/EnciendeEquipos.py	(nonexistent)
+++ scripts/nfs/EnciendeEquipos/trunk/EnciendeEquipos.py	(revision 529)
@@ -0,0 +1,48 @@
+##############################################################################
+# -*- coding: utf-8 -*-
+# Project:      EnciendeEquipos
+# Module:    	EnciendeEquipos.py
+# Purpose:     	Wakes up classrom servers in an IES environment
+# Language:    	Python 2.5
+# Date:        	23-Feb-2011.
+# Ver:         	23-Feb-2011.
+# Author:    	Francisco Mendez Palma
+# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
+#
+# EnciendeEquipos is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# EnciendeEquipos is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+##############################################################################
+
+from LdapConnection import LdapConnection
+import NetworkUtils
+import sys
+
+# Capturo argumento para saber que ordenadores encender: Nocturno ("Noche") o Diurno (vacio)
+if len (sys.argv)==2:
+	cuando=sys.argv[1]
+else:
+	cuando="Dia"
+
+#Conexion anonima: solo ip del ldap
+l = LdapConnection("172.23.36.5")
+l.connect()
+
+#Segun momento del dia, encendemos distintos equipos
+if cuando=="Noche":
+	filter="(|(cn=d-profesores*)(cn=a02-pro)(cn=a03-pro)(cn=a15-pro)(cn=a16-pro)(cn=a17-pro)(cn=a18-pro)(cn=a32-pro)(cn=a33-pro)(cn=a34-pro)(cn=a35-pro))"
+else:
+	filter="(|(cn=*-pro*)(cn=d-profesores*))"
+	
+search  = l.search("ou=hosts",filter,["macAddress"])
+
+#Obtenemos macs y lanzamos encendido
+for elto in search:
+	mac=elto[0][1]["macAddress"][0]
+	NetworkUtils.startup(mac)
Index: scripts/nfs/EnciendeEquipos/trunk/LdapConnection.py
===================================================================
--- scripts/nfs/EnciendeEquipos/trunk/LdapConnection.py	(nonexistent)
+++ scripts/nfs/EnciendeEquipos/trunk/LdapConnection.py	(revision 529)
@@ -0,0 +1,60 @@
+##############################################################################
+# -*- coding: utf-8 -*-
+# Project:      EnciendeEquipos
+# Module:    	LdapConnection.py
+# Purpose:     	Anonymous Connection with ldap server
+# Language:    	Python 2.5
+# Date:        	23-Feb-2011.
+# Ver:         	23-Feb-2011.
+# Author:    	Francisco Mendez Palma
+# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
+#
+# EnciendeEquipos is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# EnciendeEquipos is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+##############################################################################
+
+import ldap
+
+class LdapConnection(object):
+
+    def __init__(self,host):
+		self.host = host
+
+    def connect(self):
+		## first you must open a connection to the server
+		
+		try:
+			self.connect=ldap.open(self.host)
+			## searching doesn't require a bind in LDAP V3.  If you're using LDAP v2, set the next line appropriately
+			## and do a bind as shown in the above example.
+			# you can also set this to ldap.VERSION2 if you're using a v2 directory
+			# you should  set the next option to ldap.VERSION2 if you're using a v2 directory
+			self.protocol_version = ldap.VERSION3
+		except ldap.LDAPError, e:
+			return False
+			# handle error however you like
+			
+		return True
+
+    def search(self,baseDN,filter,retrieveAttributes):
+		
+		try:
+			ldap_result_id = self.connect.search(baseDN+",dc=instituto,dc=extremadura,dc=es", ldap.SCOPE_SUBTREE, filter, retrieveAttributes)
+			result_set = []
+			while 1:
+				result_type, result_data = self.connect.result(ldap_result_id, 0)
+				if (result_data == []):
+					break
+				else:
+					if result_type == ldap.RES_SEARCH_ENTRY:
+						result_set.append(result_data)
+			return result_set
+		except ldap.LDAPError, e:
+			print e
Index: scripts/nfs/EnciendeEquipos/trunk/NetworkUtils.py
===================================================================
--- scripts/nfs/EnciendeEquipos/trunk/NetworkUtils.py	(nonexistent)
+++ scripts/nfs/EnciendeEquipos/trunk/NetworkUtils.py	(revision 529)
@@ -0,0 +1,47 @@
+##############################################################################
+# -*- coding: utf-8 -*-
+# Project:     EnciendeEquipos
+# Module:     NetworkUtils.py
+# Purpose:     Network utilities
+# Language:    Python 2.5
+# Date:        17-Jan-2010.
+# Ver:        17-Jan-2010.
+# Author:    José L. Redrejo Rodríguez
+# Copyright:   2009 - José L. Redrejo Rodríguez    <jredrejo @nospam@ debian.org>
+#
+# EnciendeEquipos is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# EnciendeEquipos is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+##############################################################################
+
+import socket,struct
+
+def startup(address):
+
+    addr_byte = address.split(':')
+    hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16),
+      int(addr_byte[1], 16),
+      int(addr_byte[2], 16),
+      int(addr_byte[3], 16),
+      int(addr_byte[4], 16),
+      int(addr_byte[5], 16))
+
+    msg = '\xff' * 6 + hw_addr * 16
+    
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+    try:
+        s.sendto(msg, ('<broadcast>', 9))
+        s.sendto(msg, ('<broadcast>', 7))
+        s.sendto(msg, ('192.168.0.255', 9))
+        s.sendto(msg, ('192.168.0.255', 7))   
+    except:
+        s.sendto(msg, ('<broadcast>', 2000))
+        s.sendto(msg, ('192.168.0.255', 2000))
+    s.close()
Index: scripts/nfs/EnciendeEquipos/trunk/Leeme.txt
===================================================================
--- scripts/nfs/EnciendeEquipos/trunk/Leeme.txt	(nonexistent)
+++ scripts/nfs/EnciendeEquipos/trunk/Leeme.txt	(revision 529)
@@ -0,0 +1,22 @@
+ENCIENDE EQUIPOS
+================
+
+CONTENIDO:
+
+EnciendeEquipos.py: Programa principal. Realiza consulta anonima a LDAP, obteniendo las MAC's de los equipos que quieren encenderse. Utiliza dos filtros
+distintos para realizar la consulta: uno se refiere a los equipos del diurno y otro a los del nocturno, podeis modificarlos a vuestro antojo e incluir los 
+equipos que querais. La consulta para obtener las MAC'S la hace en la rama host del LDAP. Debeis modificar la IP que hace referencia al ldap, en la linea
+l = LdapConnection ("172.23.36.5"), y poner la de vuestro LDAP.
+
+NetworkUtils.py: Contiene funcion para el encendido de un equipo, a partir de su mac. Esta funcion ha sido programada por J.L. Redrejo.
+
+LdapConnection.py: Utilidades para conectar y buscar en LDAP.
+
+
+INSTRUCCIONES DE USO:
+
+Copiar carpeta EnciendeEquipos en /usr/bin del servidor. Modificar crontab para que se lance en el momento del dia que nos interese:
+
+20 8 * * 1-5 root /usr/bin/python /usr/bin/EnciendeEquipos/EnciendeEquipos.py    (para el dia)
+
+35 17 * * 1-5 root /usr/bin/python /usr/bin/EnciendeEquipos/EnciendeEquipos.py Noche    (para la noche)
Index: scripts/nfs/dhcp-server-denegar/trunk/dhcp-server-denegar
===================================================================
--- scripts/nfs/dhcp-server-denegar/trunk/dhcp-server-denegar	(nonexistent)
+++ scripts/nfs/dhcp-server-denegar/trunk/dhcp-server-denegar	(revision 529)
@@ -0,0 +1,225 @@
+#!/bin/bash
+### BEGIN INIT INFO
+# Provides:             dhcp-server-denegar
+# Required-Start:       $remote_fs $all
+# Required-Stop:        
+# Should-Start:         $network
+# Should-Stop:
+# Default-Start:        2
+# Default-Stop:         
+# Short-Description:    Genera el fichero dhcpd.conf, denegando la entrada a los no permitidos.
+# Description:          Controla el acceso al sistema. Los equipos denegados no tomarán ip
+### END INIT INFO
+
+# *********************************************************************************************************** 
+# Antonio J. Abasolo Sierra (Dic-2012)
+#
+# Controla el acceso al sistema, filtrando los equipos a los que el servidor dhcp del centro ofrecerá ip, 
+# y por lo tanto podrán navegar.
+# Se base en el sistema de lista blanca (mantenida por el usuario), 
+# y lista negra (obtenida por filtrado de entradas del fichero del servidor dhcp: dhcpd.leases)
+#
+# La Lista_Blanca de equipos que dejamos conectarse la mantenemos nosotros, y debe tener este formato:
+# MAC,EQUIPO[,IP][,NOMBRE]
+# EQUIPO --> nombre personal para conocer al equipo.
+# [,IP] --> Se rellenará automáticamente por el script.
+# [,NOMBRE] --> Se rellenará automáticamente por el script (si lo tiene).
+#
+# Para dejarlo operativo colocaremos un crontab que ejecute este script cada 5 min. (por ej.)
+# *********************************************************************************************************** 
+
+FILE_CONF=/etc/dhcp/dhcpd.conf
+FILE_LEASES=/var/lib/dhcp/dhcpd.leases
+LISTA_NEGRA=/etc/dhcp/hosts.deny
+LISTA_BLANCA=/etc/dhcp/hosts.accept
+SERVICIO=isc-dhcp-server
+
+Crear_BaseConf() {
+  if [ ! -f $FILE_CONF.base ]; then
+    cat $FILE_CONF > $FILE_CONF.base
+  fi
+}
+
+Configuracion_Base() {
+  Crear_BaseConf
+  if [ -f $FILE_CONF.base ]; then
+    cat $FILE_CONF.base > $FILE_CONF
+  fi
+}
+
+Configuracion_Base2() {
+  echo "
+# ------------------------------------------------
+ldap-server "ldap";
+ldap-port 389;
+ldap-base-dn "dc=instituto,dc=extremadura,dc=es";
+ldap-dhcp-server-cn "ldap";
+ldap-method dynamic;
+#ldap-method static;
+ddns-update-style none;
+# ------------------------------------------------
+" > $FILE_CONF
+}
+
+Obtener_Leases() {
+  # Creamos un fichero de leases con una entrada por línea: MAC,IP,NOMBRE
+  echo "   - Obtenemos 'pcs.leases': equipos conectados vía dhcp-server ..."
+  cat $FILE_LEASES | grep -v '#' > pcs.leases
+  rm -f pcs 2>/dev/null ; touch pcs
+  cat pcs.leases | while read linea ; do
+    KEY=`echo $linea | awk '{print $1}'`
+    case "$KEY" in
+      lease)
+	IpPC=`echo $linea | awk '{print $2}'`
+	;;
+      hardware)
+	MacPC=`echo $linea | awk '{print $3}' | cut -f1 -d';' | tr A-Z a-z`
+	;;
+      client-hostname)
+	NombrePC=`echo $linea | awk -F'"' '{print $2}'`
+	;;
+      '}')
+	if [ "$MacPC" ]; then
+	  esta=`grep -i $MacPC pcs` 2>/dev/null
+	  if [ ! $esta ]; then
+	    echo "$MacPC,$IpPC,$NombrePC" >> pcs
+	  fi
+          NombrePC=""
+	fi
+	;;
+      "")
+	;;
+    esac
+  done
+  cat pcs | uniq | sort -t, -u -k2 > pcs.leases
+  rm -f pcs
+}
+
+Obtener_ListaNegra() {
+  # Recorremos el fichero de leases obtenido, y lo filtramos con la lista-blanca
+  echo "   - Creamos $LISTA_NEGRA: lista de equipos a denegar (lista negra)"
+  # rm -f $LISTA_NEGRA 2>/dev/null ; touch $LISTA_NEGRA
+  cat pcs.leases | while read linea; do
+    MAC=`echo $linea | cut -f1 -d,`
+    IP=`echo $linea | cut -f2 -d,`
+    PC=`echo $linea | cut -f3 -d,`
+
+    ESTA=`grep -i ^$MAC $LISTA_BLANCA` 2>/dev/null
+    if [ ! "$ESTA" ]; then
+      ESTA=`grep -i ^$MAC $LISTA_NEGRA` 2>/dev/null
+      if [ ! "$ESTA" ]; then
+        echo "$MAC,$PC,$IP" >> $LISTA_NEGRA
+      fi
+    else
+      EQUIPO=`grep -i ^$MAC $LISTA_BLANCA | cut -f1-2 -d,`
+      grep -v ^$MAC $LISTA_BLANCA > tmp
+      mv tmp $LISTA_BLANCA
+      echo "$EQUIPO,$IP,$PC" >> $LISTA_BLANCA
+      grep -v ^$MAC $LISTA_NEGRA > tmp
+      mv tmp $LISTA_NEGRA
+    fi
+  done
+  #rm -f pcs.leases
+}
+
+Crear_Configuracion() {
+  echo "   - Creamos $FILE_CONF: fichero de configuración de dhcp-server"
+  Configuracion_Base
+  if [ ! -e $LISTA_BLANCA ]; then touch $LISTA_BLANCA; fi
+  if [ ! -e $LISTA_NEGRA ]; then touch $LISTA_NEGRA; fi
+  NUMPC=0
+  echo "" >> $FILE_CONF
+  echo "# Equipos con entrada denegada:" >> $FILE_CONF
+  echo "# -----------------------------" >> $FILE_CONF
+  cat $LISTA_NEGRA | grep -v '#' | while read linea; do
+    NUMPC=`expr $NUMPC + 1`
+    MAC=`echo $linea | cut -f1 -d,`
+    PC=`echo $linea | cut -f2 -d, | tr '-' '_'`
+    EQUIPO="Equipo_"$NUMPC
+    if [ "$PC" ]; then
+      EQUIPO=$EQUIPO"_"$PC
+    fi
+#      ESTA=`grep $PC $FILE_CONF` 2>/dev/null
+#      #if [ "$ESTA" ]; then PC=Equipo_$NUMPC; fi
+##      if [ "$ESTA" ]; then
+#	PC=$PC"_"$NUMPC
+# #     fi
+#    else
+#      PC=Equipo_$NUMPC
+#    fi
+    if [ "$MAC" ]; then
+      echo "host $EQUIPO {
+	hardware ethernet $MAC;
+	deny booting;
+     }" >> $FILE_CONF
+    fi
+  done
+}
+
+Reiniciar_Servicio() {
+  echo "   - Reiniciamos el servicio $SERVICIO:"
+  #/etc/init.d/$SERVICIO restart
+  /etc/init.d/$SERVICIO stop > /dev/null
+  /etc/init.d/$SERVICIO start > /dev/null
+  if [ $? -ne 0 ]; then
+    echo "      * Error al iniciar el servicio."
+    echo "      * Comprueba el fichero de configuración creado: $FILE_CONF"
+  else
+    echo "      * Servicio reiniciado correctamente."
+  fi
+  echo ""
+}
+
+Vaciar_Leases() {
+  echo "   - Vaciamos la lista de equipos de $FILE_LEASES:"
+  echo "# The format of this file is documented in the dhcpd.leases(5) manual page.
+# This lease file was written by isc-dhcp-4.1.1-P1
+" > $FILE_LEASES
+}
+
+do_start(){
+  echo ""
+  echo " Configurando dhcp.conf para denegar conexiones ... "
+  echo " ---------------------------------------------------"
+  Obtener_Leases
+  Obtener_ListaNegra
+
+  Crear_Configuracion
+  Vaciar_Leases
+  Reiniciar_Servicio
+}
+
+do_stop(){
+  echo ""
+  echo " Configurando dhcp.conf para aceptar todas las conexiones ... "
+  echo " -------------------------------------------------------------"
+
+  Configuracion_Base
+  Reiniciar_Servicio
+}
+
+# -----------------------------------------------------------------------------
+case "$1" in
+  start)
+	do_start
+	;;
+  stop)
+	do_stop
+	;;
+  restart)
+	do_start
+	;;
+  status)
+	;;
+  *)
+	N=/etc/init.d/$NAME
+	echo ""
+	echo "Usage: $N {start|stop|status}" >&2
+	echo ""
+	exit 1
+	;;
+esac
+
+exit 0
+
+

Property changes on: scripts/nfs/dhcp-server-denegar/trunk/dhcp-server-denegar
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/nfs/dhcp-server-denegar/trunk/readme2
===================================================================
--- scripts/nfs/dhcp-server-denegar/trunk/readme2	(nonexistent)
+++ scripts/nfs/dhcp-server-denegar/trunk/readme2	(revision 529)
@@ -0,0 +1,24 @@
+El script en cuestión (para el que no lo haya visto antes), es para ejecutarlo en el servidor NFS, y nos permite denegar el acceso al sistema (denegando la petición de IP), a aquellos equipos que queramos y/o desconozcamos.
+
+Tiene un parámetro para su ejecuión, que puede ser:
+
+	- start: para ejecutar este script, y por lo tanto activar la denegación de servicio, por MAC: ./dhcp-server-denegar start
+
+	- stop: para para este script, y por lo tanto volver al estado que se tenía antes de lanzarlo por primera vez. Este estado base se almacena en el fichero /etc/dhcp/dhcpd.conf.base, y debe contener de forma mínima las líneas para la conexión vía ldap (que por si acaso las tenéis también dentro del propio script): ./dhcp-server-denegar stop
+
+Aquí cuento como funciona el script:
+
+- pcs.leases --> Se crea este archivo desde el contenido de /var/lib/dhcp/dhcpd.leases. Se coloca en la misma ubicación donde se ejecuta el script. Contiene los equipos que han echo petición de IP por dhcp, es decir, equipos que no tiene puesta ip-fija, y equipos que no están dados de alta en LDAP.
+	* Los equipos dados de alta en LDAP, se dan por equipos conocidos, y por lo tanto se les permite la conexión, aunque también se les puede denegar el acceso introduciendo su MAC (manualmente) en el fichero de Lista Negra.
+	* Los equipos que tienen asignada ip-fija (manualmente), basta con localizarlos e introducir (manualmente) su MAC en el fichero de Lista Negra (si se les quiere quitar el acceso, claro).
+
+- /etc/dhcp/hosts.accept (Lista Blanca) --> introduce el usuario manualmente las mac's que desea PERMITIR. Después el script si tiene mas datos del dhcpd.leases (pcs.leases), lo completa.
+
+- /etc/dhcp/hosts.deny (Lista Negra) --> introduce el usuario manualmente las mac's que desea DENEGAR. Después el script busca en el dhcpd.leases (pcs.leases), y si hay mas equipos conectados por esa vía, y no están ni en la lista blanca (admitidos), ni en la lista negra (denegados), los añade a la lista negra, por precaución.
+
+- El fichero de configuración de isc-dhcp-server (/etc/dhcp/dhcpd.conf), se crea a partir de la configuración base (/etc/dhcp/dhcpd.conf.base), y la denegación de equipos que estén en la Lista Negra (/etc/dhcp/hosts.deny), anteriormente formada.
+
+- Tal como está siempre funcionará aunque esté vacío el dhcpd.leases.
+
+Nota: Aconsejo que si se pone en fucnionamiento este script, aviseis por mensaje de Rayuela, y otro método de lo que se ha realizado, para que los profes interesados pasen por 'taquilla' y se le puedas anotar su MAC en la Lista Blanca.
+
Index: scripts/nfs/dhcp-server-denegar/trunk/readme
===================================================================
--- scripts/nfs/dhcp-server-denegar/trunk/readme	(nonexistent)
+++ scripts/nfs/dhcp-server-denegar/trunk/readme	(revision 529)
@@ -0,0 +1,49 @@
+# Script: dhcp-server-denegar
+# Autor:  Antonio J. Abasolo Sierra
+# Fecha:  Diciembre-2012
+# Lugar de ejecución: servidor NFS
+# ---------------------------------
+
+Este script se encarga de regenerar el fichero de configuración de isc-dhcp-server, situado en /etc/dhcp/dhcpd.conf
+
+Tiene 2 opciones de ejecución:
+	* start: realiza lo aquí escrito.
+	* stop:  anula este script, dejando el servicio dhcp-server, tal como estaba antes.
+
+A groso modo, hace lo siguiente:
+
+- Se crean dos ficheros en la ruta de dicho servicio, que son:
+  * /etc/dhcp/hosts.accept --> lista blanca de equipos conocidos a los que no será cortado su acceso. 
+	Formato: MAC,Nombre
+	00:1c:b3:c4:fe:13,Ponente
+
+  * /etc/dhcp/hosts.denny  --> lista negra de equipos a los que les cortaremos el acceso
+	Formato: MAC,Nombre
+	00:1c:b3:c4:fe:13,InglesP1
+
+- Se crea el fichero 'pcs.leases' (en ruta de ejecución del script), 
+con las mac's del fichero /var/lib/dhcp/dhcpd.leases --> Solo estarán las MAC's de equipos 
+que no esten dados de alta en LDAP, y que no tengan puesta ip fija (manualmente).
+	Formato: MAC,IP,Nombre
+	00:1c:b3:c4:fe:13,172.23.23.5,InglesP1
+
+- El script regenere el fichero /etc/dhcp/dhcp.conf, con
+las líneas básicas de ldap (almacenadas previamente en el fichero /etc/dhcp/dhcpd.conf.base, 
+y las denegaciones de mac's del fichero de lista-negra-macs: /etc/dhcp/hosts.deny
+
+- El fichero de lista-negra-macs se obtiene del quitarle al fichero pcs.leases, las mac's del fichero de lista-blanca
+	* /etc/dhcp/hosts.deny = (pcs.leases - /etc/dhcp/hosts.accept)
+
+- Se reinicia el servicio correspondiente:
+	* /etc/init.d/isc-dhcp-server stop
+	* /etc/init.d/isc-dhcp-server start
+
+- Pones un cron (crontab) en el servidor NFS para que ejecute dicho script cada X tiempo, por ej. cada 5 min.
+	Ejemplo:
+	05 * * * 1-5 /root/dhcp-server-denegar start
+
+*****
+Posibles Mejoras:
+- Limpiar el fichero /var/lib/dhcp/dhcpd.leases
+
+
Index: scripts/nfs/limpiar-puppet/limpia-puppet.man
===================================================================
--- scripts/nfs/limpiar-puppet/limpia-puppet.man	(nonexistent)
+++ scripts/nfs/limpiar-puppet/limpia-puppet.man	(revision 529)
@@ -0,0 +1,19 @@
+.\" Manpage for limpia-puppet.
+.\" Contact adminies.valledeljerte@edu.juntaextremadura.net to correct errors or typos.
+.TH man 8 "21 Jun 2012" "1.0" "limpia-puppet man page"
+.SH NAME
+limpia-puppet \- Este programa limpia la siguiente información de nodos puppet con una determinada antiguedad: facts, nodes y certificados.
+.SH SYNOPSIS
+limpia-puppet [antiguedad en dias]
+.SH DESCRIPTION
+limpia-puppet hace limpieza en el servidor puppet borrando los certificados y la información de ficheros facts y nodes de máquinas con una determinada antiguedad en días.
+El programa permite indicar la antiguedad como parámentro. Si no se indica el número de días de antiguedad, borrará la información de equipos que lleven más de 100 días sin actualizarse. Use limpia-puppet.debian(8).
+.SH OPTIONS
+Puede especificarse como parámetro la antiguedad en días. Si no se introduce ninguna antiguedad se borrará la información de equipos que lleven sin actualizarse más de 100 días.
+.SH SEE ALSO
+limpia-puppet.debian(8)
+.SH BUGS
+No known bugs.
+.SH AUTHOR
+Esteban M. Navas Martín (adminies.valledeljerte@edu.juntaextremadura.net)
+
Index: scripts/nfs/limpiar-puppet/puppetlast
===================================================================
--- scripts/nfs/limpiar-puppet/puppetlast	(nonexistent)
+++ scripts/nfs/limpiar-puppet/puppetlast	(revision 529)
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+import glob
+import os
+
+from datetime import datetime, timedelta
+
+
+def humanize(delta):
+    days = delta.days
+    hours = delta.seconds / 3600
+    minutes = delta.seconds % 3600 / 60
+    seconds = delta.seconds % 3600 % 60
+    
+    str = ""
+    tStr = ""
+    if days > 0:
+        if days == 1: tStr = "day"
+        else: tStr = "days"
+        str = str + "%s %s" %(days, tStr)
+    elif hours > 0:
+        if hours == 1: tStr = "hour"
+        else: tStr = "hours"
+        str = str + "%s %s" %(hours, tStr)
+    elif minutes > 0:
+        if minutes == 1: tStr = "min"
+        else: tStr = "mins"           
+        str = str + "%s %s" %(minutes, tStr)
+    elif seconds > 0:
+        if seconds == 1: tStr = "sec"
+        else: tStr = "secs"
+        str = str + "%s %s" %(seconds, tStr)
+    return str
+
+
+times = []
+for f in glob.glob("/var/lib/puppet/yaml/facts/*"):
+    host = f.split('/')[-1].replace('.yaml', '')
+    last = datetime.now() - datetime.fromtimestamp(os.stat(f)[9])
+    times.append((humanize(last), host, last))
+
+RED = '\033[91m'
+GREEN = '\033[92m'
+RESET = '\033[0m'
+
+for time in sorted(times, key=lambda x: x[2]):
+    if time[2] < timedelta(hours=0.5):
+        print GREEN, "%10s ago: %s" % (time[0], time[1]), RESET
+    else:
+        print RED, "%10s ago: %s" % (time[0], time[1]), RESET

Property changes on: scripts/nfs/limpiar-puppet/puppetlast
___________________________________________________________________
Added: svn:executable
Index: scripts/nfs/limpiar-puppet/limpia-puppet
===================================================================
--- scripts/nfs/limpiar-puppet/limpia-puppet	(nonexistent)
+++ scripts/nfs/limpiar-puppet/limpia-puppet	(revision 529)
@@ -0,0 +1,58 @@
+#!/bin/bash
+# ------------------------------------------------------------
+# script:  limpia-puppet
+# Author:  Esteban M. Navas Martín
+# Date:    21-06-2012
+# Ver:     21-06-2012   
+# Requisito: Tener instalado puppetlast
+#
+# Purpose: This program cleans the following puppet node info: facts, node and certificate
+#
+# Copyright (c) 2012 Esteban M. Navas Martín <adminies.valledeljerte@edu.juntaextremadura.net>. All rights reserved.
+
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#   You should have received a copy of the GNU General Public License
+#   along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Comprobamos si se han introducido la antiguedad como parámetro
+if [ $# -lt 1 ]; then
+   ANTIGUEDADMAX="100"
+else 
+   ANTIGUEDADMAX=$1
+fi
+
+/usr/local/sbin/puppetlast > /tmp/puppetlast.tmp
+
+while read LINEA; do
+ LINEACOMPLETA=$LINEA
+ set -- $LINEACOMPLETA
+ ANTIGUEDAD=$2
+ DIAS=$3
+ HOST=$5
+ ARCHIVO=$HOST".yaml"
+
+ if [ "$ANTIGUEDAD" -ge "$ANTIGUEDADMAX" ] && [ "$DIAS"="days" ]; then
+     echo $DIAS
+     echo "Borrando certificado puppet $ARCHIVO"
+     puppetca --clean $HOST
+     if [ -f /var/lib/puppet/yaml/facts/$ARCHIVO ]; then
+        rm /var/lib/puppet/yaml/facts/$ARCHIVO
+        echo "Borrando /var/lib/puppet/yaml/facts/$ARCHIVO con $ANTIGUEDAD días de antiguedad."
+     fi
+     if [ -f /var/lib/puppet/yaml/node/$ARCHIVO ]; then
+        rm /var/lib/puppet/yaml/node/$ARCHIVO
+        echo "Borrando /var/lib/puppet/yaml/node/$ARCHIVO con $ANTIGUEDAD días de antiguedad."
+     fi
+ fi 
+done < /tmp/puppetlast.tmp
+
+rm -f /tmp/puppetlast.tmp

Property changes on: scripts/nfs/limpiar-puppet/limpia-puppet
___________________________________________________________________
Added: svn:executable
Index: scripts/nfs/quotas/setgroupquota.list
===================================================================
--- scripts/nfs/quotas/setgroupquota.list	(nonexistent)
+++ scripts/nfs/quotas/setgroupquota.list	(revision 529)
@@ -0,0 +1,15 @@
+%product setgroupquota
+%system all
+%copyright 2012 by Esteban M. Navas
+%vendor Esteban M. Navas
+%description Establecer quotas de disco para alumnos por grupos
+%version 0.1
+%readme README
+%license LICENSE
+%requires perl
+%requires libnet-ldap-perl
+%requires quota
+
+f 0755 root root /usr/local/sbin/setgroupquota setgroupquota
+
+

Property changes on: scripts/nfs/quotas/setgroupquota.list
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/nfs/quotas/README
===================================================================
--- scripts/nfs/quotas/README	(nonexistent)
+++ scripts/nfs/quotas/README	(revision 529)
@@ -0,0 +1,38 @@
+WHAT IS setgroupquota?
+
+	setgroupquota es un paquete que nos va a permitir establecer cuotas de disco para 
+	los usuarios de un grupo determinado. Ésto facilita el trabajo de los administradores,
+	ya que podemos asignar una quota de disco para alumnos, para profesores o para los 
+	alumnos de un grupo determinado de clase.
+	 
+	Este script perl busca los usuarios que pertenecen al grupo en el servidor de ldap.
+
+	setgroupquota instala el script perl setgroupquota en el directorio /usr/local/sbin
+
+	setgroupquota solicita que el usuario introduzca tres datos:
+
+	* La password del administrador de ldap para consultar los datos.
+	* El grupo al que le queremos asignar una quota de disco: teachers, students, E-1A ...
+	* La quota de disco que queremos asignar (número de bloques).
+
+	El nombre del grupo que hay que introducir es cualquiera de los que tengamos creado
+	en ldap.
+
+
+
+COPYRIGHT AND LICENSE INFO
+
+	setgroupquota is Copyright 2012 by Esteban M Navas Martín, All Rights Reserved.
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2, or (at your option)
+	any later version.
+ 
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+    
+	You should have received a copy of the GNU General Public License
+	along with this program. If not, see <http://www.gnu.org/licenses/>.

Property changes on: scripts/nfs/quotas/README
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/nfs/quotas/LICENSE
===================================================================
--- scripts/nfs/quotas/LICENSE	(nonexistent)
+++ scripts/nfs/quotas/LICENSE	(revision 529)
@@ -0,0 +1,12 @@
+License
+
+setgroupquota is free software; you can redistribute it and/or modify 
+it under the terms of the GNU General Public License as published 
+by the Free Software Foundation; either version 3, or (at your option) 
+any later version.
+
+setgroupquota is distributed in the hope that it will be useful, 
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+
+See the GNU General Public License for more details. 

Property changes on: scripts/nfs/quotas/LICENSE
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/nfs/quotas/setgroupquota
===================================================================
--- scripts/nfs/quotas/setgroupquota	(nonexistent)
+++ scripts/nfs/quotas/setgroupquota	(revision 529)
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+# ------------------------------------------------------------
+# script:  setgroupquota
+# Author:  Esteban M. Navas Mart�n
+# Date:    06-03-2011
+# Ver: 	   06-03-2011	
+# Requisito: Instalar el m�dulo de perl libnet-ldap-perl
+#
+# Purpose: This program set the quota for the users in a group class
+#
+# Copyright (c)	2012 Esteban M. Navas Mart�n <adminies.valledeljerte@edu.juntaextremadura.net>. All rights reserved.
+
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#   You should have received a copy of the GNU General Public License
+#   along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+use Net::LDAP;
+
+my $ldapserver = ldap;
+my $baseGroup = "ou=Group,dc=instituto,dc=extremadura,dc=es";
+my $basePeople = "ou=People,dc=instituto,dc=extremadura,dc=es";
+my $groupClass;
+my $groupQuota;
+
+print "Introduce la contrase�a del administrador de ldap: ";
+system "stty -echo"; # disable echo
+chomp (my $pass = <STDIN>);
+system "stty echo"; # enable echo
+print "\n";
+
+print "Introduce el nombre del grupo de clase: ";
+chomp (my $groupClass = <STDIN>);
+
+if (! $groupClass) {
+    print "$0: Debe especificar el nombre del grupo\n";
+    print "Ejemplos: E-1A, E-1B, B-1A, disabled...\n";
+    exit 1;
+}
+
+print "Introduce la quota para el grupo de clase $groupClass: ";
+chomp (my $groupQuota = <STDIN>);
+
+if (! $groupQuota) {
+    print "$0: Debe especificar la quota que quiere asignar al grupo\n";
+    exit 1;
+}
+
+
+$ldap = Net::LDAP->new("$ldapserver") or die "$@";
+
+# Abrimos una conexi�n
+$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
+
+# Obtenemos los miembros del grupo elegido
+$mesg = $ldap->search(base=> $baseGroup, filter =>"(&(objectclass=posixGroup)(groupType=school_class)(cn=$groupClass))");
+
+$mesg->code && die $mesg->error;
+
+foreach $entry ($mesg->entries) {
+	my(@members) = $entry->get_value('memberUid');
+
+	foreach $memberUid (@members) {
+	   
+		$mesg2 = $ldap->search(base=> $basePeople, filter =>"(&(objectclass=posixAccount)(uid=$memberUid))");
+
+		$mesg2->code && die $mesg2->error;
+
+        @users = $mesg2->entries;
+
+		foreach $user (@users) {
+               	$uid = $user->get_value('uid');
+               	$uidNumber = $user->get_value('uidNumber');
+	    		print "Asignando quota de $groupQuota a $uid con uidNumber $uidNumber -> groupClass: $groupClass\n";
+	    		system ("setquota $uidNumber $groupQuota $groupQuota 0 0 /home");
+		}
+   	}
+}
+
+print "Proceso concluido.\n\n";
+
+$ldap->unbind;

Property changes on: scripts/nfs/quotas/setgroupquota
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/portatiles/ExportaCerts/trunk/Leeme.txt
===================================================================
--- scripts/portatiles/ExportaCerts/trunk/Leeme.txt	(nonexistent)
+++ scripts/portatiles/ExportaCerts/trunk/Leeme.txt	(revision 529)
@@ -0,0 +1,21 @@
+EXPORTACERTS
+================
+
+CONTENIDO:
+
+ExportaCerts.py: Programa principal. Obtiene datos de certificados de /var/lib/puppet/yaml/facts y del servidor LDAP, generando dos archivos csv
+que posteriormente pueden ser importados en la aplicacion CONTROLIES para dar de alta de forma automatizada los portatiles de los centros.
+Debeis modificar la IP que hace referencia al ldap, en la linea l = LdapConnection ("172.23.36.5"), y poner la de vuestro LDAP.
+
+Asimismo, debeis añadir la linea "by * read" en /etc/ldap/slapd.conf del LDAP para permitir obtener el campo "employeeID" de forma anonima, como
+sigue:
+
+access to attrs=employeeNumber,jpegPhoto
+        by dn="cn=replica,dc=instituto,dc=extremadura,dc=es" read
+        by dn="cn=interno,dc=instituto,dc=extremadura,dc=es" read
+        by * read
+
+
+LdapConnection.py: Utilidades para conectar y buscar en LDAP.
+
+
Index: scripts/portatiles/ExportaCerts/trunk/LdapConnection.py
===================================================================
--- scripts/portatiles/ExportaCerts/trunk/LdapConnection.py	(nonexistent)
+++ scripts/portatiles/ExportaCerts/trunk/LdapConnection.py	(revision 529)
@@ -0,0 +1,128 @@
+##############################################################################
+# -*- coding: utf-8 -*-
+# Project:     ControlIES
+# Module:    LdapConnection.py
+# Purpose:     Connection with ldap server
+# Language:    Python 2.5
+# Date:        7-Feb-2011.
+# Ver:        7-Feb-2011.
+# Author:    Manuel Mora Gordillo
+# Copyright:    2011 - Manuel Mora Gordillo <manuito @no-spam@ gmail.com>
+#
+# ControlIES is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# ControlIES is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with ControlAula. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import ldap
+
+class LdapConnection(object):
+    
+    def __init__(self):
+        self.host = "172.23.36.5"
+        self.user = "admin"
+        self.passwd = "Sta1987teleco"
+
+    def setCredentials(self,host,user,passwd):
+        self.host = host
+        self.user = user
+        self.passwd = passwd
+
+    def validation(self):
+        if self.host == "":
+            return "host"
+
+        if self.user == "":
+            return "user"
+
+        if self.passwd == "":
+            return "password"
+
+        return "OK"
+
+    def process(self):
+        val = self.validation()
+            
+        if val != "OK":
+            return val
+
+        auth = self.connect()
+        return auth
+
+    def connect2(self):
+        ## first you must open a connection to the server
+        try:
+	    self.connection = ldap.open("172.23.36.5")
+	    self.connection.protocol_version = ldap.VERSION3
+        except ldap.LDAPError, e:
+	    print e
+
+
+    def search2(self,baseDN,filter,retrieveAttributes):
+        searchScope = ldap.SCOPE_SUBTREE
+        try:
+            ldap_result_id = self.connection.search(baseDN+ ",dc=instituto,dc=extremadura,dc=es", ldap.SCOPE_SUBTREE, filter, retrieveAttributes)
+            result_set = []
+            while 1:
+                result_type, result_data = self.connection.result(ldap_result_id, 0)
+                if (result_data == []):
+                    break
+                else:
+                    if result_type == ldap.RES_SEARCH_ENTRY:
+                        result_set.append(result_data)
+            return result_set
+        except ldap.LDAPError, e:
+	    print e
+
+    def getConnect(self):
+        return self.connection
+        
+    def add(self,baseDN,attr):
+        try:
+            self.connection.add_s(baseDN+",dc=instituto,dc=extremadura,dc=es", attr)
+            
+        except ldap.ALREADY_EXISTS:
+            logging.getLogger().debug("LDAP already exists %s" % (baseDN))
+        except ldap.OPERATIONS_ERROR:
+            logging.getLogger().debug("LDAP operation error %s" % (baseDN))
+        except ldap.NO_SUCH_OBJECT:
+            logging.getLogger().debug("LDAP no such object %s" % (baseDN))
+            
+        return True
+
+    def modify(self,baseDN,attr):
+        try:
+            self.connection.modify_s(baseDN+",dc=instituto,dc=extremadura,dc=es", attr)
+        except ldap.OPERATIONS_ERROR:
+            print "error"
+        except ldap.NO_SUCH_OBJECT:
+            print "no_such_object"
+        except Exception,e:
+            print e
+            
+        return True
+        
+    def delete(self,baseDN):
+        try:
+            self.connection.delete_s(baseDN+",dc=instituto,dc=extremadura,dc=es")
+            
+        except ldap.OPERATIONS_ERROR:
+            print "error"
+        except ldap.NO_SUCH_OBJECT:
+            print "no_such_object"
+            
+        return True
+        
+        
+    def close(self):
+        self.connection.unbind()
+        
+
Index: scripts/portatiles/ExportaCerts/trunk/ExportaCerts.py
===================================================================
--- scripts/portatiles/ExportaCerts/trunk/ExportaCerts.py	(nonexistent)
+++ scripts/portatiles/ExportaCerts/trunk/ExportaCerts.py	(revision 529)
@@ -0,0 +1,92 @@
+##############################################################################
+# -*- coding: utf-8 -*-
+# Project:      EnciendeEquipos
+# Module:    	EnciendeEquipos.py
+# Purpose:     	Wakes up classrom servers in an IES environment
+# Language:    	Python 2.5
+# Date:        	23-Feb-2011.
+# Ver:         	23-Feb-2011.
+# Author:    	Francisco Mendez Palma
+# Copyright:    2011 - Francisco Mendez Palma <fmendezpalma @no-spam@ gmail.com>
+#
+# EnciendeEquipos is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# EnciendeEquipos is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+##############################################################################
+
+from LdapConnection import LdapConnection
+#import NetworkUtils
+import sys
+import os
+import datetime
+
+
+l = LdapConnection()
+l.connect2()
+
+#leer archivos 
+path = '/var/lib/puppet/yaml/facts/'
+listing = os.listdir(path)
+
+# ficheros de intercambio para profesores y alumnos
+fp = open('./profesores.csv','w')
+fa = open('./alumnos.csv','w')
+for infile in listing:
+    # leer primero datos del archivo de certificado
+    f = open(path+infile)
+    quienes="alumno"
+    registro=""
+    line = f.readline()
+    serialnumber=""
+    marcamodelo="1"
+    username=infile.replace(".santaeulalia.yaml", "")
+    while line:
+        if "serialnumber" in line:
+            serialnumber=line.replace("    serialnumber: ", "")
+            serialnumber=serialnumber.replace(" ", "")
+            serialnumber=serialnumber.replace("\n","")
+            serialnumber=serialnumber.replace("serialnumber:", "")
+        if "manufacturer" in line:
+            manufacturer=line.replace("    manufacturer: ", "")
+            manufacturer=manufacturer.replace(" ", "")
+            manufacturer=manufacturer.replace('"',"")
+            manufacturer=manufacturer.replace("\n","")
+            marcamodelo="2"
+            if "Acer" in manufacturer:
+                marcamodelo="1"
+        line = f.readline()
+
+    # buscar en ldap datos restantes. Inicialmente, suponemos que se trata de un alumno
+    filter="(homeDirectory=/home/alumnos/" + username + ")"
+    search  = l.search2("ou=People",filter,["cn","employeeNumber","homeDirectory"])
+    # si no, es un profe
+    if not search:
+        quienes="profesor"
+        filter="(homeDirectory=/home/profesor/" + username + ")"
+        search  = l.search2("ou=People",filter,["cn","employeeNumber","homeDirectory"])
+    # añadir datos a linea
+    if search:
+        uid=search[0][0][1]['employeeNumber'][0]
+        logname=search [0][0][1]["cn"][0]
+        if serialnumber:
+            registro=registro+"PORTATIL, '"+serialnumber+"', "+marcamodelo + ", "
+            now = datetime.datetime(2009,5,5)
+            str_now = now.date().isoformat()
+            registro=registro+"HISTORICO, " + str_now + "', '" + uid + "', 2, '', 1, '" + username + "', '" + logname + "'"
+            if quienes=="alumno":
+                fa.write(registro+'\n')
+            else:
+                fp.write(registro+'\n')
+            print registro
+    f.close()
+fp.close()
+fa.close()
+    #print registro
+
+
Index: scripts/portatiles/wicd2nm/wicd2nm.py
===================================================================
--- scripts/portatiles/wicd2nm/wicd2nm.py	(nonexistent)
+++ scripts/portatiles/wicd2nm/wicd2nm.py	(revision 529)
@@ -0,0 +1,136 @@
+#!/usr/bin/env python 
+# -*- coding: utf-8 -*-
+##############################################################################
+# Project:     Wicd -> Network Manager
+# Module:     wicdnm.py
+# Purpose:     AConvert wicd configuration files to NM system configurations
+# Language:    Python 2.5
+# Date:        24-May-2011.
+# File Version:    24-May-2011
+# Author:    José L. Redrejo Rodríguez
+# Copyright:    2011 - José L. Redrejo Rodríguez       <jredrejo @nospam@ debian.org>
+#
+
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# wicd2nm.py is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with this file. If not, see <http://www.gnu.org/licenses/>.
+#
+# Important:    WHEN EDITING THIS FILE, USE TABS TO INDENT - NOT SPACES!
+#
+# More important: This script has been done with the public schools laptops
+# of Extremadura in mind. It WILL fail in some cases that are not possible
+# in these laptops, so don't use it as a general wicd to nm configuration 
+# conversion script, because there are not contempled case uses.
+##############################################################################
+
+import ConfigParser
+import os.path 
+from os import makedirs,chmod
+from uuid import uuid1
+
+wicd_config='/etc/wicd/wireless-settings.conf'
+#wicd_config='/tmp/wireless-settings.conf'
+nm_config_dir='/etc/NetworkManager/system-connections'
+#nm_config_dir='/tmp/nm'
+
+def parse_wicd():
+    Connections=[]
+    my_parser = ConfigParser.ConfigParser()
+    archivo_config = my_parser.read(wicd_config)
+    redes=my_parser.sections()
+    opciones=('passphrase','bssid','essid','enctype','automatic','key')
+    for red in redes:
+        try:
+            red_info=my_parser.items(red)
+            datos_red={}
+            for i in red_info:
+                if i[0] in opciones:
+                    datos_red[i[0]]=i[1]
+                   
+            Connections.append(datos_red)
+        except:
+            pass #red mal construida
+    
+    return Connections           
+
+def string2ascii(cadena):
+    ascii=''
+    for car in cadena:
+        ascii +=str(ord(car)) + ";"
+    return ascii 
+
+
+def crea_nm_configs(conexiones):
+    if not os.path.exists(nm_config_dir): makedirs(nm_config_dir)
+    for con in conexiones:
+        my_parser=ConfigParser.RawConfigParser()
+        my_parser.add_section('connection')       
+        my_parser.add_section('ipv4')
+        my_parser.add_section('ipv6')
+        my_parser.add_section('802-11-wireless')
+        my_parser.set('connection','uuid',uuid1())
+        my_parser.set('connection','timestamp','1305878385')        
+        my_parser.set('connection','type','802-11-wireless')
+        my_parser.set('802-11-wireless','mode','infrastructure')
+                
+        my_parser.set('ipv4','method','auto')
+        my_parser.set('ipv6','method','ignore')
+        
+        try:
+            id='Auto ' + con['essid']
+            my_parser.set('connection','id',id) 
+            my_parser.set('802-11-wireless','seen-bssids',con['bssid'] + ';')
+            my_parser.set('802-11-wireless','ssid',string2ascii(con['essid']))
+            if 'passphrase' in con.keys():
+                contras=con['passphrase']
+            elif 'key' in con.keys():
+                contras=con['key']
+            else:
+                contras=None
+            
+            if 'enctype' in con.keys():
+                my_parser.set('802-11-wireless','security','802-11-wireless-security')
+                my_parser.add_section('802-11-wireless-security')
+                if con['enctype'] == 'wep-passphrase' or con['enctype'] == 'wep-hex':
+                    my_parser.set('802-11-wireless-security','key-mgmt','none')
+                    my_parser.set('802-11-wireless-security','auth-alg','open')
+                    my_parser.set('802-11-wireless-security','wep-key0',contras) 
+                    if con['enctype'] == 'wep-passphrase' and ('passphrase' in con.keys()):
+                        tipo=2
+                    else:
+                        tipo=1
+                    my_parser.set('802-11-wireless-security','wep-key-type',tipo)                
+
+                elif con['enctype'] == 'wpa-psk' or con['enctype'] == 'wpa':
+                    my_parser.set('802-11-wireless-security','key-mgmt','wpa-psk')
+                    my_parser.set('802-11-wireless-security','psk',contras) 
+
+                else:
+                    continue #caso no contemplado
+            else: #autenticación sin contraseña
+                pass #no necesita '802-11-wireless-security'
+            
+                
+            configfile=open(os.path.join(nm_config_dir,id), 'wb')
+            my_parser.write(configfile)
+            configfile.close()
+            chmod(os.path.join(nm_config_dir,id),0600)  
+                         
+            
+        except:
+            continue #hay algún dato mal en la configuración, así que tomamos la siguiente
+
+
+
+if __name__ == '__main__':
+    conn=parse_wicd()
+    crea_nm_configs(conn)
+    #creamos archivo vacío de testigo de haber ejecutado el script
+    if not os.path.exists('/var/wicd2nm2'): open('/var/wicd2nm2', 'w').close() 
Index: scripts/ldap/fotos-ldap/trunk/fotostoldap/LICENSE
===================================================================
--- scripts/ldap/fotos-ldap/trunk/fotostoldap/LICENSE	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/fotostoldap/LICENSE	(revision 529)
@@ -0,0 +1,12 @@
+License
+
+fotostoldap is free software; you can redistribute it and/or modify 
+it under the terms of the GNU General Public License as published 
+by the Free Software Foundation; either version 3, or (at your option) 
+any later version.
+
+fotostoldap is distributed in the hope that it will be useful, 
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+
+See the GNU General Public License for more details. 
Index: scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap.list
===================================================================
--- scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap.list	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap.list	(revision 529)
@@ -0,0 +1,15 @@
+%product fotostoldap
+%copyright 2010 by Esteban M. Navas
+%vendor Esteban M. Navas
+%description Incorpora a cada usuario de ldap su foto, si se encuentra disponible.
+%version 0.3
+%readme README
+%license LICENSE
+%requires perl
+%requires libnet-ldap-perl
+%requires libarchive-zip-perl
+%requires perlmagick
+%replaces fotostoldap
+
+f 755 root root /usr/bin/fotostoldap fotostoldap
+
Index: scripts/ldap/fotos-ldap/trunk/fotostoldap/README
===================================================================
--- scripts/ldap/fotos-ldap/trunk/fotostoldap/README	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/fotostoldap/README	(revision 529)
@@ -0,0 +1,48 @@
+WHAT IS FOTOSTOLDAP?
+
+fotostoldap es un script perl que comprueba qué usuarios no tienen foto 
+en ldap e inserta dicha foto desde el fichero de exportación de alumnos 
+obtenido de Rayuela, si se encuentra disponible.
+
+El atribujo jpegPhoto de ldap sirve para almacenar una o varias 
+imágenes de un usuario usando el formato JPEG File Interchange Format [JFIF].
+El tamaño límite de este atributo es de 250000 bytes. No obstante, se 
+debería guardar lo más pequeño que sea posible, puesto que el tamaño puede influir 
+en el rendimiento. Por este motivo, en la versión 0.3 incorporamos el 
+ajuste de tamaño.
+
+CHANGELOG
+
+* fotostoldap-0.2 -- Versión inicial.
+
+* fotostoldap-0.3 -- Esta versión convierte la foto del alumno a .jpg y 
+la redimensiona a 80x80 pixeles.
+
+
+REQUIREMENTS.
+
+Requiere tener instalados los siguientes paquetes:
+* perl.
+* libnet-ldap-perl.
+* libarchive-zip-perl.
+* perlmagick.
+
+HOW DO I USE FOTOSTOLDAP?
+
+Uso: fotostoldap <path archivo Exportacion Datos Alumnado>
+
+
+COPYRIGHT AND LICENSE INFO
+
+    fotostoldap is Copyright 2010 by Esteban M Navas Martín, All Rights Reserved.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2, or (at your option)
+    any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
Index: scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap
===================================================================
--- scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap	(revision 529)
@@ -0,0 +1,123 @@
+#!/usr/bin/perl
+#
+# Programa perl para subir las fotos de los alumnos al servidor ldap del centro
+# Toma como parámetro el fichero de exportación de datos de alumnado.
+# Sube a ldap las fotos que se encuentran en el fichero de exportación de datos 
+# de aquellos alumnos que no tengan foto en ldap.
+#
+# Esteban M. Navas
+# IES Valle del Jerte
+# Fecha creación: 30/09/2010
+# Fecha última modificación: 05/11/2010
+
+# Requisito: Instalar los módulos de perl libnet-ldap-perl, 
+# libarchive-zip-perl y perlmagick
+
+use Archive::Extract;
+use Net::LDAP;
+use Image::Magick;
+
+# Declaramos las funciones
+sub trim($);
+
+my $ldapserver = "ldap";
+my $archivo;
+
+if ($#ARGV != 0) {
+   print "Uso: fotostoldap <Path Archivo Exportacion Datos Alumnado.zip>\n\n";
+   print "Ejemplo: fotostoldap ExportacionDatosAlumnado.zip\n";
+   exit;
+} 
+
+if ( -e $ARGV[0] ) {
+   $archivo = $ARGV[0];
+}
+else {
+   print "El archivo $ARGV[0] no existe\n";
+   exit;
+}
+
+print "Descomprimiendo $archivo...\n";
+
+my $ae = Archive::Extract->new(archive => $archivo);
+my $ok = $ae->extract( to => '/tmp' ) or die $ae->error;
+my $outdir  = $ae->extract_path;
+my $files  = $ae->files;
+
+print "$archivo descomprimido en $outdir\n\n";
+
+print "Introduce la contraseña del administrador de ldap: ";
+system "stty -echo"; # disable echo
+chomp (my $pass = <STDIN>);
+system "stty echo"; # enable echo 
+
+$ldap = Net::LDAP->new("$ldapserver") or die "$@";
+
+# Abrimos una conexión
+$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
+
+# Obtenemos la lista de usuarios sin foto
+$mesg = $ldap->search(filter=>"(&(objectClass=inetOrgPerson)(!(jpegPhoto=*)))", base=>"ou=People,dc=instituto,dc=extremadura,dc=es");
+@entries = $mesg->entries;
+
+# Procesamos cada usuario sin foto
+foreach $entry (@entries) {
+   my $employeeNumber = $entry->get_value(employeeNumber);
+   my $cn = $entry->get_value(cn);
+
+   # Obtenemos el nombre del fichero
+   my $fichero = qx{ls $outdir | grep -iE '^$employeeNumber.[a-z]{3}'};
+
+   # Importante: Quitar los espacios que nos da la salida del qx{}
+   $fichero = trim($fichero);
+
+   # Si hay una foto para el alumno ...
+   if ( $fichero ) {
+      my $tmp; 
+      my $photo;
+
+      my $imagen = $outdir . "/" . $fichero;
+
+      # Cambiamos el tamaño y el formato de la imagen
+      my $nuevaimagen = Image::Magick->new;
+
+      $nuevaimagen->Read( filename => $imagen );
+      $nuevaimagen->Set( Gravity => 'Center' );
+      $nuevaimagen->Resize( geometry => '80x80' );
+      $nuevaimagen->Extent( geometry => '80x80' );
+
+      my $imagenretocada = $outdir . "/" . $employeeNumber . ".jpg";
+
+      $nuevaimagen->Write( "$imagenretocada" );
+
+      open(FILE, "$imagenretocada");
+      binmode(FILE);
+      $photo .= $tmp while (sysread FILE, $tmp, 1024); 
+      close(FILE);
+
+      $mesg = $ldap->modify($entry->dn(), add => {'jpegPhoto'=>$photo});
+
+      print "Foto $imagenretocada añadida a $cn\n";
+	  
+      # Borramos la image retocada
+      unlink $imagenretocada;
+   }
+}
+
+# Cerramos la conexión
+$ldap->unbind;
+
+# Borramos los archivos extraidos en el directorio $outdir
+foreach $file (@$files) {
+    unlink "$outdir/$file";
+}
+
+print "Proceso concluido.\n\n";
+
+sub trim($) 
+{
+   my $string = shift;
+   $string =~ s/^\s+//;
+   $string =~ s/\s+$//;
+   return $string;
+}

Property changes on: scripts/ldap/fotos-ldap/trunk/fotostoldap/fotostoldap
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap.list
===================================================================
--- scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap.list	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap.list	(revision 529)
@@ -0,0 +1,15 @@
+%product updatefotosldap
+%copyright 2010 by Esteban M. Navas
+%vendor Esteban M. Navas
+%description Incorpora a cada usuario de ldap su foto desde el fichero ExportacionDatosAlumnado.zip, si se encuentra disponible.
+%version 0.1
+%readme README
+%license LICENSE
+%requires perl
+%requires libnet-ldap-perl
+%requires libarchive-zip-perl
+%requires perlmagick
+%replaces updatefotosldap
+
+f 755 root root /usr/bin/updatefotosldap updatefotosldap
+
Index: scripts/ldap/fotos-ldap/trunk/updatefotosldap/README
===================================================================
--- scripts/ldap/fotos-ldap/trunk/updatefotosldap/README	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/updatefotosldap/README	(revision 529)
@@ -0,0 +1,46 @@
+WHAT IS UPDATEFOTOSLDAP?
+
+updatefotosldap es un script perl que cambia las fotos de los alumnos 
+en ldap por las que se encuentran en el fichero ExportacionDatosAlumnado.zip,
+ajustando su tamaño a 80x80 px y modificando el formato a .jpg
+
+El atribujo jpegPhoto de ldap sirve para almacenar una o varias 
+imágenes de un usuario usando el formato JPEG File Interchange Format [JFIF].
+El tamaño límite de este atributo es de 250000 bytes. No obstante, se 
+debería guardar lo más pequeño que sea posible, puesto que el tamaño puede influir 
+en el rendimiento. Por este motivo, en la versión 0.3 incorporamos el 
+ajuste de tamaño.
+
+CHANGELOG
+
+* updatefotosldap-0.1 -- Versión inicial. Convierte la foto del alumno a .jpg y 
+la redimensiona a 80x80 pixeles.
+
+
+REQUIREMENTS.
+
+Requiere tener instalados los siguientes paquetes:
+* perl.
+* libnet-ldap-perl.
+* libarchive-zip-perl.
+* perlmagick.
+
+HOW DO I USE UPDATEFOTOSLDAP?
+
+Uso: updatefotosldap <path archivo Exportacion Datos Alumnado>
+
+
+COPYRIGHT AND LICENSE INFO
+
+    updatefotosldap is Copyright 2010 by Esteban M Navas Martín, All Rights Reserved.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2, or (at your option)
+    any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
Index: scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap
===================================================================
--- scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap	(revision 529)
@@ -0,0 +1,129 @@
+#!/usr/bin/perl
+#
+# Programa perl para subir y/o actualizar las fotos de los alumnos en servidor ldap del centro.
+# Toma como parámetro el fichero de exportación de datos de alumnado.
+# Actualiza las fotos de los alumnos en el servidor de ldap desde el fichero ExportacionDatosAlumnado.zip  
+# 
+#
+# Esteban M. Navas
+# IES Valle del Jerte
+# Fecha creación: 09/11/2010
+# Fecha última modificación: 12/11/2010
+
+# Requisito: Instalar los módulos de perl libnet-ldap-perl, 
+# libarchive-zip-perl y perlmagick
+
+use Archive::Extract;
+use Net::LDAP;
+use Image::Magick;
+
+# Declaramos las funciones
+sub trim($);
+
+my $ldapserver = "ldap";
+my $archivo;
+
+if ($#ARGV != 0) {
+   print "Uso: updatefotosldap <Path Archivo Exportacion Datos Alumnado.zip>\n\n";
+   print "Ejemplo: updatefotosldap ExportacionDatosAlumnado.zip\n";
+   exit;
+} 
+
+if ( -e $ARGV[0] ) {
+   $archivo = $ARGV[0];
+}
+else {
+   print "El archivo $ARGV[0] no existe\n";
+   exit;
+}
+
+print "Descomprimiendo $archivo...\n";
+
+my $ae = Archive::Extract->new(archive => $archivo);
+my $ok = $ae->extract( to => '/tmp' ) or die $ae->error;
+my $outdir  = $ae->extract_path;
+my $files  = $ae->files;
+
+print "$archivo descomprimido en $outdir\n\n";
+
+print "Introduce la contraseña del administrador de ldap: ";
+system "stty -echo"; # disable echo
+chomp (my $pass = <STDIN>);
+system "stty echo"; # enable echo 
+
+$ldap = Net::LDAP->new("$ldapserver") or die "$@";
+
+# Abrimos una conexión
+$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
+
+# Obtenemos la lista de usuarios 
+$mesg = $ldap->search(filter=>"(&(objectClass=inetOrgPerson))", base=>"ou=People,dc=instituto,dc=extremadura,dc=es");
+@entries = $mesg->entries;
+
+# Procesamos cada usuario 
+foreach $entry (@entries) {
+   my $employeeNumber = $entry->get_value(employeeNumber);
+   my $cn = $entry->get_value(cn);
+
+   # Obtenemos el nombre del fichero
+   my $fichero = qx{ls $outdir | grep -iE '^$employeeNumber.[a-z]{3}'};
+
+   # Importante: Quitar los espacios que nos da la salida del qx{}
+   $fichero = trim($fichero);
+
+   # Si hay una foto para el alumno ...
+   if ( $fichero ) {
+      my $tmp; 
+      my $photo;
+
+      # Y si el alumno tiene foto en el servidor ldap...
+      if ( $entry->get_value( jpegPhoto ) ne '') {
+         # ...la borramos de allí
+         $mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto' => ''});
+      }
+
+      my $imagen = $outdir . "/" . $fichero;
+
+      # Cambiamos el tamaño y el formato de la imagen
+      my $nuevaimagen = Image::Magick->new;
+
+      $nuevaimagen->Read( filename => $imagen );
+      $nuevaimagen->Set( Gravity => 'Center' );
+      $nuevaimagen->Resize( geometry => '80x80' );
+      $nuevaimagen->Extent( geometry => '80x80' );
+
+      my $imagenretocada = $outdir . "/" . $employeeNumber . ".jpg";
+
+      $nuevaimagen->Write( "$imagenretocada" );
+
+      open(FILE, "$imagenretocada");
+      binmode(FILE);
+      $photo .= $tmp while (sysread FILE, $tmp, 1024); 
+      close(FILE);
+
+      $mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto'=>$photo});
+
+      print "Foto $imagenretocada de $cn actualizada.\n";
+	  
+      # Borramos la image retocada
+      unlink $imagenretocada;
+   }
+}
+
+# Cerramos la conexión
+$ldap->unbind;
+
+# Borramos los archivos extraidos en el directorio $outdir
+foreach $file (@$files) {
+    unlink "$outdir/$file";
+}
+
+print "Proceso concluido.\n\n";
+
+sub trim($) 
+{
+   my $string = shift;
+   $string =~ s/^\s+//;
+   $string =~ s/\s+$//;
+   return $string;
+}

Property changes on: scripts/ldap/fotos-ldap/trunk/updatefotosldap/updatefotosldap
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ldap/fotos-ldap/trunk/updatefotosldap/LICENSE
===================================================================
--- scripts/ldap/fotos-ldap/trunk/updatefotosldap/LICENSE	(nonexistent)
+++ scripts/ldap/fotos-ldap/trunk/updatefotosldap/LICENSE	(revision 529)
@@ -0,0 +1,12 @@
+License
+
+updatefotosldap is free software; you can redistribute it and/or modify 
+it under the terms of the GNU General Public License as published 
+by the Free Software Foundation; either version 3, or (at your option) 
+any later version.
+
+updatefotosldap is distributed in the hope that it will be useful, 
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+
+See the GNU General Public License for more details. 
Index: scripts/ldap/update-fotos-ldap/trunk/actualizafotosldap.py
===================================================================
--- scripts/ldap/update-fotos-ldap/trunk/actualizafotosldap.py	(nonexistent)
+++ scripts/ldap/update-fotos-ldap/trunk/actualizafotosldap.py	(revision 529)
@@ -0,0 +1,266 @@
+#!/usr/bin/python -tt
+# -*- coding: utf-8 -*-
+# Project:	update-fotos-ldap
+# Module:	actualizafotoldap.py
+# Purpose:	Actualiza fotos de alumnos en el directorio LDAP desde datos de Rayuela 
+# Language:	Python 2.5
+# Date:		03-Feb-2011.
+# Ver:		07-Feb-2011.
+# Author:	Francisco Mora Sánchez
+# Copyright:	2011 - Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# update-fotos-ldap is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# update-fotos-ldap is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with update-fotos-ldap. If not, see <http://www.gnu.org/licenses/>.
+
+""" Programa para actualizar las fotos de los alumnos
+en el servidor ldap a partir del fichero de alumnos generado por
+Rayuela. Tambien depura las entradas del grupo students, eliminando
+aquellas membresias cuyos uids no están en la rama People, si lo queremos.
+
+Necesita paquetes instalados python python-ldap python-imaging
+
+En los servidores de terminales está todo instalado excepto python-ldap
+que se carga ejecutando la orden como superusuario:
+
+apt-get install python-ldap
+
+Uso: crearemos una carpeta donde copiaremos este programa y además 
+pondremos el ZIP generado por Rayuela, denominado
+ExportacionDatosAlumnado.zip, ejecutaremos el script pasando como 
+parámetros como mínimo la contraseña del administrador ldap, por defecto
+el programa establece el URI ldap de nuesto servidor ldap y la ruta a la 
+carpeta con el ZIP de rayuela en la propia carpeta.
+
+Existe un parámetro, denominado --depurastudents {on|off} el cual si lo 
+establecemos a on, eliminará del grupos students de ldap aquellas entradas
+que no tienen un uid en el grupo People, normalmente son residuos de
+uids de alumnos que ya no están en el centro.
+
+OJO: Realizar copias de seguridad de ldap antes de ejecutar el script...
+
+
+Francisco Mora Sánchez
+IES Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+
+"""
+
+import sys,os,shutil,zipfile,ldap,Image,glob,time,copy
+import ldap.modlist as modlist
+
+# Set debugging level
+#ldap.set_option(ldap.OPT_DEBUG_LEVEL,255)
+#ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
+#ldapmodule_trace_level = 1
+#ldapmodule_trace_level = 0
+#ldapmodule_trace_file = sys.stderr
+
+def descomprime_zip_en_directorio(fichero, carpeta):
+	"""Funcion que dado un fichero zip lo descomprime en la
+	carpeta indicada."""
+	if os.path.exists(carpeta):
+		shutil.rmtree(carpeta)
+	os.mkdir(carpeta, 0777)
+	zfobj = zipfile.ZipFile(fichero)
+	for name in zfobj.namelist():
+		if name.endswith('/'):
+			os.mkdir(os.path.join(carpeta, name))
+		else:
+			outfile = open(os.path.join(carpeta, name), 'wb')
+			outfile.write(zfobj.read(name))
+			outfile.close()
+			
+def lee_parametros(lista,params):
+	"""Funcion que crea un diccionario para leer el valor de los 
+	parametros que se pasan en la linea de comandos."""
+	for i in range(1,len(lista)):
+		if lista[i][:2] == "--":
+			#veamos si tiene valor
+			if i+1 < len(lista) and lista[i+1] <> "--":
+				#estamos en un parametro y valor
+				params[lista[i][2:]] = lista[i+1]
+
+def conecta_a_ldap(uri,contra):
+	""" Conexión al servidor ldap
+	"""
+	try:
+		usuario_admin = "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es"
+		#conexion_ldap = ldap.initialize(uri,trace_level=ldapmodule_trace_level,trace_file=ldapmodule_trace_file)
+		conexion_ldap = ldap.initialize(uri)
+		conexion_ldap.protocol_version=ldap.VERSION3
+		conexion_ldap.bind_s(usuario_admin, contra)
+	except ldap.LDAPError, e:
+		return None
+	
+	return conexion_ldap
+
+def desconecta_de_ldap(conexion_ldap):
+	""" Desconectar del servidor ldap
+	"""
+	conexion_ldap.unbind_s()
+
+def buscar_en_ldap(conexion_ldap, filtro, atributos, baseDN = "ou=People,dc=instituto,dc=extremadura,dc=es", alcance = ldap.SCOPE_SUBTREE):
+	## Realiza una consulta al servidor ldap, utilizando un filtro y delvolviendo unos atributos, la salida es una lista de tuplas
+	try:
+		return conexion_ldap.search_s(baseDN, alcance, filtro, atributos)
+	except:
+		pass
+	else:
+		return []
+
+def existeArchivoImagen(archivo):
+	""" Funcion que determina si existe un archivo 
+	"""
+	return os.path.exists(archivo)
+
+def main():
+	params = {}
+	lista = sys.argv
+	lee_parametros(lista,params)
+	#comprobaremos las combinaciones de parametros en linea de comandos
+	if not params.has_key("contra"):
+		print 'uso: ./actualizafotosldap.py --contra contraseña_ldap [--depurastudents {on,off}] [--urildap ldaps://servidor_ldap:puerto] [--ruta rutaalarchivozipderayuela]'
+		sys.exit(1)
+	if not params.has_key("urildap"):
+		print "No se ha establecido el servidor ldap, usando por defecto 'ldaps://ldap:636'"
+		params["urildap"] = "ldaps://ldap:636"
+	if not params.has_key("ruta"):
+		print "No se ha establecido la ruta del archivo, usando por defecto './ExportacionDatosAlumnado.zip'"
+		params["ruta"] = "./ExportacionDatosAlumnado.zip"
+	if not params.has_key("depurastudents"):
+		print "No se ha establecido depurastudents, no se eliminarán alumnos del grupo students que no existan en la rama People"
+		params["depurastudents"] = "off"
+	
+	#Emite mensajes
+	print "Los valores pasado son los siguientes:"
+	print "URI Servidor ldap: ",params["urildap"]
+	print "Ruta al archivo: ",params["ruta"]
+	print "Eliminar alumn@s del grupo students no existentes en People:",params["depurastudents"]
+	print "Si estás conforme, pulsa intro, sino pulsa CTRL+C y aborta la ejecución"
+	raw_input()
+	#Comprobemos la existencia del archivo
+	if not os.path.exists(params["ruta"]):
+		print params['ruta']," no existe"
+		exit(2)
+	print "Intentando la conexión al URI de ldap '"+params["urildap"]+"'"
+
+	conexion_ldap = conecta_a_ldap(params["urildap"],params["contra"])
+		
+	if conexion_ldap == None:
+		print "Error en la conexión al servidor ldap:",params["urildap"],"revise nombre servidor y/o contraseña"
+		exit(3)
+	
+	#busqueda de los alumnos(pertenecen al grupo students
+	resultado_busqueda_alumnos = buscar_en_ldap(conexion_ldap, 'member=*', ['member','memberUid'],baseDN="cn=students,ou=Group,dc=instituto,dc=extremadura,dc=es")
+
+	if resultado_busqueda_alumnos is None:
+		print "No existen alumnos que pertenezcan al grupo students..."
+		exit(4)
+
+	print "Descomprimiendo ZIP de alumnos de rayuela en la carpeta actual..."
+	descomprime_zip_en_directorio(params["ruta"], "temp")
+
+			
+	alumnos = resultado_busqueda_alumnos[0][1]["memberUid"]
+	encontrados = 0
+	alumnos_a_borrar_grupo_students = []
+	print "Total de alumnos encontrados",len(alumnos)
+	print "Procesando alumnos..."
+	separador = os.sep
+	tipos_imagen = ['.jpg', '.png', '.jpeg' , '.bmp', '.tiff','.jpg']
+	alumnos_sin_foto = []
+	for alumno in alumnos:
+		datos_alumno = buscar_en_ldap(conexion_ldap, 'uid='+alumno, ['cn','uid','employeeNumber'])
+		if len(datos_alumno) == 0:
+			alumnos_a_borrar_grupo_students.append(alumno)
+		else:
+			encontrados += 1
+			try:
+				if not datos_alumno[0][1].has_key('employeeNumber'):
+					print "El alumno",alumno,"no tiene atributo 'employeeNumber'... saltando"
+					continue
+				if not datos_alumno[0][1].has_key('uid'):
+					print "El alumno",alumno,"no tiene atributo 'uid'... saltando"
+					continue
+				
+				nie = datos_alumno[0][1]['employeeNumber'][0]
+				print "Actualizando foto del alumno",datos_alumno[0][1]['cn'][0],'Nie:',nie
+				archivo_imagen_sin_tipo = '.'+separador+'temp'+separador+nie
+				encontrada_foto = False
+				for patron in tipos_imagen:
+					archivo_imagen = archivo_imagen_sin_tipo+patron
+					if existeArchivoImagen(archivo_imagen):
+						print "encontrado archivo de imagen",archivo_imagen
+						encontrada_foto = True
+						break
+				if not encontrada_foto:
+					alumnos_sin_foto.append(datos_alumno[0][1]['cn'][0]+' Nie:'+nie)
+					print "alumno sin archivo de imagen"
+					continue
+					
+				foto = Image.open(archivo_imagen)
+				if (not foto.format == 'JPEG'):
+					foto.save('foto', 'JPEG')
+					foto = Image.open('foto')
+				foto.thumbnail((80, 100), Image.ANTIALIAS)
+				foto.save('foto', 'JPEG')
+				uid = datos_alumno[0][1]['uid'][0]
+				dn='uid='+uid+',ou=People,dc=instituto,dc=extremadura,dc=es'
+				atributos = [ (ldap.MOD_DELETE,'jpegPhoto',None) ]
+				conexion_ldap.modify_s(dn,atributos)
+				atributos = [ (ldap.MOD_ADD,'jpegPhoto',open('foto',"rb").read()) ]
+				conexion_ldap.modify_s(dn,atributos)
+			except ldap.LDAPError,e:
+				pass  
+				#puede pasar que no exista el nie o bien no tenga atributo, pero 
+				#la acción es ignorar los errores...
+
+	os.remove('foto')	
+	
+	print "Se han procesado",encontrados,"alumn@s..."
+	print ""
+	print ""
+	print "No se han encontrado las fotos de estos",len(alumnos_sin_foto),"alumn@s"
+	print "Estos son los alumno@s sin foto:"
+	for asinfoto in alumnos_sin_foto:
+		print asinfoto
+		
+	print ""
+	print ""
+	print "No se han encontrado en la rama People",len(alumnos)-encontrados,"alumn@s"
+	if params["depurastudents"] == "on" and len(alumnos) > encontrados:
+		print ""
+		print ""
+		print "Procediendo al borrado de alumnos del grupo students no existentes en la rama People"
+		resultado_busqueda_alumnos_modificado = copy.deepcopy(resultado_busqueda_alumnos)
+		for aborrar in alumnos_a_borrar_grupo_students:
+			print "Borrando membresía de students para el alumno no existente ...",aborrar
+			#Eliminamos de la lista de memberUid ese alumno
+			resultado_busqueda_alumnos_modificado[0][1]['memberUid'].remove(aborrar)
+			#Eliminamos de la lista de member ese alumno
+			resultado_busqueda_alumnos_modificado[0][1]['member'].remove('uid='+aborrar+',ou=People,dc=instituto,dc=extremadura,dc=es')
+	
+		print "Ejecutando modificación en el árbol ldap..."
+		dn = 'cn=students,ou=Group,dc=instituto,dc=extremadura,dc=es'
+		ldif = modlist.modifyModlist(resultado_busqueda_alumnos[0][1],resultado_busqueda_alumnos_modificado[0][1])
+		conexion_ldap.modify_s(dn,ldif)
+
+	print ""
+	print ""
+	print "Eliminando carpeta temporal..."
+	shutil.rmtree("temp")
+	print "Desconectando del servidor ldap '"+params["urildap"]+"'"
+	desconecta_de_ldap(conexion_ldap)
+
+
+if __name__ == '__main__':
+	main()

Property changes on: scripts/ldap/update-fotos-ldap/trunk/actualizafotosldap.py
___________________________________________________________________
Added: svn:executable
Index: scripts/ldap/limitar-https/trunk/deny-https
===================================================================
--- scripts/ldap/limitar-https/trunk/deny-https	(nonexistent)
+++ scripts/ldap/limitar-https/trunk/deny-https	(revision 529)
@@ -0,0 +1,174 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          deny-https
+# Required-Start:    $all
+# Required-Stop:
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Denegar el tráfico https (puerto 443)
+# Description:       Deniega la navegación web segura, no controlada por squid.
+### END INIT INFO
+#----------------------------------------------------------------------------------------
+# Creado por: Antonio J. Abasolo Sierra (Mayo-2010)
+# Modificado por:
+#    - Francisco Rodrigo López (Oct-2011)
+#    - Antonio J. Abasolo Sierra (Mar-2012)
+#----------------------------------------------------------------------------------------
+# Controla la activación/desactivación de reglas iptables
+# que cortan el tráfico https para todas las webs externas, e ips del centro
+# que indiquemos en su fichero de configuración.
+#
+# Depende del fichero de configuración "/etc/squid/acl/deny_https".
+#
+# La regla "iptables-restore < /etc/network/iptables" se pone por seguridad:
+# ya que se ejecuta tras eliminar las reglas, en cuyo momento la situación
+# ya debería ser la misma que plantea esta línea. 
+# Con esto también nos garantizamos que partimos y dejamos la situación justo 
+# donde estaba antes de iniciar/parar este script, por lo que es muy importante 
+# el contenido de dicho archivo, el cual se aconseja que esté tal cual nos lo dejaron, sin cambios.
+#
+# Se incluye cortar el tráfico facebook mediante rangos. Si no se desea cortar basta con comentar
+# la línea donde se encuentra la llamada a dicha función.
+# También se puede dar permiso en facebook a un rango de ip's, y denegarselo al resto.
+#
+#----------------------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------------------
+# Ubicación del ejecutable de iptables
+IPTABLES=/sbin/iptables
+
+# Ubicación del fichero con web https a cortar
+DENY_HTTPS=/etc/squid/acl/deny_https
+
+RED=`ifconfig eth0 | grep Bcast | cut -f2 -d: | cut -f1 -d.`
+
+#iptables -A FORWARD -p tcp --dport 443 -d WEB -j DROP
+#iptables -A FORWARD -p tcp --dport 443 -s IP -j DROP
+
+# Bail out if no iptables binary or no configuration
+[ -x ${IPTABLES} -a "$DENY_HTTPS" ] || exit 0
+
+clear
+
+#----------------------------------------------------------------------------------------
+do_status() {
+    echo ""
+    echo "ESTADO ACTUAL DE LAS REGLAS ..."
+    echo "----------------------------------------------------"
+    $IPTABLES -L
+    echo "----------------------------------------------------"
+}
+
+#----------------------------------------------------------------------------------------
+do_start() {
+  echo "ACTIVANDO reglas para controlar el tráfico https:"
+  echo "-------------------------------------------------"
+  iptables-restore < /etc/network/iptables
+  egrep -v '#|^$' $DENY_HTTPS | awk '{print $1}' | while read LINEA; do
+    if [ `echo $LINEA | grep $RED` ]; then OPCION="-s"; else OPCION="-d"; fi
+    echo "  * Denegando https a $LINEA ..."
+    $IPTABLES -A FORWARD -p tcp --dport 443 $OPCION $LINEA -j REJECT 2> /dev/null
+  done
+
+  #aceptar_facebook --> hay que definir el rango de ip's al que se le permite (RANGO_LIBRE): ver código
+  cortar_facebook
+  cortar_twitter
+
+  echo "  ----------------------------------------------"
+  echo "  * EL TRAFICO HTTPS ESTA RESTRINGIDO."
+  echo ""
+}
+
+do_stop() {
+  echo "DESACTIVANDO reglas para controlar el tráfico https:"
+  echo "-------------------------------------------------"
+  egrep -v '#|^$' $DENY_HTTPS | awk '{print $1}' | while read LINEA; do
+    if [ `echo $LINEA | grep $RED` ]; then OPCION="-s"; else OPCION="-d"; fi
+    echo "  * Eliminando regla https para $LINEA ..."
+    $IPTABLES -D FORWARD -p tcp --dport 443 $OPCION $LINEA -j REJECT 2> /dev/null
+  done
+  echo "  * Eliminando reglas https para facebook (rangos) ..."
+  echo "  * Eliminando reglas https para twitter (rangos) ..."
+  iptables-restore < /etc/network/iptables
+  echo "  -----------------------------------------------"
+  echo "  * EL TRAFICO HTTPS ESTA LIBERADO."
+  echo ""
+}
+
+do_restart() {
+  do_stop
+  do_start
+}
+
+cortar_facebook() {
+  iptables -N FACEBOOK
+
+  echo "  * Denegando https para facebook (rangos) ..."
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 31.13.64.0-31.13.127.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 50.76.50.112-50.76.50.127 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 65.204.104.128-65.204.104.143 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.92.180.48-66.92.180.63 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.93.78.176-66.93.78.183 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.199.37.136-66.199.37.143 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 67.200.105.48-67.200.105.51 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.0.0-69.171.242.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.0.0-69.171.63.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.224.0-69.171.255.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 74.119.76.0-74.119.79.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 184.50.162.0-184.50.162.255 --dport 443 -j FACEBOOK
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 443 -j FACEBOOK
+
+  iptables -A FACEBOOK -j REJECT
+}
+
+aceptar_facebook() {
+  iptables -N AFACEBOOKSI
+  RANGO_LIBRE=172.x1.y1.z1-172.x2.y2.z2
+  echo "  * Activando salida para facebook para $RANGO_LIBRE ... "
+  iptables -I FORWARD 1 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 443 -j AFACEBOOKSI
+  iptables -I FORWARD 2 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j AFACEBOOKSI
+  iptables -I FORWARD 3 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 69.171.0.0-69.171.242.255 --dport 443 -j AFACEBOOKSI
+  iptables -I FORWARD 4 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 184.50.162.0-184.50.162.255 --dport 443 -j AFACEBOOKSI
+  iptables -I FORWARD 5 -m tcp -p tcp -m iprange --src-range $RANGO_LIBRE -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 443 -j AFACEBOOKSI
+
+  iptables -A AFACEBOOKSI -j ACCEPT
+}
+
+cortar_twitter() {
+  iptables -N TWITTER
+  echo "  * Denegando https para twitter (rangos) ..."
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 192.133.76.0-192.133.79.255 --dport 443 -j TWITTER
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.59.148.0-199.59.151.255 --dport 443 -j TWITTER
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.16.156.0-199.16.159.255 --dport 443 -j TWITTER
+  iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 199.96.56.0-199.96.63.255 --dport 443 -j TWITTER
+
+  iptables -A TWITTER -j REJECT
+}
+
+#----------------------------------------------------------------------------------------
+case "$1" in
+    start)
+	do_start
+#	do_status
+        ;;
+    stop)
+	do_stop
+#	do_status
+        ;;
+    restart|force-reload)
+	do_restart
+#	do_status
+        ;;
+    status)
+        do_status
+        ;;
+    *)
+        echo "Usage: $0 {start|stop|restart|force-reload|status}"
+        exit 2
+        ;;
+esac
+exit 0
+#----------------------------------------------------------------------------------------
+

Property changes on: scripts/ldap/limitar-https/trunk/deny-https
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ldap/limitar-https/trunk/limitar_https.class
===================================================================
--- scripts/ldap/limitar-https/trunk/limitar_https.class	(nonexistent)
+++ scripts/ldap/limitar-https/trunk/limitar_https.class	(revision 529)
@@ -0,0 +1,28 @@
+class limitar_https {
+
+   file { "/etc/network/iptables":
+ 	owner => root, group=>root, mode=>644,
+	source => "puppet:///puppet.educarex.es/files/iptables",
+	notify => Exec["configurar-https"]
+   }
+
+   file { "/etc/squid/acl/deny_https":
+ 	owner => root, group=>root, mode=>644,
+	ensure => exists,
+	notify => Exec["configurar-https"],
+   }
+
+   file { "/etc/init.d/deny-https":
+ 	owner => root, group=>root, mode=>755,
+	source => "puppet:///puppet.educarex.es/files/deny-https",
+	notify => Exec["configurar-https"],
+   }
+
+    exec { "configurar-https":
+	command => "/usr/sbin/update-rc.d deny-https start 31 2 3 4 5 . stop 01 0 1 6 . ; /etc/init.d/deny-https start",
+	require => File["/etc/init.d/deny-https"],
+     	unless => "/bin/ls /etc/rc2.d/S31deny-https",
+        refreshonly => true,
+    }
+
+}
Index: scripts/ldap/limitar-https/trunk/deny_https
===================================================================
--- scripts/ldap/limitar-https/trunk/deny_https	(nonexistent)
+++ scripts/ldap/limitar-https/trunk/deny_https	(revision 529)
@@ -0,0 +1,17 @@
+# Lista de web's https prohibidas para todos
+www.tuenti.com
+www.imo.im
+www.badoo.com
+www.twitter.com
+www.hi5.com
+www.suresome.com
+www.bebo.com
+www.ning.com
+www.pornhub.com
+
+199.59.148.82
+62.171.224.11
+
+#facebook.com
+#www.facebook.com
+#www.meebo.com

Property changes on: scripts/ldap/limitar-https/trunk/deny_https
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: scripts/ldap/limitar-https/trunk/iptables
===================================================================
--- scripts/ldap/limitar-https/trunk/iptables	(nonexistent)
+++ scripts/ldap/limitar-https/trunk/iptables	(revision 529)
@@ -0,0 +1,34 @@
+# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
+*filter
+:INPUT ACCEPT [8704860:9777713158]
+:FORWARD ACCEPT [55619:8261637]
+:OUTPUT ACCEPT [6140664:1872966901]
+-A FORWARD -p tcp -m tcp --dport 445 -j LOG --log-prefix "win-gusano" 
+-A FORWARD -p tcp -m tcp --dport 445 -j DROP 
+-A FORWARD -p tcp -m tcp --dport 137 -j LOG --log-prefix "win-gusano" 
+-A FORWARD -p tcp -m tcp --dport 137 -j DROP 
+-A FORWARD -p tcp -m tcp --dport 139 -j LOG --log-prefix "win-gusano" 
+-A FORWARD -p tcp -m tcp --dport 139 -j DROP 
+COMMIT
+# Completed on Wed Feb 13 10:54:53 2008
+# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
+*nat
+:PREROUTING ACCEPT [39355:4796594]
+:POSTROUTING ACCEPT [59346:4231171]
+:OUTPUT ACCEPT [54652:39474654]
+-A PREROUTING -d 127.0.0.1 -i eth0 -p tcp -j ACCEPT 
+-A PREROUTING -d IP-LDAP -i eth0 -p tcp -j ACCEPT 
+-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 
+-A PREROUTING -i eth0 -p tcp -m tcp --dport 110 -j DNAT --to-destination 217.124.183.2
+-A PREROUTING -i eth0 -p tcp -m tcp --dport 465 -j DNAT --to-destination 217.124.183.2
+COMMIT
+# Completed on Wed Feb 13 10:54:53 2008
+# Generated by iptables-save v1.3.6 on Wed Feb 13 10:54:53 2008
+*mangle
+:PREROUTING ACCEPT [8787237:9789063292]
+:INPUT ACCEPT [8704860:9777713158]
+:FORWARD ACCEPT [55619:8261637]
+:OUTPUT ACCEPT [6156510:1874092901]
+:POSTROUTING ACCEPT [6196283:1881228538]
+COMMIT
+# Completed on Wed Feb 13 10:54:53 2008
